Kubernetes Pod 全生命周期管理:从命令实操到控制器版本更替

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 关闭后不重启
相关推荐
寻林写彡1 天前
01| 裸机部署 K8S:从零搭建生产可用集群
云原生·kubernetes
更深兼春远1 天前
第2篇:Dify 部署保姆级教程:用 Docker跑起来
docker·容器·dify
念何架构之路1 天前
zap WriteSyncer与Sink体系
云原生·golang
小白的码BUG之路2 天前
Docker -- No space left on device
运维·docker·容器
EatFan2 天前
从云原生到AI原生:2026后端架构“三驾马车”(事件驱动、虚拟线程、AI Agent内嵌)演进解析
spring boot·云原生·架构·虚拟线程·ai-native·ai agent·spring ai
wzq11_6662 天前
Kubernetes集群——Service篇(详细讲解!!!)
云原生·容器·kubernetes
程序员老陆2 天前
Docker 命令全景指南:从镜像构建到生产运维
运维·docker·容器
Henry-SAP2 天前
SAP MRP失效根源业务角度解析
人工智能·云原生·sap·erp
江湖有缘2 天前
3款开源绘图工具整理合集,可Docker一键部署!
docker·容器·开源
nhdh2 天前
Higress:AI时代云原生网关新选择
人工智能·云原生