For K8S Beginner EP 8:部署Kubernetes Deployment,並使用版本管理與回滾機制
Kubernetes Deployment的用途
Kubernetes除了透過ReplicaSet提供高可用性及提升服務容量外,若要管理ReplicaSet、新舊版本的ReplicaSet要Roll Back或更新,就需要用到Kubernetes Deployment機制。
Kubernetes Deployment官方說明:Link
本篇將部署一個Deployment,新舊版本(舊:v1、新:v2)使用不同的Image,舊版本(v1)使用nginx,新版本(v2)使用httpd (Apache HTTP Server)。
部署Deployment
步驟1:Deployment的YAML內容與ReplicaSet基本上只有kind不同,需指定kind為Deployment。
apiVersion: apps/v1 # 同樣是指定api版本為apps/v1
kind: Deployment # 指定kind為Deployment
步驟2:因為是相同的內容,只有名稱稍微調整,所以這邊直接提供YAML內容(檔名為deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-server-replicaset
labels:
app: frontend
env: production
spec:
selector:
matchLabels:
app: frontend
replicas: 2
template:
metadata:
name: nginx-server
labels:
app: frontend
spec:
containers:
- name: nginx-server
image: nginx
步驟3:使用kubectl create來部署Deployment:
$ kubectl create -f deployment.yaml
查看Kubernetes Deployment
步驟1:使用kubectl get all:
# 這個Deployment的ReplicaSet下有兩個Pod
NAME READY STATUS RESTARTS AGE
pod/nginx-server-deployment-6c6f9cff4f-nz4b4 1/1 Running 0 2m43s
pod/nginx-server-deployment-6c6f9cff4f-s2xv8 1/1 Running 0 2m43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d9h
# 可以看到部署了一個Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-server-deployment 2/2 2 2 2m43s
# 還有一個ReplicaSet
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-server-deployment-6c6f9cff4f 2 2 2 2m43s
步驟2:使用kubectl describe看一下Deployment:
Name: nginx-server-deployment
Namespace: default
CreationTimestamp: Sat, 28 Jan 2023 23:32:26 +0800
Labels: app=frontend
env=production
# 顯示版本為revision: 1,後面數字會隨更新的次數累加
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=frontend
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=frontend
Containers:
nginx-server:
# 使用nginx這個image
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-server-deployment-67b95b8b9c (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 20s deployment-controller Scaled up replica set nginx-server-deployment-67b95b8b9c to 2
更新版本:改image為httpd
步驟1:將sepc->template->spec->containers->image從nginx改為httpd:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-server-replicaset
labels:
app: frontend
env: production
spec:
selector:
matchLabels:
app: frontend
replicas: 2
template:
metadata:
name: nginx-server
labels:
app: frontend
spec:
containers:
- name: nginx-server
image: httpd
步驟2:使用kubeclt apply來更新這個deployment:
$ kubectl apply -f deployment.yaml
執行指令後會顯示警告訊息,如下:
Warning: resource deployments/nginx-server-deployment is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
deployment.apps/nginx-server-deployment configured
原因我們後面再來說明,但其實系統已經完成執行了。
步驟3:此時再使用kubectl describe來查看deployment:
Name: nginx-server-deployment
Namespace: default
CreationTimestamp: Sat, 28 Jan 2023 23:32:26 +0800
Labels: app=frontend
env=production
# 因為更新過image,所以版本累加為2
Annotations: deployment.kubernetes.io/revision: 2
Selector: app=frontend
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=frontend
Containers:
nginx-server:
# v2調整為httpd這個image
Image: httpd
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-server-deployment-6c6f9cff4f (2/2 replicas created)
# 有更多事件,顯示Pod更新image的過程
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 6m12s deployment-controller Scaled up replica set nginx-server-deployment-67b95b8b9c to 2
Normal ScalingReplicaSet 88s deployment-controller Scaled up replica set nginx-server-deployment-6c6f9cff4f to 1
Normal ScalingReplicaSet 84s deployment-controller Scaled down replica set nginx-server-deployment-67b95b8b9c to 1 from 2
Normal ScalingReplicaSet 84s deployment-controller Scaled up replica set nginx-server-deployment-6c6f9cff4f to 2 from 1
Normal ScalingReplicaSet 80s deployment-controller Scaled down replica set nginx-server-deployment-67b95b8b9c to 0 from 1
步驟4:透過kubectl rollout history指令查看版本資訊,一個Deployment之下已經有兩個版本:
$ kubectl rollout history deployment/nginx-server-deployment
註:因為沒有特別下註解,所以CHANGE-CAUSE沒有內容。
回滾版本
步驟1:回滾版本的指令語法:
kubectl rollout undo deployment [Deployment名稱] --to-revision=[版號]
在此,回滾至舊版(v1)指令如下:
$ kubectl rollout undo deployment nginx-server-deployment --to-revision=1
步驟2:使用kubectl describe來查看是否有回滾:
Name: nginx-server-deployment
Namespace: default
CreationTimestamp: Sat, 28 Jan 2023 23:32:26 +0800
Labels: app=frontend
env=production
# 因為回滾版本,所以版號又累加到3,只要有異動,就會一直累加上去
Annotations: deployment.kubernetes.io/revision: 3
Selector: app=frontend
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=frontend
Containers:
nginx-server:
# image已經從v2的httpd改回v1的nginx
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-server-deployment-67b95b8b9c (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 25m deployment-controller Scaled up replica set nginx-server-deployment-67b95b8b9c to 2
Normal ScalingReplicaSet 21m deployment-controller Scaled up replica set nginx-server-deployment-6c6f9cff4f to 1
Normal ScalingReplicaSet 21m deployment-controller Scaled down replica set nginx-server-deployment-67b95b8b9c to 1 from 2
Normal ScalingReplicaSet 21m deployment-controller Scaled up replica set nginx-server-deployment-6c6f9cff4f to 2 from 1
Normal ScalingReplicaSet 20m deployment-controller Scaled down replica set nginx-server-deployment-67b95b8b9c to 0 from 1
Normal ScalingReplicaSet 38s deployment-controller Scaled up replica set nginx-server-deployment-67b95b8b9c to 1 from 0
Normal ScalingReplicaSet 34s deployment-controller Scaled down replica set nginx-server-deployment-6c6f9cff4f to 1 from 2
Normal ScalingReplicaSet 34s deployment-controller Scaled up replica set nginx-server-deployment-67b95b8b9c to 2 from 1
Normal ScalingReplicaSet 30s deployment-controller Scaled down replica set nginx-server-deployment-6c6f9cff4f to 0 from 1
~ END ~