CloudNative 架构

CloudNative|云原生应用架构|云原生架构|容器化架构|微服务架构|平台架构|基础架构


  • 首页

  • 标签

  • 分类

  • 归档

  • k8s离线安装包

  • 搜索

Kubernetes hostpath和local volume区别

发表于 2020-09-16 | 分类于 kubrenetes , volume , pv | | 热度: ℃
字数统计: 1,774 字 | 阅读时长 ≈ 7 分钟

很多人对hostPath volume和local persistent volume的使用场景还存在很多困惑。下面对着两种volume的使用场景、基本的工作机制进行了分析,介绍了使用时的注意事项,并简单介绍local volume manager如何帮助administrator进行local persistent volume的生命周期管理的

hostPath volume存在的问题

过去我们经常会通过hostPath volume让Pod能够使用本地存储,将Node文件系统中的文件或者目录挂载到容器内,但是hostPath volume的使用是很难受的,并不适合在生产环境中使用。

我们先看看hostPath Type有哪些类型:

取值 行为
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate 在给定路径上必须存在的目录。
FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。
File 在给定路径上必须存在的文件。
Socket 在给定路径上必须存在的 UNIX 套接字。
CharDevice 在给定路径上必须存在的字符设备。
BlockDevice 在给定路径上必须存在的块设备。

看起来支持这么多type还是挺好的,但为什么说不适合在生产环境中使用呢?

阅读全文 »

Go Singleflight导致死锁问题分析

发表于 2020-09-14 | 分类于 go , singleflight | | 热度: ℃
字数统计: 2,465 字 | 阅读时长 ≈ 9 分钟

思路排查

Dump 堆栈很重要

线上某个环境发现 S3 上传请求卡住,请求不返回,卡了30分钟,长时间没有发现有效日志。一般来讲,死锁问题还是好排查的,因为现场一般都在。类似于 c 程序,遇到死锁问题都会用 pstack 看一把。golang 死锁排查思路也类似(golang 不适合使用 pstack,因为 golang 调度的是协程,pstack 只能看到线程栈),我们其实是需要知道 S3 程序里 goroutine 的栈状态。golang 遇到这个问题我们有两个办法:

  1. 方法一:条件允许的话,gcore 出一个堆栈,这个是最有效的方法,因为是把整个 golang 程序的内存镜像 dump 出来,然后用 dlv 分析
  2. 方法二:如果你提前开启 net/pprof 库的引用,开启了 debug 接口,那么就可以调用 curl 接口,通过 http 接口获取进程的状态信息

需要注意到,golang 程序和 c 程序还是有点区别,goroutine 非常多,成百上千个 goroutine 是常态,甚至上万个也不稀奇。所以我们一般无法在终端上直接看完所有的栈,一般都是把所有的 goroutine 栈 dump 到文件,然用 vi 打开慢慢分析。

  • 调试这个 core 文件,意图从堆栈里找到些东西,由于堆栈太多了,所以就使用 gorouties -t -u 这个命令,并且把输出 dump 到文件;
  • curl xxx/debug/pprof/goroutine
阅读全文 »

Istio 实战系列(1) - 应用容器对 Envoy Sidecar 的启动依赖问题

发表于 2020-09-10 | 分类于 istio | | 热度: ℃
字数统计: 3,505 字 | 阅读时长 ≈ 14 分钟

故障现象

典型案例:某运维同学反馈:昨天晚上 Istio 环境中应用的心跳检测报 connect reset,然后服务重启了。怀疑是 Istio 环境中网络不稳定导致了服务重启。

该问题的表现是安装了 sidecar proxy 的应用,在启动后的一小段时间内无法通过网络访问 pod 外部的其他服务,例如外部的 HTTP,MySQL,Redis等服务。如果应用没有对依赖服务的异常进行容错处理,该问题还常常会导致应用启动失败。

下面我们以该问题导致的一个典型故障的分析过程为例,对该问题的原因进行说明。

阅读全文 »

Kubernetes securityContext

发表于 2020-09-09 | 分类于 kubrenetes , securityContext | | 热度: ℃
字数统计: 1,398 字 | 阅读时长 ≈ 6 分钟

前言

kubernetes 中的 securityContext 是什么?在什么场景下来使用?第一感觉反正是和安全相关的东西,来自官方定义如下:

安全上下文(Security Context)定义 Pod 或 Container 的特权与访问控制设置。 安全上下文包括但不限于:

  • 自主访问控制(Discretionary Access Control):基于 用户 ID(UID)和组 ID(GID). 来判定对对象(例如文件)的访问权限
  • 安全性增强的 Linux(SELinux): 为对象赋予安全性标签。
  • 以特权模式或者非特权模式运行。
  • Linux 权能: 为进程赋予 root 用户的部分特权而非全部特权。
  • AppArmor:使用程序文件来限制单个程序的权限。
  • Seccomp:限制一个进程访问文件描述符的权限。
  • AllowPrivilegeEscalation:控制进程是否可以获得超出其父进程的特权。 此布尔值直接控制是否为容器进程设置 no_new_privs 标志。 当容器以特权模式运行或者具有 CAP_SYS_ADMIN 权能时,AllowPrivilegeEscalation 总是为 true。
  • readOnlyRootFilesystem:以只读方式加载容器的根文件系统。

以上条目不是安全上下文设置的完整列表 – 请参阅 SecurityContext 了解其完整列表。

关于在 Linux 系统中的安全机制的更多信息,可参阅 Linux 内核安全性能力概述。

上面的定义有些似懂非懂,能不能更加直白的描述下呢?好吧,下面来给大家来一些实际的应用场景来讲解下。

阅读全文 »

Kubernetes in Kuberntes

发表于 2020-06-12 | 分类于 kubrenetes | | 热度: ℃
字数统计: 3,818 字 | 阅读时长 ≈ 16 分钟

KinD 是一个非常轻量级的 Kubernetes 安装工具,他将 Docker 容器当成 Kubernetes 的节点,使用非常方便。既然在 Docker 容器中可以运行 Kubernetes 集群,那么我们自然就会想到是否可以在 Pod 中来运行呢?在 Pod 中运行会遇到哪些问题呢?

在 Pod 中安装 Docker Daemon

KIND 当前依赖于 Docker(尽管他们计划很快支持其他容器运行时,例如podman)。因此,第一步是创建一个容器映像,该映像允许您在 Pod 内运行 Docker守护程序,以便使诸如docker run之类的命令在Pod内运行(又名 Docker-in-Docker 或 DIND )。

Docker-in-Docker 是一个众所周知的问题,并且已经解决了相当一段时间。尽管如此,当尝试在生产 Kubernetes 集群中正确设置 Docker-in-Docker 时,我们仍然遇到很多问题。

阅读全文 »
1…789…22
icyboy

icyboy

109 日志
98 分类
182 标签
RSS
GitHub 微博 知乎
友情链接
  • 张家港水蜜桃
  • 运维开发
  • DevOps
© 2016 — 2021 icyboy | Site words total count: 330.8k
本站访客数:
博客全站共330.8k字