Kubernetes Pod 管理实战指南
一、命令式对象管理
1. 命名空间管理
Kubernetes 中的命名空间(Namespace)用于实现多租户资源隔离,常用操作如下:
查看命名空间:
bash
kubectl get namespaces
系统默认命名空间包括 default、kube-flannel、kube-node-lease、kube-public、kube-system,均为 Active 状态。markdown_1
创建命名空间:
bash
kubectl create namespace timinglee
创建后命名空间立即出现,5 秒后状态变为 Active。markdown_1
删除命名空间:
bash
kubectl delete namespaces timinglee
删除后命名空间即被移除。markdown_1
2. Pod 管理
查看 Pod 运行情况:
bash
kubectl get pods -o wide
可查看 Pod 名称、状态、所在节点及 IP 地址等信息。markdown_1
创建 Pod:
bash
kubectl run lee --image nginx:latest
成功创建后 Pod lee 状态为 Running,IP 为 10.244.1.10,运行在 k8s-node1 节点。markdown_1
创建失败场景(镜像不存在):
bash
kubectl run error --image lee:v1
Pod error 状态为 ImagePullBackOff,原因:镜像 docker.io/library/lee:v1 不存在,导致拉取失败。markdown_1
查看 Pod 详细信息:
bash
kubectl describe pods error
可查看 Pod 的完整信息,包括节点、IP、容器状态、事件等;当镜像拉取失败时,事件中会显示 Failed to pull image 及具体错误原因。markdown_1
删除 Pod:
bash
kubectl delete pods error
kubectl delete pods --all # 删除所有 Pod
3. 镜像上传到仓库
bash
docker load -i myapp.tar.gz
docker tag timinglee/myapp:v1 reg.timinglee.org/library/myapp:v1
docker push reg.timinglee.org/library/myapp:v1
将本地镜像加载、重命名后推送到私有仓库 reg.timinglee.org/library。markdown_1
二、kubectl 命令实操
1. 生成实验 YAML 文件
ReplicaSet 示例 replica.yml:
yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
labels:
app: replica
name: replica
spec:
replicas: 2
selector:
matchLabels:
app: replica
template:
metadata:
labels:
app: replica
spec:
containers:
- image: myapp:v1
name: myapp
该 YAML 定义了一个 ReplicaSet,副本数为 2,选择器匹配 app: replica 标签,Pod 模板使用 myapp:v1 镜像。markdown_1
2. 常用 kubectl 命令
| 命令 | 功能 | 示例 |
|---|---|---|
create |
创建资源 | kubectl create deployment webcluster --replicas 2 --image myapp:v1 |
edit |
编辑资源 | kubectl edit deployments.apps webcluster(修改 replicas 从 1 到 2) |
patch |
部分更新资源 | kubectl patch deployments.apps webcluster -p '{"spec":{"replicas":1}}' |
expose |
暴露服务 | kubectl expose deployment webcluster --port 80 --target-port 80(创建 ClusterIP 类型 Service) |
logs |
查看容器日志 | kubectl logs pods/webcluster-77c87d9946-gh9v7 |
attach |
挂接到运行中的容器 | kubectl attach pods/testpod -it |
exec |
在容器中执行命令 | kubectl exec -it pods/testpod -c testpod -- /bin/bash |
cp |
复制文件 | kubectl cp testpod:/usr/share/nginx/html/index.html /mnt/test |
rollout |
管理滚动更新 | kubectl rollout status/restart/history deployment webcluster |
scale |
扩缩容 | kubectl scale deployment webcluster --replicas 4 |
label |
管理标签 | kubectl label pods webcluster-xxx app=webcluster |
markdown_1
expose 暴露服务效果: 创建 Service 后,可通过 ClusterIP 访问,多次 curl 返回不同 Pod 的主机名,实现负载均衡。markdown_1
cp 复制文件效果: 将本地的 index.html 复制到 Pod 中,修改后访问 Pod 的 IP 可返回自定义内容。markdown_1
rollout 滚动重启效果: 执行 rollout restart 后,Pod 重建且哈希后缀发生变化(如 77c87d9946 → 7bfd865747 → 9787d97f6)。markdown_1
scale 扩缩容: Pod 数可按需动态调整,从 2 → 4 → 1,Kubernetes 自动创建或删除 Pod。markdown_1
三、利用控制器实现版本更替
1. 建立 Deployment 控制器
前提:Harbor 仓库必须存在 myapp:v1 和 myapp:v2 两个镜像。markdown_1
bash
kubectl create deployment webcluster --image myapp:v1 --replicas 2 --dry-run=client -o yaml > webcluster.yml
生成的 webcluster.yml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: webcluster
name: webcluster
spec:
replicas: 2
selector:
matchLabels:
app: webcluster
template:
metadata:
labels:
app: webcluster
spec:
containers:
- image: myapp:v1
name: myapp
应用配置:
bash
kubectl apply -f webcluster.yml
kubectl get deployments.apps # 查看 Deployment 状态
kubectl get pods # 查看 Pod 运行状态
2. 更新业务版本
暴露服务(NodePort 类型,外部端口 30713):
bash
kubectl expose deployment webcluster --port 80 --target-port 80 --type NodePort
kubectl get svc
更新镜像为 v2 版本:
bash
kubectl set image deployments webcluster myapp=myapp:v2
kubectl annotate deployment webcluster kubernetes.io/change-cause="myappv2" --overwrite
访问验证:
bash
curl http://172.25.254.100:30713
输出:Hello MyApp | Version: v2 | Pod Name
3. 版本回退
bash
kubectl rollout undo deployment webcluster --to-revision=1
curl http://172.25.254.100:30713
访问恢复为 v1 版本,输出:Hello MyApp | Version: v1 | Pod Name。markdown_1
四、Container 高级特性
1. Init 容器(初始化容器)
Init 容器在应用容器之前启动,用于完成初始化任务。示例:使用 busybox 等待 /testfile 文件创建后,主容器才启动。markdown_1
2. 存活探针(Liveness Probe)
通过 TCP 检测容器 80 端口是否存活:
yaml
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 1
timeoutSeconds: 1
若检测失败,Kubernetes 会重启容器。markdown_1
3. 就绪探针(Readiness Probe)
通过 HTTP GET 请求检测 /index.html 是否可访问,只有就绪探针通过后,Pod 才会被加入 Service 的 Endpoints 中接收流量。markdown_1
五、资源优先级(QoS Classes)
Kubernetes 根据容器的资源限制(limits)和请求(requests)划分 QoS 等级:
| QoS 等级 | 说明 | 优先级 |
|---|---|---|
| Guaranteed | 期望值(requests)和最大使用限制(limits)相同 | 最高 |
| Burstable | 设定了资源限制,但期望值和限制值不同 | 次之 |
| BestEffort | 未做任何资源限制 | 最低 |
markdown_1
六、容器重启策略
| 策略 | 说明 |
|---|---|
Always |
无论什么原因都会重新运行 Pod(默认) |
OnFailure |
非正常关闭会重启 Pod |
Never |
Pod 关闭后不重启 |