上一篇的问题
你跑了一个裸 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 也会跟着删。
你学到了什么
- Deployment 管 Pod 的副本数量
- Pod 挂了自动重建——这是 Deployment 的核心价值
- 节点挂了 Pod 会自动迁移到其他节点
- 扩容缩容一行命令搞定
下一步
你有 3 个 nginx Pod 在跑。但它们只能在集群内部访问——每个 Pod 有自己的 IP,IP 还会变。
你需要一个稳定的入口让别人访问你的服务。这就是 Service 的作用。
下一篇讲 Service:怎么让外部流量找到你的 Pod。