创建和管理pod

创建和管理pod

一、什么是 Pod

Pod 是 Kubernetes 中最小的可部署单元,封装一个或多个紧密关联的容器,共享网络、存储和运行时上下文。

  • 核心特性

    • 最小部署单元,代表一个应用实例。
    • 单容器 Pod:最常见模式,独立服务单元。
    • 多容器 Pod:适用于紧密协作场景(如主应用 + Sidecar 容器)。
    • 包含 Pause 容器(根容器),管理共享命名空间和资源。

二、Pod 与容器

  1. Pod 作为最小单元的原因

    • 提供容器间资源共享(网络、存储)。
    • 简化调度和生命周期管理。
    • 确保关联容器协同启停。
  2. 单容器 Pod 示例

单容器 Pod 配置(nginx-pod.yaml)

apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest


3. **多容器 Pod 示例**:

yaml

```yaml
# 多容器 Pod 配置(multi-container-pod.yaml)
spec:
  containers:
  - name: app
    image: my-app
  - name: log-agent
    image: fluentd
    volumeMounts:
    - name: logs
      mountPath: /var/log
  volumes:
  - name: logs
    emptyDir: {}  # 临时共享存储
  1. 初始化容器(Init Containers)

    yaml

    # 带初始化容器的配置(init-container-pod.yaml)
    spec:
      initContainers:
      - name: init-db
        image: busybox
        command: ['sh', '-c', 'until nslookup mysql-service; do echo waiting; sleep 2; done']
      containers:
      - name: app
        image: my-app
    

三、Pod 的 YAML 定义

yaml

# 完整 Pod 定义示例(pod-example.yaml)
apiVersion: v1           # 固定为 v1(核心 API)
kind: Pod
metadata:
  name: my-pod           # 唯一名称
  namespace: default     # 所属命名空间(默认 default)
  labels:                # 标签(用于筛选)
    app: web
    env: dev
spec:
  containers:
  - name: nginx          # 容器名称(Pod 内唯一)
    image: nginx:1.25    # 镜像地址
    imagePullPolicy: IfNotPresent  # 镜像拉取策略
    ports:
    - containerPort: 80  # 暴露端口(仅文档说明)
      protocol: TCP
    resources:           # 资源配额
      requests:          # 最小需求
        memory: "128Mi"
        cpu: "0.5"
      limits:            # 最大限制
        memory: "256Mi"
        cpu: "1"
    volumeMounts:        # 挂载存储卷
    - name: logs-volume
      mountPath: /var/log/nginx
  volumes:               # Pod 级存储卷
  - name: logs-volume
    emptyDir: {}         # 临时目录(Pod 删除后数据丢失)

四、Pod 的生命周期

  1. 阶段(Phase)

    • Pending:已提交但未调度或镜像下载中。
    • Running:至少一个容器运行中。
    • Succeeded:所有容器正常终止(退出码 0)。
    • Failed:至少一个容器异常终止(退出码非 0)。
    • Unknown:无法获取状态(通信故障)。
  2. 重启策略(restartPolicy)

    • Always:始终重启(默认,适用于服务)。
    • OnFailure:仅异常退出时重启(适用于任务)。
    • Never:不重启(依赖控制器管理)。
  3. 生命周期配置示例

    yaml

    # 带钩子和探针的 Pod 配置(lifecycle-demo.yaml)
    apiVersion: v1
    kind: Pod
    metadata:
      name: lifecycle-demo
    spec:
      initContainers:
      - name: init-db
        image: busybox
        command: ["sh", "-c", "until nslookup mysql; do sleep 2; done"]
      containers:
      - name: nginx
        image: nginx:latest
        lifecycle:
          postStart:  # 容器启动后执行
            exec:
              command: ["/bin/sh", "-c", "echo 'Started' > /usr/share/nginx/html/start.html"]
          preStop:   # 容器终止前执行
            exec:
              command: ["nginx", "-s", "quit"]
        livenessProbe:  # 存活探针
          tcpSocket:
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 20
        readinessProbe:  # 就绪探针
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
      terminationGracePeriodSeconds: 60  # 优雅终止宽限期
    

五、Pod 的健康检查机制

探针类型作用失败处理示例配置(HTTP 方式)
Liveness Probe检测容器是否存活重启容器livenessProbe: httpGet: path: / port: 80
Readiness Probe检测容器是否就绪从 Service 移除流量readinessProbe: httpGet: path: /ready port:80
Startup Probe检测应用是否启动完成重启容器直到成功startupProbe: tcpSocket: port: 8080

关键参数

  • initialDelaySeconds:首次探测延迟(秒)。
  • periodSeconds:探测周期(秒,默认 10)。
  • timeoutSeconds:超时时间(秒,默认 1)。
  • failureThreshold:连续失败阈值(默认 3)。

六、创建多容器 Pod

# 1. 创建配置文件
cat > two-containers-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: two-containers-pod
spec:
  restartPolicy: Never
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:
  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  - name: busybox-container
    image: busybox
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the busybox container > /pod-data/index.html"]
EOF

# 2. 创建 Pod
kubectl apply -f two-containers-pod.yaml

# 3. 查看 Pod 状态(YAML 格式)
kubectl get pod two-containers-pod --output=yaml

# 4. 进入 nginx 容器验证共享文件
kubectl exec -it two-containers-pod -c nginx-container -- /bin/bash
# 在容器内执行:
curl localhost
exit

# 5. 通过 Pod IP 访问
POD_IP=$(kubectl get pod two-containers-pod -o jsonpath='{.status.podIP}')
curl $POD_IP

# 6. 删除 Pod
kubectl delete -f two-containers-pod.yaml

七、为 Pod 及其容器设置资源配额

# 1. 创建带资源配额的配置文件
cat > resources-limit-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: resources-limit-pod
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        cpu: 200m
        memory: 400Mi
      requests:
        cpu: 100m
        memory: 200Mi
  - name: stress
    image: polinux/stress
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
EOF

# 2. 创建 Pod
kubectl apply -f resources-limit-pod.yaml

# 3. 查看 Pod 状态
kubectl get pod
kubectl get pod resources-limit-pod --output=yaml

# 4. 测试资源超限(修改配置文件)
cat > resources-limit-pod-new.yml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: resources-limit-pod
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        cpu: 200m
        memory: 400Mi
      requests:
        cpu: 100m
        memory: 200Mi
  - name: stress
    image: polinux/stress
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "500M", "--vm-hang", "1"]  # 超限
EOF

# 5. 应用新配置并观察状态
kubectl apply -f resources-limit-pod-new.yml
kubectl get pod -w  # 监视状态(Ctrl+C 终止)

# 6. 查看详细信息(确认 OOM 终止)
kubectl describe pod resources-limit-pod

# 7. 删除 Pod
kubectl delete -f resources-limit-pod-new.yml

八、实现 Pod 容器的健康检查

# 1. 创建健康检查配置文件
cat > liveness-probe-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: liveness-probe-pod
spec:
  containers:
  - name: liveness-probe
    image: nginx
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 10  # 启动后 10 秒开始探测
      timeoutSeconds: 2        # 超时时间 2 秒
      periodSeconds: 30        # 探测周期 30 秒
      failureThreshold: 3      # 连续 3 次失败重启
EOF

# 2. 创建 Pod
kubectl apply -f liveness-probe-pod.yaml

# 3. 查看状态(确认正常运行)
kubectl get pod
kubectl describe pod liveness-probe-pod

# 4. 删除 Pod
kubectl delete pod liveness-probe-pod

开始探测
timeoutSeconds: 2 # 超时时间 2 秒
periodSeconds: 30 # 探测周期 30 秒
failureThreshold: 3 # 连续 3 次失败重启
EOF

2. 创建 Pod

kubectl apply -f liveness-probe-pod.yaml

3. 查看状态(确认正常运行)

kubectl get pod
kubectl describe pod liveness-probe-pod

4. 删除 Pod

kubectl delete pod liveness-probe-pod








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值