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>

更多推荐