k8s权威指南笔记:Pod(1)

Posted by keys961 on April 1, 2022

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.configMapKeyRefenvFrom.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.fieldPathresourceFieldRef),还需指定路径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