创建和管理pod
文章目录
一、什么是 Pod
Pod 是 Kubernetes 中最小的可部署单元,封装一个或多个紧密关联的容器,共享网络、存储和运行时上下文。
-
核心特性
:
- 最小部署单元,代表一个应用实例。
- 单容器 Pod:最常见模式,独立服务单元。
- 多容器 Pod:适用于紧密协作场景(如主应用 + Sidecar 容器)。
- 包含 Pause 容器(根容器),管理共享命名空间和资源。
二、Pod 与容器
-
Pod 作为最小单元的原因:
- 提供容器间资源共享(网络、存储)。
- 简化调度和生命周期管理。
- 确保关联容器协同启停。
-
单容器 Pod 示例:
单容器 Pod 配置(nginx-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
3. **多容器 Pod 示例**:
yaml
```yaml
# 多容器 Pod 配置(multi-container-pod.yaml)
spec:
containers:
- name: app
image: my-app
- name: log-agent
image: fluentd
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {} # 临时共享存储
-
初始化容器(Init Containers):
yaml
# 带初始化容器的配置(init-container-pod.yaml) spec: initContainers: - name: init-db image: busybox command: ['sh', '-c', 'until nslookup mysql-service; do echo waiting; sleep 2; done'] containers: - name: app image: my-app
三、Pod 的 YAML 定义
yaml
# 完整 Pod 定义示例(pod-example.yaml)
apiVersion: v1 # 固定为 v1(核心 API)
kind: Pod
metadata:
name: my-pod # 唯一名称
namespace: default # 所属命名空间(默认 default)
labels: # 标签(用于筛选)
app: web
env: dev
spec:
containers:
- name: nginx # 容器名称(Pod 内唯一)
image: nginx:1.25 # 镜像地址
imagePullPolicy: IfNotPresent # 镜像拉取策略
ports:
- containerPort: 80 # 暴露端口(仅文档说明)
protocol: TCP
resources: # 资源配额
requests: # 最小需求
memory: "128Mi"
cpu: "0.5"
limits: # 最大限制
memory: "256Mi"
cpu: "1"
volumeMounts: # 挂载存储卷
- name: logs-volume
mountPath: /var/log/nginx
volumes: # Pod 级存储卷
- name: logs-volume
emptyDir: {} # 临时目录(Pod 删除后数据丢失)
四、Pod 的生命周期
-
阶段(Phase):
Pending
:已提交但未调度或镜像下载中。Running
:至少一个容器运行中。Succeeded
:所有容器正常终止(退出码 0)。Failed
:至少一个容器异常终止(退出码非 0)。Unknown
:无法获取状态(通信故障)。
-
重启策略(restartPolicy):
Always
:始终重启(默认,适用于服务)。OnFailure
:仅异常退出时重启(适用于任务)。Never
:不重启(依赖控制器管理)。
-
生命周期配置示例:
yaml
# 带钩子和探针的 Pod 配置(lifecycle-demo.yaml) apiVersion: v1 kind: Pod metadata: name: lifecycle-demo spec: initContainers: - name: init-db image: busybox command: ["sh", "-c", "until nslookup mysql; do sleep 2; done"] containers: - name: nginx image: nginx:latest lifecycle: postStart: # 容器启动后执行 exec: command: ["/bin/sh", "-c", "echo 'Started' > /usr/share/nginx/html/start.html"] preStop: # 容器终止前执行 exec: command: ["nginx", "-s", "quit"] livenessProbe: # 存活探针 tcpSocket: port: 80 initialDelaySeconds: 15 periodSeconds: 20 readinessProbe: # 就绪探针 httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10 terminationGracePeriodSeconds: 60 # 优雅终止宽限期
五、Pod 的健康检查机制
探针类型 | 作用 | 失败处理 | 示例配置(HTTP 方式) |
---|---|---|---|
Liveness Probe | 检测容器是否存活 | 重启容器 | livenessProbe: httpGet: path: / port: 80 |
Readiness Probe | 检测容器是否就绪 | 从 Service 移除流量 | readinessProbe: httpGet: path: /ready port:80 |
Startup Probe | 检测应用是否启动完成 | 重启容器直到成功 | startupProbe: tcpSocket: port: 8080 |
关键参数:
initialDelaySeconds
:首次探测延迟(秒)。periodSeconds
:探测周期(秒,默认 10)。timeoutSeconds
:超时时间(秒,默认 1)。failureThreshold
:连续失败阈值(默认 3)。
六、创建多容器 Pod
# 1. 创建配置文件
cat > two-containers-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: two-containers-pod
spec:
restartPolicy: Never
volumes:
- name: shared-data
emptyDir: {}
containers:
- name: nginx-container
image: nginx
volumeMounts:
- name: shared-data
mountPath: /usr/share/nginx/html
- name: busybox-container
image: busybox
volumeMounts:
- name: shared-data
mountPath: /pod-data
command: ["/bin/sh"]
args: ["-c", "echo Hello from the busybox container > /pod-data/index.html"]
EOF
# 2. 创建 Pod
kubectl apply -f two-containers-pod.yaml
# 3. 查看 Pod 状态(YAML 格式)
kubectl get pod two-containers-pod --output=yaml
# 4. 进入 nginx 容器验证共享文件
kubectl exec -it two-containers-pod -c nginx-container -- /bin/bash
# 在容器内执行:
curl localhost
exit
# 5. 通过 Pod IP 访问
POD_IP=$(kubectl get pod two-containers-pod -o jsonpath='{.status.podIP}')
curl $POD_IP
# 6. 删除 Pod
kubectl delete -f two-containers-pod.yaml
七、为 Pod 及其容器设置资源配额
# 1. 创建带资源配额的配置文件
cat > resources-limit-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: resources-limit-pod
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 200m
memory: 400Mi
requests:
cpu: 100m
memory: 200Mi
- name: stress
image: polinux/stress
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
EOF
# 2. 创建 Pod
kubectl apply -f resources-limit-pod.yaml
# 3. 查看 Pod 状态
kubectl get pod
kubectl get pod resources-limit-pod --output=yaml
# 4. 测试资源超限(修改配置文件)
cat > resources-limit-pod-new.yml << EOF
apiVersion: v1
kind: Pod
metadata:
name: resources-limit-pod
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 200m
memory: 400Mi
requests:
cpu: 100m
memory: 200Mi
- name: stress
image: polinux/stress
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"]
args: ["--vm", "1", "--vm-bytes", "500M", "--vm-hang", "1"] # 超限
EOF
# 5. 应用新配置并观察状态
kubectl apply -f resources-limit-pod-new.yml
kubectl get pod -w # 监视状态(Ctrl+C 终止)
# 6. 查看详细信息(确认 OOM 终止)
kubectl describe pod resources-limit-pod
# 7. 删除 Pod
kubectl delete -f resources-limit-pod-new.yml
八、实现 Pod 容器的健康检查
# 1. 创建健康检查配置文件
cat > liveness-probe-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: liveness-probe-pod
spec:
containers:
- name: liveness-probe
image: nginx
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10 # 启动后 10 秒开始探测
timeoutSeconds: 2 # 超时时间 2 秒
periodSeconds: 30 # 探测周期 30 秒
failureThreshold: 3 # 连续 3 次失败重启
EOF
# 2. 创建 Pod
kubectl apply -f liveness-probe-pod.yaml
# 3. 查看状态(确认正常运行)
kubectl get pod
kubectl describe pod liveness-probe-pod
# 4. 删除 Pod
kubectl delete pod liveness-probe-pod
开始探测
timeoutSeconds: 2 # 超时时间 2 秒
periodSeconds: 30 # 探测周期 30 秒
failureThreshold: 3 # 连续 3 次失败重启
EOF
2. 创建 Pod
kubectl apply -f liveness-probe-pod.yaml
3. 查看状态(确认正常运行)
kubectl get pod
kubectl describe pod liveness-probe-pod
4. 删除 Pod
kubectl delete pod liveness-probe-pod