Pod详解:Kubernetes中最小的可部署单元

Pod详解:Kubernetes中最小的可部署单元

前言

Pod是Kubernetes中最核心、最基本的概念之一。理解Pod的工作原理对于掌握Kubernetes至关重要。

什么是Pod?

Pod是Kubernetes中的最小可部署计算单元,可以包含一个或多个共享网络和存储的容器。

Pod的特点

  • 共享网络命名空间:同一Pod内容器通过localhost通信
  • 共享存储卷:容器间数据共享
  • 原子性:Pod中的容器一起调度、一起部署
  • 临时性:Pod被设计为可替换的单元

Pod的两种类型

1. 单容器Pod


apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    ports:
    - containerPort: 80

2. 多容器Pod(Sidecar模式)


apiVersion: v1
kind: Pod
metadata:
  name: webapp
spec:
  containers:
  - name: app
    image: myapp:v1
    ports:
    - containerPort: 8080
  - name: log-agent
    image: fluentd:latest
    volumeMounts:
    - name: logs
      mountPath: /var/log/app
  volumes:
  - name: logs
    emptyDir: {}

Pod生命周期


Pending --> Running --> Succeeded/Failed
阶段 说明
Pending Pod被创建,等待调度
Running Pod绑定到节点,至少一个容器运行
Succeeded 所有容器成功终止
Failed 至少一个容器失败终止
Unknown Pod状态无法获取

Pod配置详解

资源限制


spec:
  containers:
  - name: app
    image: myapp:v1
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 500m
        memory: 256Mi

环境变量


spec:
  containers:
  - name: app
    image: myapp:v1
    env:
    - name: DB_HOST
      value: mysql-service
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secrets
          key: password
    - name: CONFIG_PATH
      valueFrom:
        configMapKeyRef:
          name: app-config
          key: config.path

健康检查


spec:
  containers:
  - name: app
    image: myapp:v1
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20
      timeoutSeconds: 5
      failureThreshold: 3
    readinessProbe:
      httpGet:
        path: /ready
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 3
      failureThreshold: 3
    startupProbe:
      httpGet:
        path: /startup
        port: 8080
      failureThreshold: 30
      periodSeconds: 10

Volume挂载


spec:
  containers:
  - name: app
    image: myapp:v1
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
    - name: data-volume
      mountPath: /data
  volumes:
  - name: config-volume
    configMap:
      name: app-config
  - name: data-volume
    persistentVolumeClaim:
      claimName: app-pvc

静态Pod

静态Pod由kubelet直接管理,不通过API Server。


# 创建静态Pod目录
mkdir -p /etc/kubernetes/manifests

# 创建静态Pod
cat > /etc/kubernetes/manifests/static-nginx.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: static-nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.25
EOF

# 重启kubelet
systemctl restart kubelet

# 查看静态Pod
kubectl get pods -A | grep static

Pod调度

节点选择器


spec:
  nodeSelector:
    disktype: ssd
    environment: production

节点亲和性


spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - zone-a
            - zone-b

Pod反亲和性


spec:
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - cache
        topologyKey: kubernetes.io/hostname

Pod调试


# 查看Pod详情
kubectl describe pod 

# 查看Pod日志
kubectl logs 
kubectl logs  -c 

# 进入Pod容器
kubectl exec -it  -- /bin/bash

# 查看Pod事件
kubectl get events --sort-by='.metadata.creationTimestamp'

总结

Pod是Kubernetes的核心概念,掌握Pod的配置和使用是进阶的前提。

发表回复

后才能评论