Kubernetes Pod 管理

Kubernetes Pod 管理

0. 资源管理模型

Kubernetes 将所有基础设施抽象为资源对象。集群管理的本质是操作这些资源。

概念 说明
最小管理单元 Pod(不是容器)
Pod 管理方式 一般通过 Pod 控制器(Deployment / StatefulSet 等)间接管理
服务访问 Service 资源
数据持久化 Volume / PV / PVC

三种资源管理方式对比

方式 命令示例 特点
命令式对象管理 kubectl run nginx-pod --image=nginx:latest --port=80 直接用命令操作,快捷但不易追溯
命令式对象配置 kubectl create -f nginx-pod.yaml 命令+配置文件,可重复执行
声明式对象配置 kubectl apply -f nginx-pod.yaml 声明期望状态,支持自动 diff 和增量更新

kubectl 命令语法

复制代码
kubectl [command] [type] [name] [flags]
字段 含义 示例
command 对资源执行的操作 get、create、delete、describe
type 资源类型 pod、deployment、service
name 资源名称(大小写敏感) web1、testpod
flags 额外可选参数 -o yaml、-n default

常用操作:

复制代码
kubectl get pod                           # 查看所有 pod
kubectl get pod pod_name                  # 查看指定 pod
kubectl get pod pod_name -o yaml          # 以 yaml 格式展示结果
kubectl api-resources                     # 列出集群支持的所有资源类型

1. Namespace 管理

复制代码
kubectl get namespaces
kubectl create namespace lin
kubectl delete namespace lin

2. Pod 基础操作

创建与查看

复制代码
kubectl run lin --image nginx:latest
kubectl get pods -o wide
kubectl describe pod lin1
kubectl delete pod lin1
kubectl delete pods --all

集群信息

复制代码
kubectl version
kubectl cluster-info

3. Deployment 控制器

创建 Deployment

复制代码
kubectl create deployment web1 --replicas 2 --image myapp:v1

查看与编辑

复制代码
kubectl get deployments.apps
kubectl edit deployments.apps web1

更新副本数(patch)

复制代码
kubectl patch deployments.apps web1 -p '{"spec":{"replicas":1}}'

暴露服务

复制代码
kubectl expose deployment web1 --port 80 --target-port 80
kubectl expose deployment web1 --port 80 --target-port 80 --type NodePort
kubectl describe svc web1
curl 10.101.114.159

查看日志

复制代码
kubectl logs pods/web1-59647bb49-9kcx2

获取帮助

复制代码
kubectl explain deployment
kubectl explain deployment.spec

4. 容器交互

attach 进入运行中的 Pod

复制代码
kubectl run -it testpod --image busybox:latest
# Ctrl+PQ 退出但不终止容器
kubectl attach pods/testpod -it

exec 在容器内执行命令

复制代码
kubectl run testpod1 --image nginx:latest
kubectl exec -it pods/testpod1 -c testpod1 -- /bin/bash

cp 文件复制

复制代码
kubectl cp testpod1:/usr/share/nginx/html/index.html /mnt/test
echo lin > /mnt/test
kubectl cp /mnt/test testpod1:/usr/share/nginx/html/index.html
curl 10.244.1.7

5. 滚动发布与回滚

创建并查看发布状态

复制代码
kubectl create deployment web1 --image myapp:v1 --replicas 2 \
  --dry-run=client -o yaml > web1.yml
kubectl apply -f web1.yml
kubectl rollout status deployment web1

重启

复制代码
kubectl rollout restart deployment web1

扩缩容

复制代码
kubectl scale deployment web1 --replicas 4
kubectl scale deployment web1 --replicas 1

标签操作

复制代码
kubectl get pods --show-labels
kubectl label pods web1-98bb59bf5-9txw5 app-
kubectl label pods web1-98bb59bf5-9txw5 app=web1

6. 自主式 Pod vs 控制器管理 Pod

自主式 Pod

复制代码
kubectl run lin --image nginx:latest
维度 说明
优点 配置灵活,适合学习调试和一次性任务
缺点 无自动恢复、无滚动更新、无 HPA、管理成本高

控制器管理 Pod(Deployment)

复制代码
kubectl create deployment web1 --image myapp:v1 --replicas 2 \
  --dry-run=client -o yaml > web1.yml
kubectl apply -f web1.yml
能力 说明
自动故障恢复 Pod 删除后自动重建
健康检查 存活探针、就绪探针
滚动更新 逐步替换旧版本
回滚 一键回退到指定 revision
HPA 基于 CPU/内存自动扩缩容
服务发现 Service 自动关联 Pod

版本更新与回滚

复制代码
kubectl set image deployments web1 myapp=myapp:v2
kubectl annotate deployments.apps web1 \
  kubernetes.io/change-cause="myapp:v2" --overwrite
kubectl rollout history deployment web1
kubectl rollout undo deployment web1 --to-revision 1

7. YAML 部署 Pod(完整字段说明)

复制代码
apiVersion: v1
kind: Pod
metadata:
  name: testpod
  namespace: default
spec:
  restartPolicy: Always
  containers:
  - name: nginx
    image: nginx:1.24
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      protocol: TCP
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
字段 含义
apiVersion K8s API 版本,Pod 固定为 v1
kind 资源类型
metadata.name Pod 名称,同 namespace 唯一
metadata.namespace 所属命名空间
spec.restartPolicy 重启策略:Always / OnFailure / Never
spec.containers\[\].name 容器名称
spec.containers\[\].image 容器镜像
imagePullPolicy IfNotPresent / Always / Never
containerPort 容器监听端口
resources.requests 调度时请求的最小资源
resources.limits 容器可使用的最大资源

8. 多容器 Pod

复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  containers:
  - image: myapp:v1
    name: testpod
  - image: busyboxplus:latest
    name: busybox
    command:
    - /bin/sh
    - -c
    - sleep 10000

同一 Pod 内的容器共享 Network、IPC、UTC namespace。

验证:

复制代码
kubectl apply -f tastpod.yaml
kubectl exec -it pods/testpod -c busybox -- /bin/sh
curl 127.0.0.1

9. hostPort 端口映射

复制代码
spec:
  containers:
  - image: myapp:v1
    name: testpod
    ports:
    - name: http
      containerPort: 80
      hostPort: 80
      protocol: TCP

访问方式:curl <节点IP>:80


10. 环境变量注入

复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mysql
  name: mysql
spec:
  containers:
  - image: mysql:8.0
    name: mysql8
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123"
  - image: phpmyadmin:latest
    name: mysqladmin
    env:
    - name: PMA_ARBITRARY
      value: "1"
    ports:
    - name: phpadminport
      containerPort: 80
      hostPort: 80
      protocol: TCP

11. 节点选择器(nodeSelector)

复制代码
spec:
  nodeSelector:
    kubernetes.io/hostname: node2

Pod 只会被调度到标签匹配的节点上。


12. 共享宿主机网络(hostNetwork)

复制代码
spec:
  hostNetwork: true

容器内 ifconfig 看到的是宿主机的网络接口。


13. 资源限制与 QoS 优先级

requests 与 limits 关系 QoS 等级 节点压力时行为
均未设置 BestEffort 最先被驱逐
requests < limits Burstable 中间优先级
requests = limits Guaranteed 最后被驱逐

验证:

复制代码
kubectl describe pods testpod | grep "QoS Class:"

14. 重启策略

restartPolicy 行为
Always 容器退出即重启(默认)
OnFailure 非零退出码才重启
Never 不重启

示例(Always + sleep 30):

复制代码
spec:
  restartPolicy: Always
  containers:
  - image: busybox:latest
    name: busybox
    command: ["/bin/sh", "-c", "sleep 30"]

Pod 状态变化:Running → Completed → Running(RESTARTS 递增)。


15. Pod 生命周期:Init 容器

Init 容器在应用容器启动前按顺序运行,必须全部成功完成,应用容器才会启动。

复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: web1
  name: web1
spec:
  initContainers:
  - name: busybox
    image: busybox:latest
    command:
    - /bin/sh
    - -c
    - "until test -e /testfile; do echo waiting; sleep 2; done"
  containers:
  - image: myapp:v1
    name: web1
  restartPolicy: Always

在另一个终端创建 /testfile 后,Init 容器完成,应用容器启动。


16. 探针

探针类型

探针 作用 失败后果
livenessProbe 检测容器是否存活 kubelet 杀容器并按重启策略处理
readinessProbe 检测容器是否就绪 从 Service 的 Endpoints 中摘除 IP
startupProbe 检测应用是否已启动 启动期间禁用另两种探针;失败则重启

存活探针(TCP Socket)

复制代码
livenessProbe:
  tcpSocket:
    port: 80
  initialDelaySeconds: 3
  periodSeconds: 1
  timeoutSeconds: 1

就绪探针(HTTP GET)

复制代码
readinessProbe:
  httpGet:
    path: /index.html
    port: 80
  initialDelaySeconds: 3
  periodSeconds: 2
  timeoutSeconds: 1

删除 /usr/share/nginx/html/index.html 后,Pod IP 从 Endpoints 中移除,Service 不再转发流量到该 Pod。恢复文件后自动加回。


附录:常用命令速查表

场景 命令
查看所有资源类型 kubectl api-resources
查看 Pod 详情 kubectl describe pod <name>
查看 Deployment 历史 kubectl rollout history deployment <name>
回滚到指定版本 kubectl rollout undo deployment <name> --to-revision=N
实时查看 Pod 状态 kubectl get pods -w
进入容器执行命令 kubectl exec -it <pod> -c <container> -- /bin/bash
从 Pod 拷文件到本地 kubectl cp <pod>:<path> <local>
从本地拷文件到 Pod kubectl cp <local> <pod>:<path>
查看资源 YAML 定义帮助 kubectl explain <resource>.<field>
相关推荐
高卧怡怡1 小时前
Kubernetes的控制器实验
云原生·容器·kubernetes
xzl041 小时前
Ubuntu24.04 生产环境 Docker(全国内源)
运维·docker·容器
腾讯数据架构师2 小时前
摩尔线程 GPU 怎么接入 Kubernetes 跑 DeepSeek?CubeStudio 摩尔线程(MUSA)适配实操
人工智能·云原生·容器·kubernetes·开源·mlops·maas
明王明王2 小时前
从零搭建一个单节点 K8S 可观测实验室(十三):总结——这个实验室如何服务工作、学习和开源项目
学习·kubernetes·开源
μθημα2 小时前
K8s Pod 管理实战:虚拟机环境下的具体命令与步骤
java·docker·kubernetes
阿里云云原生3 小时前
企业级实时数据平台建设:利用存算分离 Kafka 实现低成本、高可靠入湖
分布式·阿里云·云原生·kafka
2301_780789664 小时前
WAF与Web应用安全的深度融合:从边界防护到业务风控
运维·服务器·网络·云原生·ddos
ylj_dev4 小时前
从 0 构建 AI Workload Platform(八):受限执行环境与 Kubernetes
docker·容器·kubernetes·分布式系统·ai工作流·容器安全·ai infra
sryyd_024 小时前
Kubernetes 控制器完全指南:从原理到实战
云原生·容器·kubernetes