K8S编排 之 Deployment

目录

引入

  • K8S的Pod解决了容器的”超亲密关系”设计

  • K8S的Deployment解决了Pod的”水平扩展/伸缩”设计

使用

1
vim deploy.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20.1
ports:
- containerPort: 80
1
2
3
kubectl apply -f deploy.yml

kubectl get deployments
1
2
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment 3/3 3 3 55s
1
kubectl get pods
1
2
3
4
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-58b9b8ff79-bbjgq 1/1 Running 0 64s
nginx-deployment-58b9b8ff79-ghmww 1/1 Running 0 64s
nginx-deployment-58b9b8ff79-lxcqf 1/1 Running 0 64s

k8s-deployment-01.png

特性

水平扩展

如何水平扩展服务的能力?

1
2
kubectl scale deployment nginx-deployment --replicas=4
# deployment.apps/nginx-deployment scaled
1
kubectl get deployments
1
2
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment 4/4 4 4 87s
1
kubectl get pods
1
2
3
4
5
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-58b9b8ff79-bbjgq 1/1 Running 0 95s
nginx-deployment-58b9b8ff79-ghmww 1/1 Running 0 95s
nginx-deployment-58b9b8ff79-lxcqf 1/1 Running 0 95s
nginx-deployment-58b9b8ff79-nmv2h 1/1 Running 0 19s

上述kubectl apply命令是一种声明式API 即描述”我所期望的[最终]结果” 而命令式操作描述的是”我所想要做的操作”

滚动更新

如何实现服务的平滑升级?

1
2
3
4
5
kubectl delete -f deploy.yml

kubectl apply -f deploy.yml

kubectl get pods
1
2
3
4
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-58b9b8ff79-dzfnj 1/1 Running 0 4s
nginx-deployment-58b9b8ff79-p56jb 1/1 Running 0 4s
nginx-deployment-58b9b8ff79-wlwq4 1/1 Running 0 4s
1
2
vim deploy.yml
# image: nginx:1.21.0
1
2
3
kubectl apply -f deploy.yml

kubectl get pods
1
2
3
4
5
6
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-58b9b8ff79-dzfnj 1/1 Running 0 55s
nginx-deployment-58b9b8ff79-p56jb 1/1 Running 0 55s
nginx-deployment-58b9b8ff79-wlwq4 1/1 Terminating 0 55s
nginx-deployment-6c4ccd94bc-4fz95 1/1 Running 0 3s
nginx-deployment-6c4ccd94bc-5r8wb 0/1 ContainerCreating 0 1s
1
2
# 稍等一会后
kubectl get pods
1
2
3
4
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6c4ccd94bc-4fz95 1/1 Running 0 30s
nginx-deployment-6c4ccd94bc-5r8wb 1/1 Running 0 28s
nginx-deployment-6c4ccd94bc-qdjxp 1/1 Running 0 32s
1
kubectl describe deployment nginx-deployment
1
2
3
4
5
6
7
8
9
10
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 2m11s deployment-controller Scaled up replica set nginx-deployment-58b9b8ff79 to 3
Normal ScalingReplicaSet 79s deployment-controller Scaled up replica set nginx-deployment-6c4ccd94bc to 1
Normal ScalingReplicaSet 77s deployment-controller Scaled down replica set nginx-deployment-58b9b8ff79 to 2
Normal ScalingReplicaSet 77s deployment-controller Scaled up replica set nginx-deployment-6c4ccd94bc to 2
Normal ScalingReplicaSet 75s deployment-controller Scaled down replica set nginx-deployment-58b9b8ff79 to 1
Normal ScalingReplicaSet 75s deployment-controller Scaled up replica set nginx-deployment-6c4ccd94bc to 3
Normal ScalingReplicaSet 73s deployment-controller Scaled down replica set nginx-deployment-58b9b8ff79 to 0

k8s-deployment-02.png

上述新旧replica set中的Pod交替升级的过程 就是滚动更新

回滚更新

服务更新出错时如何回滚?

1
2
vim deploy.yml
# image: nginx:1.121.0 => 错误的镜像名称
1
2
3
kubectl apply -f deploy.yml

kubectl get pods
1
2
3
4
5
NAME                                READY   STATUS             RESTARTS   AGE
nginx-deployment-6c4ccd94bc-4fz95 1/1 Running 0 94m
nginx-deployment-6c4ccd94bc-5r8wb 1/1 Running 0 94m
nginx-deployment-6c4ccd94bc-qdjxp 1/1 Running 0 94m
nginx-deployment-7964764c96-drvjx 0/1 ImagePullBackOff 0 85s
1
2
3
4
5
6
kubectl rollout history deployment/nginx-deployment

kubectl rollout history deployment/nginx-deployment --revision=3
# Image: nginx:1.121.0

kubectl rollout undo deployment/nginx-deployment --to-revision=2
1
kubectl get pods
1
2
3
4
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6c4ccd94bc-4fz95 1/1 Running 0 97m
nginx-deployment-6c4ccd94bc-5r8wb 1/1 Running 0 97m
nginx-deployment-6c4ccd94bc-qdjxp 1/1 Running 0 96m

为了便于查看更新记录 可以添加参数”–record” 形如”kubectl apply -f deploy.yml –record”