Pod系列 (一) Pod简介
一、基本概念
总的来说Pod包括以下几个方面:
- 最小的部署单元
- 一个Pod中可以包含一个或者多个容器
- 一个Pod中的容器共享网络命令空间
- Pod是短暂的
在k8s集群中最小的管理和部署单元是Pod而非容器,这是为什么呢?
使用docker创建容器,一个容器起一个进程并且在一个容器中运行着一个应用程序;而Pod是多进程设计,运行多个应用程序(一个Pod可由多个容器组成,每个容器运行一个应用程序)。这样也方便管理。
一个Pod中的容器时共享网络的,这是基于Pod中的Pause容器来实现的,下面会对此详细说明。共享网络也带来了同一个Pod中应用交互的方便性。
Pod声明周期时短暂的,因为当Pod所在节点发生故障,该Pod会被转移到其它节点,而新的Pod与之前的Pod无任何关系。
二、Pod实现机制
基于Pod实现的功能,Pod有两个重要的实现机制:
- 共享网络
- 共享存储
同一个Pod之间容器之间共享网络时如何实现的呢?另外就是如果一个Pod所在的节点发生故障,该Pod转移到其它节点,而此时Pod是全新的,那么之前的数据如何获取呢?
1、共享网络
我们知道容器本身通过namespace和group实现相互隔离的,如果想实现共享网络那么必须在同一个namespace中,而Pod就是基于此来实现的。
在一个Pod中可以将容器分为两大部分:Pause容器以及用户的业务容器(container1、container2...),其中Pause是一个特殊的容器,Pod中首先创建的就是Pause容器,当其它的业务容器加入Pod后,会将其加入到Pause中,这样Pause将保留所有容器的状态,通过Pause容器来管理所有Pod中的容器,并且加入到Pause后会共享同一个namespace,也就是多个容器共享Pod的ip和的端口。
2、共享存储
当一个Pod从一个节点调度到另一个节点,它需要读取到之前的数据,那么就需要有一个持久化数据的地方称之为数据卷(volume)。
如上所示,使用数据卷持久化数据,这样就算Pod被重新调配到其它节点也可以获取原来的数据。
三、镜像拉取策略
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx:1.14 imagePullPolicy: Always
可以看到在上面的yaml文件中有imagePullPolicy参数,这个参数表示镜像拉取的策略,有三个选项:
- IfNotPresent 默认值,镜像在宿主机上不存在时才拉取
- Always 每次创建Pod都会重新拉取一次镜像
- Never Pod永远不会主动拉取这个镜像
四、Pod资源限制
Pod的创建需要消耗资源,那么Pod调度过程中如果规定了对应的资源限制,就会调度到符合资源限制的节点上。
apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: db image: mysql env: - name: MYSQL_ROOT_PASSWORD value: "password" resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
Pod中requests和limits的限制调度到符合的节点上。
五、Pod重启机制
apiVersion: v1 kind: Pod metadata: name: test spec: containers: - name: busybox image: busybox:1.28.4 args: - /bin/sh - -c -sleep 36000 restartPolicy: Never
在该Pod的yaml文件中存在restartPolicy参数,表示Pod的重启策略,有三个值可供选择:
- Always 当容器终止退出后,总是重启容器,默认策略
- OnFailure 当容器异常退出时,才重启容器
- Never 当容器终止退出,从不重启容器
六、Pod健康检查
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: containers: - name: liveness image: busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5
Pod中的健康检查有:
- livenessProbe 存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy来进行操作
- readinessProbe 就绪检查,k8s会把Pod从serice endpoints中剔除掉
支持的检查方法有三种:
- http请求 返回200-400范围状态码为成功
- exec 执行shell命令返回状态码是0为成功
- tcpSocket 发起TCP Socket建立成功