Kubernetes Pod 管理与控制器管理
本文档系统梳理 Kubernetes 中 Pod 管理与控制器(Controller)的核心概念与操作实践,配合实验命令与 YAML 配置,帮助深入理解各组件的设计原理与使用方式。
第一部分:Pod 管理
1.1 命名空间(Namespace)
概念说明:
Kubernetes 集群通过命名空间实现逻辑隔离。不同命名空间中的资源相互隔离,但共享底层集群的计算、存储和网络资源。命名空间为多租户场景提供了资源分组与权限管控的基础能力。
Kubernetes 内置的默认命名空间如下:
| 命名空间 | 用途 |
|---|---|
| default | 未显式指定命名空间时,资源默认部署到此命名空间 |
| kube-system | 存放集群系统组件(如 CoreDNS、kube-scheduler 等) |
| kube-public | 所有用户均可读取的公共命名空间 |
| kube-node-lease | 存储节点心跳租约信息,用于节点健康检测 |
实验命令:
bash
# 查看所有命名空间
kubectl get namespaces
# 创建自定义命名空间
kubectl create namespace timinglee
# 删除命名空间
kubectl delete namespace timinglee
对应 YAML 写法:
yaml
apiVersion: v1
kind: Namespace
metadata:
name: timinglee
1.2 Pod 基础操作 ------ 创建、查看、删除
概念说明:
Pod 是 Kubernetes 中最小的可部署计算单元。一个 Pod 封装了一个或多个紧密耦合的容器、存储资源、网络 IP 以及运行选项。创建 Pod 即向 API Server 提交一个 Pod 定义,由调度器将其分配到合适的节点上运行。
核心命令:
bash
# 查看当前命名空间中的 Pod,并显示运行节点和 IP 信息
kubectl get pods -o wide
# 创建运行 nginx 的 Pod
kubectl run lee --image nginx:latest
# 验证 Pod 创建状态
kubectl get pods -o wide
# 输出示例:
# NAME READY STATUS RESTARTS AGE IP NODE
# lee 1/1 Running 0 25s 10.244.1.10 k8s-node1
# 删除指定 Pod
kubectl delete pods lee
# 删除当前命名空间中的所有 Pod
kubectl delete pods --all
对应 YAML 写法:
yaml
apiVersion: v1
kind: Pod
metadata:
name: lee
labels:
run: lee
spec:
containers:
- name: nginx
image: nginx:latest
1.3 Pod 故障排查
概念说明:
Pod 创建后若状态非 Running,需通过 describe 和 logs 命令进行故障定位。常见状态及含义如下:
| 状态 | 含义 |
|---|---|
| Pending | Pod 已被接受,但尚未调度到节点或镜像拉取中 |
| ImagePullBackOff | 镜像名称错误或镜像仓库不可达 |
| CrashLoopBackOff | 容器启动后反复崩溃重启 |
| ErrImagePull | 镜像拉取失败(通常为镜像路径或标签错误) |
| OOMKilled | 容器因超出内存限制被系统 OOM Killer 终止 |
实验命令:
bash
# 使用不存在的镜像模拟故障
kubectl run error --image lee:v1
# 查看 Pod 状态
kubectl get pods -o wide
# 使用 describe 查看 Pod 详细信息,重点检查 Events 区域
kubectl describe pods error
# 输出关键信息(Events 部分):
# Warning Failed Error response from daemon: failed to resolve reference "docker.io/library/lee:v1"
# Warning Failed Error: ImagePullBackOff
排查流程:
kubectl get pods查看 STATUS 列,初步判断故障类型kubectl describe pods <pod名>查看 Pod 事件日志(Events 区域)kubectl logs <pod名>查看容器应用日志- 对于 CrashLoopBackOff,可尝试
kubectl logs <pod名> --previous查看上一次崩溃的日志
1.4 kubectl 核心命令
kubectl 是 Kubernetes 的命令行管理工具,通过 RESTful API 与 API Server 交互,实现对集群资源的增删改查操作。
1.4.1 create ------ 创建资源
bash
# 使用 create 命令创建 Deployment,指定副本数和容器镜像
kubectl create deployment webcluster --replicas 2 --image myapp:v1
# 查看已创建的 Deployment
kubectl get deployments.apps
# 输出:
# NAME READY UP-TO-DATE AVAILABLE AGE
# webcluster 2/2 2 2 15s
# 查看自动创建的 Pod
kubectl get pods
# 输出:
# NAME READY STATUS RESTARTS AGE
# webcluster-77c87d9946-28thm 1/1 Running 0 24s
# webcluster-77c87d9946-vwrsq 1/1 Running 0 24s
# 删除 Deployment(级联删除所有关联的 Pod)
kubectl delete deployments.apps webcluster

1.4.2 edit ------ 在线编辑资源
bash
# 创建 Deployment
kubectl create deployment webcluster --image myapp:v1
# 使用 edit 打开默认编辑器,直接修改副本数
kubectl edit deployments.apps webcluster
# 在编辑器中将 replicas: 1 修改为 replicas: 2,保存退出
# Kubernetes 将自动创建新的 Pod 以匹配期望状态
# 验证副本数已更新
kubectl get pods
# 输出:
# NAME READY STATUS RESTARTS AGE
# webcluster-77c87d9946-2cgr7 1/1 Running 0 36s
# webcluster-77c87d9946-2wqn7 1/1 Running 0 103s


1.4.3 patch ------ 局部更新资源
bash
# 使用 JSON 策略仅更新副本数,无需打开完整 YAML
kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}'
# 验证多余 Pod 已被删除
kubectl get pods
1.4.4 expose ------ 暴露为 Service
bash
# 将 Deployment 暴露为 ClusterIP 类型的 Service
kubectl expose deployment webcluster --port 80 --target-port 80
# 查看 Service 信息
kubectl get service
# 输出:
# NAME TYPE CLUSTER-IP PORT(S) AGE
# webcluster ClusterIP 10.97.61.108 80/TCP 18s
# 查看 Service 的后端端点(Endpoints)
kubectl describe svc webcluster
# 通过 Service IP 访问,验证负载均衡效果
curl 10.97.61.108/hostname.html
# 输出会轮转:
# webcluster-77c87d9946-gh9v7
# webcluster-77c87d9946-m69wl
# webcluster-77c87d9946-4p4mz

1.4.5 logs ------ 查看容器日志
bash
# 查看指定 Pod 的应用日志
kubectl logs pods/webcluster-77c87d9946-gh9v7
# 输出:
# 10.244.0.0 - - [20/Aug/2026:08:43:52 +0000] "GET /hostname.html HTTP/1.1" 200 28
1.4.6 attach ------ 进入容器
bash
# 先准备 busybox 镜像
docker load -i busybox-latest.tar.gz
docker tag busybox:latest reg.timinglee.org/library/busybox:latest
# 创建交互式 Pod
kubectl run -it testpod --image busybox:latest
# 在另一个终端 attach 到运行中的 Pod
kubectl attach pods/testpod -it
# 退出交互式会话:按 Ctrl+P 然后 Ctrl+Q(注意:Ctrl+C 会终止容器)
1.5 标签与选择器
概念说明:
- 标签(Label):Kubernetes 中用于标识资源属性的键值对(Key-Value),附加在 Pod 等资源的 metadata.labels 字段中。标签不要求唯一,一个 Pod 可拥有多个标签,常用于资源分组、筛选和路由。
- 选择器(Selector):Service 和控制器通过标签选择器(Label Selector)匹配目标 Pod。选择器定义了"哪些 Pod 属于该 Service 或该控制器"的归属关系。
关键约束:Service 仅将流量转发至标签与选择器匹配的 Pod。
实验演示:
bash
# 创建 ClusterIP Service,选择器要求 app=webserver
kubectl create service clusterip --tcp 80:80 testservice --dry-run=client -o yaml > testservice.yaml
# 创建 Pod,但标签为 run=webserver(注意:与 Service 选择器不匹配)
kubectl run webserver --image myapp:v1 --dry-run=client -o yaml > webserver.yml
# 此时 Service 的 Endpoints 为空,因为标签未匹配
# Service 描述中:Endpoints: <none>
# 为 Pod 添加与选择器匹配的标签
kubectl label pods webserver app=webserver
# Service 自动发现匹配的 Pod,Endpoints 更新
# Service 描述中:Endpoints: 10.244.2.7:80
# 验证流量可达
curl 10.100.62.227
# 输出:Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
YAML 中的标签与选择器:
yaml
# Service 的 selector 定义流量匹配规则
apiVersion: v1
kind: Service
metadata:
name: testservice
spec:
selector:
app: webserver # 仅匹配带有 app=webserver 标签的 Pod
ports:
- port: 80
targetPort: 80
type: ClusterIP
---
# Pod 的 labels 定义其自身属性
apiVersion: v1
kind: Pod
metadata:
name: webserver
labels:
app: webserver # 必须与 Service 的 selector 匹配
spec:
containers:
- image: myapp:v1
name: webserver
第二部分:知识点速查总结
Pod 管理命令速查表
| 操作 | 命令 |
|---|---|
| 查看 Pod | kubectl get pods -o wide |
| 创建 Pod | kubectl run <name> --image <image> |
| 删除 Pod | kubectl delete pods <name> |
| 查看详情 | kubectl describe pods <name> |
| 查看日志 | kubectl logs <pod名> |
| 进入容器 | kubectl attach pods/<name> -it |
| 批量创建 | kubectl apply -f xxx.yml |
| 在线编辑 | kubectl edit deployments.apps <name> |
| 局部更新 | kubectl patch deployments.apps <name> -p '...' |
| 暴露服务 | kubectl expose deployment <name> --port 80 |