pod
pod是k8s集群最小的调度管理单元,用于来封装容器,实际使用很少创建单个pod,
创建方法
使用命令行创建
kubectl run nginxpod1 --image=harbor.wego.red/library/nginx:1.9.0 --image-pull-policy=IfNotPresent
使用资源清单创建
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: c1
image: harbar.wego.red/library/nginx:1.9.0
pod几个状态
- 挂起(Pending):API Server 已创建 Pod 资源并存入 etcd,但尚未完成调度或仍在从仓库下载镜像。
- 运行中(Running):Pod 已被调度至节点,且所有容器已被 kubelet 创建完成。
- 成功(Succeeded):Pod 中所有容器已成功终止且不会重启。
- 失败(Failed):Pod 中所有容器已终止,且至少有一个容器因失败终止(如非 0 状态退出或被系统禁止)。
- 未知(Unknown):API Server 无法正常获取 Pod 状态信息,通常因无法与所在节点的 kubelet 通信所致。
镜像下载的策略类型
-
Always 每次运行pod都需要下载镜像
-
Never 每次运行pod只使用本地镜像
-
IfNotPresent 每次运行pod,本地有镜像就使用本地镜像,如果本地没有镜像,就去下载
资源限制
-
resources
-
requests 请求资源
-
limits 限制资源
apiVersion: v1 kind: Namespace metadata: name: mem-test
apiVersion: v1 kind: Pod metadata: name: pod5 namespace: mem-test spec: containers:
- name: c1 image: harbro.wego.red/library/stress:latest imagePullPolicy: IfNotPresent resources: requests: memory: "100Mi" limits: memory: "200Mi" command: ["stress"] args: ["--vm","1","--vm-bytes","150M","--vm-hang","1"]
-
pod的创建流程(简)
- 首先是请求,用户通过kubectl等客户端向api server 提交 pod 配置
- api server 将 pod 信息存入etcd 并向客户端返回确认
- kubernetes 组件通过watch 机制跟踪api server 状态变化
- kube-scheduler 为pod 选择工作节点,将结果更新api server,再api server 同步到 etcd
- 目标节点的kubelet 调用docker 启动容器,将状态返回api server ,api server 存入etcd 告知 kubelet
Pod 生命周期
一、核心流程:启动与终止
1. 启动流程
- 先执行初始化容器(init container),完成环境准备。
- 初始化完成后,主容器(main container)启动。
- 主容器启动后触发 post start 钩子(启动后操作)。
- 进入健康检查阶段,执行存活探测和就绪探测。
2. 终止流程
- 容器终止前可触发 pre stop 钩子(终止前操作)。
- 按重启策略判断是否终止容器,特殊情况 30 秒后强制终止。
二、健康检查(Health Check)
1. 探测类型与作用
- 存活探测(liveness probe):检测主容器是否存活,不健康则重启 Pod。
- 就绪探测(readiness probe):检测主容器是否就绪,不健康则标记为 Notready,不转发 Service 流量。
2. 探测实现方式
- Exec:通过执行指定命令判断状态。
- HTTPGet:发送 HTTP 请求访问指定 URL 路径。
- TCP:尝试建立 TCP 连接到指定端口。
三、容器重启策略(restartPolicy)
- Always(默认):容器挂掉后总是重启,重复重启延迟时长从 10 秒、20 秒、40 秒逐步递增,最大 300 秒。
- OnFailure:仅当容器以错误状态终止时重启,正常终止不重启。
- Never:容器挂掉后不重启。