上一篇的问题

你跑了一个裸 Pod:

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

然后你删了它:

kubectl delete pod nginx

它就没了。永久消失。

但你的 nginx 不应该消失。它应该一直在跑。

Deployment:管副本的

Deployment 是 K8s 最常用的资源之一。它的作用是:维持一定数量的 Pod 副本

# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80

关键点:

  • replicas: 3 — 你要 3 个 nginx 副本
  • selector.matchLabels — 告诉 Deployment 哪些 Pod 是它管的
  • template — 新创建的 Pod 长什么样

部署

kubectl apply -f nginx-deployment.yaml

验证

kubectl get deployments
# NAME               READY   UP-TO-DATE   AVAILABLE   AGE
# nginx-deployment   3/3     3            3           30s

kubectl get pods -l app=nginx
# NAME                                READY   STATUS    RESTARTS   AGE
# nginx-deployment-6d4f5b7c8-abc12   1/1     Running   0          30s
# nginx-deployment-6d4f5b7c8-def34   1/1     Running   0          30s
# nginx-deployment-6d4f5b7c8-ghi56   1/1     Running   0          30s

3 个 Pod 都跑起来了。

自愈能力

现在删掉一个 Pod:

kubectl delete pod nginx-deployment-6d4f5b7c8-abc12

再看:

kubectl get pods -l app=nginx
# NAME                                READY   STATUS    RESTARTS   AGE
# nginx-deployment-6d4f5b7c8-def34   1/1     Running   0          5m
# nginx-deployment-6d4f5b7c8-ghi56   1/1     Running   0          5m
# nginx-deployment-6d4f5b7c8-jkl78   1/1     Running   0          3s   ← 新创建的

少了一个,Deployment 自动创建了一个新的补上。这就是自愈能力

模拟节点故障

如果把整个节点关掉呢?

# 假设 Pod 在 node2 (192.168.3.57) 上
kubectl get pods -o wide -l app=nginx
# NAME                                READY   STATUS    NODE
# nginx-deployment-6d4f5b7c8-def34   1/1     Running   192.168.3.57
# nginx-deployment-6d4f5b7c8-ghi56   1/1     Running   192.168.3.57
# nginx-deployment-6d4f5b7c8-jkl78   1/1     Running   192.168.3.56

# 关掉 node2
# 几分钟后,Deployment 会把 Pod 重新调度到 node1
kubectl get pods -l app=nginx
# NAME                                READY   STATUS    NODE
# nginx-deployment-6d4f5b7c8-abc99   1/1     Running   192.168.3.56   ← 迁移过来的
# nginx-deployment-6d4f5b7c8-jkl78   1/1     Running   192.168.3.56
# nginx-deployment-6d4f5b7c8-mno11   1/1     Running   192.168.3.56   ← 新建的

Pod 被迁移了。副本数还是 3。

扩容

想加到 5 个副本?

kubectl scale deployment nginx-deployment --replicas=5

或者改 yaml 里的 replicas: 5,然后 kubectl apply

想减到 1 个?

kubectl scale deployment nginx-deployment --replicas=1

删除

不想用了?

kubectl delete deployment nginx-deployment
# 先删 Deployment,再删 Service(如果有的话)

Deployment 删了,它管的 Pod 也会跟着删。

你学到了什么

  1. Deployment 管 Pod 的副本数量
  2. Pod 挂了自动重建——这是 Deployment 的核心价值
  3. 节点挂了 Pod 会自动迁移到其他节点
  4. 扩容缩容一行命令搞定

下一步

你有 3 个 nginx Pod 在跑。但它们只能在集群内部访问——每个 Pod 有自己的 IP,IP 还会变。

你需要一个稳定的入口让别人访问你的服务。这就是 Service 的作用。

下一篇讲 Service:怎么让外部流量找到你的 Pod。

参考资料