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

Kubernetes Pod 管理实战指南

一、命令式对象管理

1. 命名空间管理

Kubernetes 中的命名空间(Namespace)用于实现多租户资源隔离,常用操作如下:

查看命名空间:

bash 复制代码
kubectl get namespaces

系统默认命名空间包括 defaultkube-flannelkube-node-leasekube-publickube-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/librarymarkdown_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 重建且哈希后缀发生变化(如 77c87d99467bfd8657479787d97f6)。markdown_1

scale 扩缩容: Pod 数可按需动态调整,从 2 → 4 → 1,Kubernetes 自动创建或删除 Pod。markdown_1


三、利用控制器实现版本更替

1. 建立 Deployment 控制器

前提:Harbor 仓库必须存在 myapp:v1myapp: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 Namemarkdown_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 关闭后不重启
相关推荐
大盛供应链·卢生14 小时前
哪些国产芯片可以替代进口芯片,哪些替代不了
fpga开发·容器
Mr小林19 小时前
Docker 安装教程(在线 + 离线)
运维·docker·容器
阿里云云原生19 小时前
云栖剧透丨四场论坛,看清智能体走进生产的关键路径
云原生
Henry-SAP19 小时前
SAP PP模块核心机制解析
人工智能·云原生·sap·erp
运维开发王义杰19 小时前
内存不报警、Pod 却连环死循环?揭秘 Linux Major Page Fault 致命抖动
云原生
wdfk_prog1 天前
VMware Ubuntu 虚拟机从 124 GB 压缩到 33 GB
运维·缓存·docker·容器
colourmind1 天前
K3S+Hami+Higress+Vip(nginx+keepalived)搭建云原生高可用的大模型部署平台
运维·nginx·云原生
闲云野鹤在人间1 天前
Docker入门|第3章 镜像详解
linux·网络·docker·容器·centos·云计算·php
闲云野鹤在人间1 天前
Docker入门|第2章 容器架构详解
linux·运维·docker·容器·架构·云计算
wzq11_6661 天前
Docker数据卷管理
运维·docker·容器