Kubernetes Pod 详解与 YAML 配置实战指南

一、Pod 基础概念详解

1.1 Pod 的核心概念

Pod 是 Kubernetes 中的最小部署单元,代表集群中的一个运行进程。一个 Pod 可以包含一个或多个紧密耦合的容器,这些容器共享网络和存储资源。

1.2 Pod 的两种使用方式

单容器 Pod(最常见)
apiVersion: v1
kind: Pod
metadata:
  name: single-container-pod
spec:
  containers:
  - name: nginx
    image: nginx:1.14
多容器 Pod
apiVersion: v1
kind: Pod
metadata:
  name: multi-container-pod
spec:
  containers:
  - name: app
    image: my-app:latest
  - name: sidecar
    image: log-collector:latest

1.3 Pause 容器(基础容器)

在每个 Pod 中,都有一个特殊的 ​​Pause 容器​​,负责提供 Pod 的 Linux 命名空间基础:

  • 维护整个 Pod 的网络和存储空间

  • 其他容器共享其网络和存储资源

  • 对用户透明,自动运行

1.4 Pod 中的共享资源

网络共享
  • 每个 Pod 分配唯一 IP 地址

  • Pod 内所有容器共享该 IP 和端口

  • 容器间通过 localhost直接通信

  • 与外界通信需使用宿主机端口映射

存储共享
  • Pod 可指定多个共享 Volume

  • 所有容器都可访问共享存储

  • 确保容器重启后数据不丢失

二、Pod 容器的分类

2.1 基础容器(Infrastructure Container)

# 查看 kubelet 配置中的基础容器镜像
cat /opt/kubernetes/cfg/kubelet | grep pause

2.2 初始化容器(Init Containers)

特性
  • 必须在应用容器启动前运行完成

  • 按顺序执行,前一个成功后才运行下一个

  • 提供阻塞或延迟应用容器启动的机制

使用场景
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

2.3 应用容器(Main Container)

  • 并行启动

  • 运行业务逻辑的主要容器

三、Pod 的核心配置

3.1 镜像拉取策略(imagePullPolicy)

策略

说明

使用场景

IfNotPresent

本地有则用本地,否则拉取

默认策略,生产环境推荐

Always

每次都拉取新镜像

开发环境,需要最新版本

Never

只用本地镜像

离线环境

spec:
  containers:
  - name: nginx
    image: nginx:1.15
    imagePullPolicy: IfNotPresent

3.2 重启策略(restartPolicy)

策略

说明

适用控制器

Always

总是重启

Deployment、StatefulSet

OnFailure

失败时重启

Job、CronJob

Never

从不重启

自主式Pod

spec:
  restartPolicy: Always

四、Pod 资源限制

4.1 资源请求与限制

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

4.2 资源单位详解

CPU 资源单位
  • 1 CPU= 1000m

  • 500m= 0.5个CPU

  • 100m= 0.1个CPU

内存资源单位
  • 1 Gi = 1024 Mi

  • 1 Mi = 1024 Ki

  • 1 G = 1000 M

  • 1 M = 1000 K

4.3 实战案例

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: web
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: db
    image: mysql
    resources:
      requests:
        memory: "512Mi"
        cpu: "0.5"
      limits:
        memory: "1Gi"
        cpu: "1"

五、健康检查(探针)

5.1 三种探针类型

探针类型

作用

失败后果

livenessProbe

检查容器是否运行

重启容器

readinessProbe

检查是否就绪接收请求

从Service endpoints中剔除

startupProbe

检查应用是否启动

在成功前其他探针无效

5.2 三种检查方法

exec 方式
livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5
httpGet 方式
livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
    httpHeaders:
    - name: Custom-Header
      value: Awesome
  initialDelaySeconds: 3
  periodSeconds: 3
tcpSocket 方式
livenessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 20

5.3 就绪检测实战

apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget
spec:
  containers:
  - name: readiness-httpget-container
    image: nginx
    ports:
    - name: http
      containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      initialDelaySeconds: 1
      periodSeconds: 3
    livenessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

六、YAML 配置详解

6.1 YAML 语法规范

  • 使用空格缩进,禁止使用Tab

  • 缩进空格数不重要,但要同级对齐

  • ---表示YAML文件开始

  • #表示注释

6.2 快速生成YAML模板

# 生成Pod模板
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml

# 生成Deployment模板
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml

# 导出现有资源配置
kubectl get svc nginx-service -o yaml

6.3 完整Deployment配置示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /index.html
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5

6.4 Service配置示例

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  selector:
    app: nginx

七、端口类型详解

7.1 四种端口对比

端口类型

作用

示例

containerPort

容器内部暴露的端口

80

targetPort

Pod的端口,Service转发目标

80

port

Service的端口,集群内部访问

80

nodePort

节点端口,外部访问入口

30080-32767

7.2 端口映射关系

外部用户 → nodeIP:nodePort → Service:port → Pod:targetPort → Container:containerPort

八、实战技巧总结

8.1 常用命令速查

# 查看API版本
kubectl api-versions

# 查看资源字段说明
kubectl explain pods.spec.containers

# 动态查看Pod状态
kubectl get pods -w

# 查看Pod详细事件
kubectl describe pod <pod-name>

# 进入Pod容器
kubectl exec -it <pod-name> -- bash

8.2 故障排查命令

# 查看Pod日志
kubectl logs <pod-name>

# 查看特定容器日志
kubectl logs <pod-name> -c <container-name>

# 查看节点资源分配
kubectl describe nodes <node-name>

# 查看Endpoints
kubectl get endpoints

8.3 最佳实践建议

  1. ​资源设置​​:始终设置requests和limits,避免资源竞争

  2. ​健康检查​​:配置完整的探针,确保应用稳定性

  3. ​镜像策略​​:生产环境使用IfNotPresent,开发环境可用Always

  4. ​版本控制​​:使用稳定的API版本,避免使用beta版本

  5. ​标签管理​​:使用有意义的标签,便于服务发现和管理

通过本文的详细讲解和实战案例,您应该能够深入理解Kubernetes Pod的各个方面,并能够熟练编写和管理YAML配置文件。记得在实际工作中多练习、多实践,逐步掌握Kubernetes的强大功能。

更多推荐