0. Pod相关定义
Pod:[Pod | Kubernetes](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/) |
Pod Template:[PodTemplate | Kubernetes](https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-template-v1/) |
1. 基本概念
调度的基本单位,包含1个和多个容器。
Pod内,容器共享IP和Volume。
若Pod内容器执行完成,Pod会被终止。
尽量改造成前台应用,可通过Supervisor工具辅助修改。
2. 静态容器
仅能运行在特定Node的Pod,不能通过API管理,不能通过ReplicationController、Deployment、DaemonSet关联,不能通过kubelet
健康检查。
2种创建方式:
-
配置文件:
kubelet
配置staticPodPath
,然后将Pod定义文件放入该目录下,重启kubelet
服务 -
HTTP:
kubelet
启动配置--manifest-url
,定期从该URL下载Pod定义文件
3. 共享Volume
Pod中多容器共享Volume,可使用静态Volume,也可以通过PVC+StorageClass+PV动态绑定Volume。
4. 配置Pod:ConfigMap
可通过YAML文件或kubectl
创建,以键值对方式,值为字符串。
典型用途:
-
生成容器内的环境变量
-
设置容器启动命令的启动参数
- 定义中的
env.valueFrom.configMapKeyRef
或envFrom.configMapRef
,设置ConfigMap的name
和所需的key
- 定义中的
-
被设置为Volume挂载
volumes
中指定configMap
类型,并设置ConfigMap的name
,将key
作为文件名,以文件形式挂载到容器中
限制:
-
必须在Pod之前创建
-
引用无效的ConfigMap定义,则会被忽略
-
受到Namespace约束
-
不能用于静态Pod
5. 容器内获取Pod信息:Downward API
2中方式将Pod信息注入到容器:环境变量、Volume挂载
ref: https://kubernetes.io/zh/docs/tasks/inject-data-application/
5.1. 环境变量
一些引用可以获取Pod信息,并注入环境变量中,可以在k8s官网查到,如:
-
spec.nodeName
:节点名 -
metadata.name
:Pod名 -
status.podIP
:Pod的IP
Pod定义中,可用下面来设置:
-
valueFrom.fieldRef.fieldPath
:Pod字段 -
valueFrom.resourceFieldRef
:Container字段
5.2. Volume挂载
定义Pod的volumes
时,指定类型为downwardAPI
,然后挂载到Pod中。
和5.1.类似,指定Pod/Container字段(分别为fieldRef.fieldPath
和resourceFieldRef
),还需指定路径path
(作为挂载后的文件名)
6. Pod生命周期与重启策略
生命周期:
-
Pending:API Server已创建Pod,但内部容器未构建完成
-
Running:Pod容器构建完成,且至少一个处于运行、正在启动或正在重启状态
-
Succeeded:Pod所有容器成功执行并退出
-
Failed:Pod所有容器退出,至少一个执行失败
-
Unkwown:状态未知
重启策略:
-
Always:容器失效时重启
- RC、DaemonSet、Deployment等必须设置
-
OnFailure:容器终止且退出码非0,则重启
- Job可设置
-
Never:永不重启
- Job可设置
重启以exp-timeout控制间隔。静态Pod不受重启策略影响。
7. Pod健康度与服务可用检查
三种探针,kubelet
定期执行前2个探针进行健康检查:
-
LivenessProbe:判断是否存活(Running状态),不存活则杀掉,之后由重启策略处理
-
ReadinessProbe:判断是否可用(Ready状态)
-
StartupProbe:慢启动下的探针
探针实现方式:
-
ExecAction(
exec
):容器内执行命令,返回0则成功 -
TCPSocketAction(
tcpSocket
):通过容器IP和端口号,建立TCP连接,若能建立,则成功 -
HTTPGetAction(
httpGet
):通过调用HTTP GET方法,状态码在200~小于400之间,则成功
探针实现需要指定:
-
initialDelaySeconds
:首次探针等待时间 -
timeoutSeconds
:探针超时时间
此外,可通过ReadinessGet扩展ReadinessProbe,自定义Condition状态,当所有条件都为True时才能设置Pod可用。
参考: https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/#pod-readiness-gate