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 关闭后不重启
相关推荐
奇特認1 小时前
kubernetes pod管理
云原生·容器·kubernetes
mohesashou1 小时前
k8s控制器管理
云原生·容器·kubernetes
Cicada1282 小时前
微服务是怎么长出来的
微服务·云原生·架构
王da魔2 小时前
Pod管理及优化
云原生·kubernetes
孙克旭_2 小时前
K8s 1.30 实战:Containerd 镜像仓库配置与 nerdctl 管理命令
云原生·容器·kubernetes·containerd
2601_966871402 小时前
全新 云原生系统精讲与全流程落地实践,云原生 DevOpS 进阶实战营
运维·云原生·devops
识途老码2 小时前
docker运行sqlserver
docker·容器·sqlserver
小谈不敲代码3 小时前
【10-kubernetes的控制器】
kubernetes·运维开发
Henry-SAP3 小时前
小米自研AI芯片亮相
人工智能·云原生·sap·erp