kubernetes k8s container ReplicaSet Deployment Rolling Update Kubectl Create Service

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)。

Kubernetes Deployment

部署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
kubectl create deployment

查看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
kubectl rollout history deployment

註:因為沒有特別下註解,所以CHANGE-CAUSE沒有內容。

回滾版本

步驟1:回滾版本的指令語法:

kubectl rollout undo deployment [Deployment名稱] --to-revision=[版號]

在此,回滾至舊版(v1)指令如下:

$ kubectl rollout undo deployment nginx-server-deployment --to-revision=1
kubectl rollout undo deployment

步驟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 ~


, ,

Related posts

Latest posts