Kubernetes入门:Pod与Deployment

Kubernetes(K8s)是容器编排的事实标准,理解Pod和Deployment是入门的第一步。

K8s架构概述

K8s集群由两类节点组成:

Control Plane (Master):

  • API Server:集群的入口,所有操作通过它
  • etcd:分布式KV存储,保存集群状态
  • Scheduler:决定Pod调度到哪个节点
  • Controller Manager:运行各种控制器(Deployment、ReplicaSet等)

Worker Node:

  • kubelet:管理节点上的Pod生命周期
  • kube-proxy:维护网络规则,实现Service的负载均衡
  • Container Runtime:运行容器(containerd、CRI-O等)

Pod

Pod是K8s中最小的调度单元,它包装了一个或多个容器。同一Pod内的容器共享网络命名空间和存储卷。

一个简单的Pod定义:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
    resources:
      requests:
        cpu: "100m"
        memory: "128Mi"
      limits:
        cpu: "200m"
        memory: "256Mi"

直接创建Pod的场景很少——通常由Deployment来管理。

Deployment

Deployment管理一组相同的Pod副本,提供声明式更新、滚动升级和回滚能力。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 15
          periodSeconds: 20

关键字段说明:

  • replicas: 3:维持3个Pod副本
  • selector.matchLabels:通过标签选择管理的Pod
  • strategy:更新策略。RollingUpdate表示滚动升级,maxSurge=1表示升级时最多多创建1个Pod,maxUnavailable=0表示不允许有不可用的Pod
  • template:Pod模板,Deployment根据它创建Pod
  • readinessProbe:就绪探针,通过后Pod才接收流量
  • livenessProbe:存活探针,失败后kubelet重启容器

Deployment与ReplicaSet的关系

Deployment不直接管理Pod,而是通过ReplicaSet:

Deployment
  └── ReplicaSet (当前版本)
        ├── Pod-1
        ├── Pod-2
        └── Pod-3

每次更新Deployment的Pod模板时,会创建一个新的ReplicaSet,逐步扩容新RS、缩容旧RS,实现滚动更新。旧的ReplicaSet默认保留10个(revisionHistoryLimit),用于回滚。

kubectl常用命令

# 创建/更新资源
kubectl apply -f deployment.yaml

# 查看Deployment状态
kubectl get deployments
kubectl describe deployment nginx-deployment

# 查看Pod
kubectl get pods -l app=nginx
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl logs <pod-name> -f          # 实时日志

# 进入Pod
kubectl exec -it <pod-name> -- /bin/bash

# 扩缩容
kubectl scale deployment nginx-deployment --replicas=5

# 更新镜像(触发滚动更新)
kubectl set image deployment/nginx-deployment nginx=nginx:1.22

# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment

# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=2

# 删除资源
kubectl delete -f deployment.yaml

小结

Pod是最小调度单元但不要直接管理它,用Deployment来声明期望状态,K8s会帮你维持。下一步可以学习Service(暴露服务)和Ingress(HTTP路由)。