Kubernetes Pod 管理
0. 资源管理模型
Kubernetes 将所有基础设施抽象为资源对象。集群管理的本质是操作这些资源。
| 概念 | 说明 |
|---|---|
| 最小管理单元 | Pod(不是容器) |
| Pod 管理方式 | 一般通过 Pod 控制器(Deployment / StatefulSet 等)间接管理 |
| 服务访问 | Service 资源 |
| 数据持久化 | Volume / PV / PVC |
三种资源管理方式对比
| 方式 | 命令示例 | 特点 |
|---|---|---|
| 命令式对象管理 | kubectl run nginx-pod --image=nginx:latest --port=80 |
直接用命令操作,快捷但不易追溯 |
| 命令式对象配置 | kubectl create -f nginx-pod.yaml |
命令+配置文件,可重复执行 |
| 声明式对象配置 | kubectl apply -f nginx-pod.yaml |
声明期望状态,支持自动 diff 和增量更新 |
kubectl 命令语法
kubectl [command] [type] [name] [flags]
| 字段 | 含义 | 示例 |
|---|---|---|
| command | 对资源执行的操作 | get、create、delete、describe |
| type | 资源类型 | pod、deployment、service |
| name | 资源名称(大小写敏感) | web1、testpod |
| flags | 额外可选参数 | -o yaml、-n default |
常用操作:
kubectl get pod # 查看所有 pod
kubectl get pod pod_name # 查看指定 pod
kubectl get pod pod_name -o yaml # 以 yaml 格式展示结果
kubectl api-resources # 列出集群支持的所有资源类型
1. Namespace 管理
kubectl get namespaces
kubectl create namespace lin
kubectl delete namespace lin
2. Pod 基础操作
创建与查看
kubectl run lin --image nginx:latest
kubectl get pods -o wide
kubectl describe pod lin1
kubectl delete pod lin1
kubectl delete pods --all
集群信息
kubectl version
kubectl cluster-info
3. Deployment 控制器
创建 Deployment
kubectl create deployment web1 --replicas 2 --image myapp:v1
查看与编辑
kubectl get deployments.apps
kubectl edit deployments.apps web1
更新副本数(patch)
kubectl patch deployments.apps web1 -p '{"spec":{"replicas":1}}'
暴露服务
kubectl expose deployment web1 --port 80 --target-port 80
kubectl expose deployment web1 --port 80 --target-port 80 --type NodePort
kubectl describe svc web1
curl 10.101.114.159
查看日志
kubectl logs pods/web1-59647bb49-9kcx2
获取帮助
kubectl explain deployment
kubectl explain deployment.spec
4. 容器交互
attach 进入运行中的 Pod
kubectl run -it testpod --image busybox:latest
# Ctrl+PQ 退出但不终止容器
kubectl attach pods/testpod -it
exec 在容器内执行命令
kubectl run testpod1 --image nginx:latest
kubectl exec -it pods/testpod1 -c testpod1 -- /bin/bash
cp 文件复制
kubectl cp testpod1:/usr/share/nginx/html/index.html /mnt/test
echo lin > /mnt/test
kubectl cp /mnt/test testpod1:/usr/share/nginx/html/index.html
curl 10.244.1.7
5. 滚动发布与回滚
创建并查看发布状态
kubectl create deployment web1 --image myapp:v1 --replicas 2 \
--dry-run=client -o yaml > web1.yml
kubectl apply -f web1.yml
kubectl rollout status deployment web1
重启
kubectl rollout restart deployment web1
扩缩容
kubectl scale deployment web1 --replicas 4
kubectl scale deployment web1 --replicas 1
标签操作
kubectl get pods --show-labels
kubectl label pods web1-98bb59bf5-9txw5 app-
kubectl label pods web1-98bb59bf5-9txw5 app=web1
6. 自主式 Pod vs 控制器管理 Pod
自主式 Pod
kubectl run lin --image nginx:latest
| 维度 | 说明 |
|---|---|
| 优点 | 配置灵活,适合学习调试和一次性任务 |
| 缺点 | 无自动恢复、无滚动更新、无 HPA、管理成本高 |
控制器管理 Pod(Deployment)
kubectl create deployment web1 --image myapp:v1 --replicas 2 \
--dry-run=client -o yaml > web1.yml
kubectl apply -f web1.yml
| 能力 | 说明 |
|---|---|
| 自动故障恢复 | Pod 删除后自动重建 |
| 健康检查 | 存活探针、就绪探针 |
| 滚动更新 | 逐步替换旧版本 |
| 回滚 | 一键回退到指定 revision |
| HPA | 基于 CPU/内存自动扩缩容 |
| 服务发现 | Service 自动关联 Pod |
版本更新与回滚
kubectl set image deployments web1 myapp=myapp:v2
kubectl annotate deployments.apps web1 \
kubernetes.io/change-cause="myapp:v2" --overwrite
kubectl rollout history deployment web1
kubectl rollout undo deployment web1 --to-revision 1
7. YAML 部署 Pod(完整字段说明)
apiVersion: v1
kind: Pod
metadata:
name: testpod
namespace: default
spec:
restartPolicy: Always
containers:
- name: nginx
image: nginx:1.24
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
| 字段 | 含义 |
|---|---|
| apiVersion | K8s API 版本,Pod 固定为 v1 |
| kind | 资源类型 |
| metadata.name | Pod 名称,同 namespace 唯一 |
| metadata.namespace | 所属命名空间 |
| spec.restartPolicy | 重启策略:Always / OnFailure / Never |
| spec.containers\[\].name | 容器名称 |
| spec.containers\[\].image | 容器镜像 |
| imagePullPolicy | IfNotPresent / Always / Never |
| containerPort | 容器监听端口 |
| resources.requests | 调度时请求的最小资源 |
| resources.limits | 容器可使用的最大资源 |
8. 多容器 Pod
apiVersion: v1
kind: Pod
metadata:
labels:
run: testpod
name: testpod
spec:
containers:
- image: myapp:v1
name: testpod
- image: busyboxplus:latest
name: busybox
command:
- /bin/sh
- -c
- sleep 10000
同一 Pod 内的容器共享 Network、IPC、UTC namespace。
验证:
kubectl apply -f tastpod.yaml
kubectl exec -it pods/testpod -c busybox -- /bin/sh
curl 127.0.0.1
9. hostPort 端口映射
spec:
containers:
- image: myapp:v1
name: testpod
ports:
- name: http
containerPort: 80
hostPort: 80
protocol: TCP
访问方式:curl <节点IP>:80
10. 环境变量注入
apiVersion: v1
kind: Pod
metadata:
labels:
run: mysql
name: mysql
spec:
containers:
- image: mysql:8.0
name: mysql8
env:
- name: MYSQL_ROOT_PASSWORD
value: "123"
- image: phpmyadmin:latest
name: mysqladmin
env:
- name: PMA_ARBITRARY
value: "1"
ports:
- name: phpadminport
containerPort: 80
hostPort: 80
protocol: TCP
11. 节点选择器(nodeSelector)
spec:
nodeSelector:
kubernetes.io/hostname: node2
Pod 只会被调度到标签匹配的节点上。
12. 共享宿主机网络(hostNetwork)
spec:
hostNetwork: true
容器内 ifconfig 看到的是宿主机的网络接口。
13. 资源限制与 QoS 优先级
| requests 与 limits 关系 | QoS 等级 | 节点压力时行为 |
|---|---|---|
| 均未设置 | BestEffort | 最先被驱逐 |
| requests < limits | Burstable | 中间优先级 |
| requests = limits | Guaranteed | 最后被驱逐 |
验证:
kubectl describe pods testpod | grep "QoS Class:"
14. 重启策略
| restartPolicy | 行为 |
|---|---|
| Always | 容器退出即重启(默认) |
| OnFailure | 非零退出码才重启 |
| Never | 不重启 |
示例(Always + sleep 30):
spec:
restartPolicy: Always
containers:
- image: busybox:latest
name: busybox
command: ["/bin/sh", "-c", "sleep 30"]
Pod 状态变化:Running → Completed → Running(RESTARTS 递增)。
15. Pod 生命周期:Init 容器
Init 容器在应用容器启动前按顺序运行,必须全部成功完成,应用容器才会启动。
apiVersion: v1
kind: Pod
metadata:
labels:
run: web1
name: web1
spec:
initContainers:
- name: busybox
image: busybox:latest
command:
- /bin/sh
- -c
- "until test -e /testfile; do echo waiting; sleep 2; done"
containers:
- image: myapp:v1
name: web1
restartPolicy: Always
在另一个终端创建 /testfile 后,Init 容器完成,应用容器启动。
16. 探针
探针类型
| 探针 | 作用 | 失败后果 |
|---|---|---|
| livenessProbe | 检测容器是否存活 | kubelet 杀容器并按重启策略处理 |
| readinessProbe | 检测容器是否就绪 | 从 Service 的 Endpoints 中摘除 IP |
| startupProbe | 检测应用是否已启动 | 启动期间禁用另两种探针;失败则重启 |
存活探针(TCP Socket)
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 1
timeoutSeconds: 1
就绪探针(HTTP GET)
readinessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 2
timeoutSeconds: 1
删除 /usr/share/nginx/html/index.html 后,Pod IP 从 Endpoints 中移除,Service 不再转发流量到该 Pod。恢复文件后自动加回。
附录:常用命令速查表
| 场景 | 命令 |
|---|---|
| 查看所有资源类型 | kubectl api-resources |
| 查看 Pod 详情 | kubectl describe pod <name> |
| 查看 Deployment 历史 | kubectl rollout history deployment <name> |
| 回滚到指定版本 | kubectl rollout undo deployment <name> --to-revision=N |
| 实时查看 Pod 状态 | kubectl get pods -w |
| 进入容器执行命令 | kubectl exec -it <pod> -c <container> -- /bin/bash |
| 从 Pod 拷文件到本地 | kubectl cp <pod>:<path> <local> |
| 从本地拷文件到 Pod | kubectl cp <local> <pod>:<path> |
| 查看资源 YAML 定义帮助 | kubectl explain <resource>.<field> |