Blog

sub:Pod(Kubernetes)

以Pod为中心的Kubernetes资源对象关系图 #

所有的 Kubernetes 资源都直接或者间接地依附在 Pod 之上,所有的Kubernetes 功能都必须通过 Pod 来实现。

Pod与容器 infra容器 静态Pod

Kubernetes 也为每个 Pod 分配了域名,形式是“IP 地址. 名字空间.pod.cluster.local”,但需要把 IP 地址里的 . 改成 - 。比如地址 10.10.1.87,它对应的域名就是 10-10-1-87.default.pod。

From #

12|Pod:如何理解这个Kubernetes里最核心的概念?

Pod与容器

Content #

有的应用运行前需要其他应用帮它初始化一些配置,还有就是日志代理,它必须读取另一个应用存储在本地磁盘的文件再转发出去。这些应用如果被强制分离成两个容器,切断联系,就无法正常工作了。

那么把这些应用都放在一个容器里运行可不可以呢?

当然可以,但这并不是一种好的做法。因为容器的理念是对应用的独立封装,它里面就应该是一个进程、一个应用,如果里面有多个应用,不仅违背了容器的初衷,也会让容器更难以管理。

为了解决这样多应用联合运行的问题,同时还要不破坏容器的隔离,就需要在容器外面再建立一个“收纳舱”,让多个容器既保持相对独立,又能够小范围共享网络、存储等资源,而且永远是“绑在一起”的状态。

所以,Pod 的概念也就呼之欲出了,容器正是“豆荚”里那些小小的“豌豆”,你可以在 Pod 的 YAML 里看到,“spec.containers”字段其实是一个数组,里面允许定义多个容器。

Pod 是 Kubernetes 的核心对象

因为 Pod 是对容器的“打包”,里面的容器是一个整体,总是能够一起调度、一起运行,绝不会出现分离的情况,而且 Pod 属于 Kubernetes,可以在不触碰下层容器的情况下任意定制修改。所以有了 Pod 这个抽象概念,Kubernetes 在集群级别上管理应用就会“得心应手”了。

Kubernetes 让 Pod 去编排处理容器,然后把 Pod 作为应用调度部署的最小单位,Pod 也因此成为了 Kubernetes 世界里的“原子”(当然这个“原子”内部是有结构的,不是铁板一块),基于 Pod 就可以构建出更多更复杂的业务形态了。

Pod管理了多个进程,也可以理解成Linux中的“进程组”,是一组进程组成的应用,Pod也可称为“容器组”。

Viewpoints #

From #

12|Pod:如何理解这个Kubernetes里最核心的概念?

cook:tcpdump

抓取ping包 #

tcpdump -i eth0 icmp

From #

显示详细执行过程(–v=9)

Content #

在使用 kubectl 命令的时候,你还可以加上一个参数 –v=9,它会显示出详细的命令执行过程,清楚地看到发出的 HTTP 请求,比如:

kubectl get pod --v=9

kubectl 客户端等价于调用了 curl,向 8443 端口发送了 HTTP GET 请求,URL 是 /api/v1/namespaces/default/pods。

Viewpoints #

From #

11|YAML:Kubernetes世界里的通用语

YAML(k8s)编写技巧

Content #

Kubernetes 的官方参考文档( https://kubernetes.io/docs/reference/kubernetes-api/

技巧一,kubectl api-resources 命令它会显示出资源对象相应的 API 版本和类型,比如 Pod 的版本是“v1”, Ingress 的版本是“networking.k8s.io/v1”,照着它写绝对不会错。

技巧二,命令 kubectl explain 它相当于是 Kubernetes 自带的 API 文档,会给出对象字段的详细说明,这样我们就不必去网上查找了。比如想要看 Pod 里的字段该怎么写,就可以这样:

kubectl explain pod
kubectl explain pod.metadata
kubectl explain pod.spec
kubectl explain pod.spec.containers

技巧三,kubectl 的两个特殊参数 –dry-run=client 和 -o yaml 前者是空运行,后者是生成 YAML 格式,结合起来使用就会让 kubectl 不会有实际的创建动作,而只生成 YAML 文件。

例如,想要生成一个 Pod 的 YAML 样板示例,可以在 kubectl run 后面加上这两个参数:

kubectl run ngx --image=nginx:alpine --dry-run=client -o yaml

就会生成一个绝对正确的 YAML 文件:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: ngx
  name: ngx
spec:
  containers:
  - image: nginx:alpine
    name: ngx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

接下来你要做的,就是查阅对象的说明文档,添加或者删除字段来定制这个 YAML 了。

...

Kubernetes调用containerd的两种链路

Content #

Docker 把原本单体架构的 Docker Engine 拆分成了多个模块,其中的 Docker daemon 部分就捐献给了 CNCF,形成了 containerd。

containerd 作为 CNCF 的托管项目,自然是要符合 CRI 标准的。但 Docker 出于自己诸多原因的考虑,它只是在 Docker Engine 里调用了 containerd,外部的接口仍然保持不变,也就是说还不与 CRI 兼容。

由于 Docker 的“固执己见”,这时 Kubernetes 里就出现了两种调用链:

  1. 第一种是用 CRI 接口调用 dockershim,然后 dockershim 调用 Docker, Docker 再走 containerd 去操作容器。

  2. 第二种是用 CRI 接口直接调用 containerd 去操作容器。

显然,由于都是用 containerd 来管理容器,所以这两种调用链的最终效果是完全一样的,但是第二种方式省去了 dockershim 和 Docker Engine 两个环节,更加简洁明了,损耗更少,性能也会提升一些。

Viewpoints #

From #

加餐|Kubernetes“弃用Docker”是怎么回事?

Kubernetes 的基本架构

Content #

Kubernetes 采用了现今流行的“控制面 / 数据面”(Control Plane / Data Plane)架构,集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用。

控制面的节点在 Kubernetes 里叫做 Master Node,一般简称为 Master,它是整个集群里最重要的部分,可以说是 Kubernetes 的大脑和心脏。

数据面的节点叫做 Worker Node,一般就简称为 Worker 或者 Node,相当于 Kubernetes 的手和脚,在 Master 的指挥下干活。

Node 的数量非常多,构成了一个资源池,Kubernetes 就在这个池里分配资源,调度应用。因为资源被“池化”了,所以管理也就变得比较简单,可以在集群中任意添加或者删除节点。

Viewpoints #

From #

10|自动化的运维管理:探究Kubernetes工作机制的奥秘

minikube

Content #

–image-mirror-country=cn –registry-mirror=XXX –image-repository=XXX 这些参数用于解决gcr.io镜像无法下载的问题。

From #

构建镜像的构建上下文

Content #

命令行“docker”是一个简单的客户端,真正的镜像构建工作是由服务器端的“Docker daemon”来完成的,所以“docker”客户端就只能把“构建上下文”目录打包上传(显示信息 Sending build context to Docker daemon ),这样服务器才能够获取本地的这些文件。

“构建上下文”其实与 Dockerfile 并没有直接的关系,它其实指定了要打包进镜像的一些依赖文件。而 COPY 命令也只能使用基于“构建上下文”的相对路径,因为“Docker daemon”看不到本地环境,只能看到打包上传的那些文件。

但这个机制也会导致一些麻烦,如果目录里有的文件(例如 readme/.git/.svn 等)不需要拷贝进镜像,docker 也会一股脑地打包上传,效率很低。

为了避免这种问题,你可以在“构建上下文”目录里再建立一个 .dockerignore 文件,语法与 .gitignore 类似,排除那些不需要的文件。

下面是一个简单的示例,表示不打包上传后缀是“swp”“sh”的文件:

# docker ignore
*.swp
*.sh

Viewpoints #

From #

04|创建容器镜像:如何编写正确、高效的Dockerfile