kubernetes k8s container ReplicaSet Deployment Rolling Update Kubectl Create Service

For K8S Beginner EP 7:透過Kubernetes ReplicaSet機制部署一群Container

前言

此前,建立一個Pod內含一個Container,這是最標準及簡單的情境;實務上,Kubernetes賦予應用程式高可用性的能力,最基本的方式就是「橫向擴展」,簡言之就是「建立多個相同服務的Pod」來同時提供服務,這時候,就需要ReplicaSet這個資源類型。

ReplicaSet顧名思義就是「一群副本」,可以指定特定的數量,讓Kubernetes自動建立多個Pod,並將他們匡在一起,邏輯上看起來就像是一個服務,若有服務故障,還支援自動重啟Pod,讓服務盡量做到不中斷。

Kubernetes ReplicaSet官方說明:Link

Kubernetes ReplicaSet基礎知識與運作機制

基礎知識

ReplicaSet轄下掌管多個Pod,如下圖,這些Pod有一個特色,他們都是一模一樣內容的,包含裡面的Container、資源規格、設定…等,以此來確保多個Pod同時提供相同的服務,不僅可以確保高可用性,還能提升整體服務的容量。

kubernetes replicaset

運作機制

在同一個ReokicaSet下的其中任一個Container故障,Kubernetes會啟動復回機制,將自動建立一個新的Container,讓整體ReplicaSet保持一個固定的數量,維持高可用性及服務容量。

kubernetes replicaset crashes recovery

建立一個Kubernetes ReplicaSet

步驟1:建立一個replicaset.yaml檔案。

步驟2:先寫入Kubernetes YAML檔案的基本四個元素:

apiVersion:
kind:
metadata:
spec:

步驟3:指定apiVersion為apps/v1,注意喔,不再只是v1而已,ReplicaSet被定義在apps/v1這個API版本中!

apiVersion: apps/v1

步驟4:指定kind為ReplicaSet

kind: ReplicaSet

步驟5:描述一下metadata。

metadata:                            # metadata部分
  name: nginx-server-replicaset      # 設定這個ResplicaSet名稱
  labels:                            # 設定幾個labels
    app: frontend                    # 標籤:key=app, key=frontend
    env: production                  # 標籤:key=env, key=produciton

步驟6:spec是重頭戲,ReplicaSet的spec內含有三個基本的部分:

spec:              # spec部分
  selector:        # 透過selector來選定要被這個ReplicaSet管理的Container
  replicas:        # 設定要建立副本的數量
  template:        # 被建立Container的規格

步驟7:設定spec->selector:

spec:
  selector:
    matchLabels:        # 透過labels對應的方式讓selector選到要被管理的Container 
      app: frontend     # 標籤:key=app, key=frontend

步驟8:設定spec->replicas:

spec:
  selector:
    replicas: 2         # 設定這個ReplicaSet轄下維持2個Container副本

步驟9:設定spec->template;這裡特別說明一下,要放的內容是Container的規格,需要放入metadata與sepc兩個部分,參考上一篇建立Pod的內容:

spec:
  template:                       # template轄下放入metadata與spec
    metadata:                     # 指定Container的metadata描述
      name: nginx-server          # 設定Container名為nginx-server
      labels:                     # 設定Lables,讓selector選到
        app: frontend             # 設定selector指定的標籤,一樣是app:frontend
    spec:                         # 指定Container的spec
      containers:
        - name: nginx-server      # 指定Container的名稱
          image: nginx            # 指定Container建立所需的image

步驟10:完整的YAML內容如下:

apiVersion: apps/v1
kind: ReplicaSet
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

步驟11:透過kubectl create來建立這個ReplicaSet,指令與成功訊息如下:

$ kubectl create -f replicaset.yaml
kubectl create -f replicaset

查看ReplicaSet的細節

步驟1:指令kubectl get all

# 有兩個Pod,數量對應到spec->replicas: 2
NAME                                READY   STATUS    RESTARTS   AGE
pod/nginx-server-replicaset-4xqm7   1/1     Running   0          6m37s
pod/nginx-server-replicaset-rcxlz   1/1     Running   0          6m37s

# Kubernetes預設的服務
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   6d5h

# 剛才建立的ReplicaSet,名為nginx-server-replicaset
NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-server-replicaset   2         2         2       6m37s

步驟2:指令kubectl describe

$ kubectl describe replicaset nginx-server-replicaset
# ReplicaSet名為nginx-server-replicaset
Name:         nginx-server-replicaset
Namespace:    default
# selector管理同樣有app=frontend標籤的Container
Selector:     app=frontend
# ReplicaSet的標籤
Labels:       app=frontend
              env=production
Annotations:  <none>
# 指定2個Container副本
Replicas:     2 current / 2 desired
# 顯示Pod的狀態
Pods Status:  2 Running / 0 Waiting / 0 Succeeded / 0 Failed
# Pod的Spec,對應spec->template
Pod Template:
  Labels:  app=frontend
  Containers:
   nginx-server:
    Image:        nginx
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
# ReplicaSet的事件清單
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  9m51s  replicaset-controller  Created pod: nginx-server-replicaset-4xqm7
  Normal  SuccessfulCreate  9m50s  replicaset-controller  Created pod: nginx-server-replicaset-rcxlz

驗證Kubernetes ReplicaSet自動回覆機制

步驟1:使用kubectl get pod查詢Pod清單。

NAME                            READY   STATUS    RESTARTS   AGE
nginx-server-replicaset-4xqm7   1/1     Running   0          16m
nginx-server-replicaset-rcxlz   1/1     Running   0          16m

步驟2:使用kubectl delete刪除一個Pod。

$ kubectl delete pod nginx-server-replicaset-4xqm7
kubectl delete pod

步驟3:再透過kubectl get pod查詢Pod狀態:

NAME                            READY   STATUS              RESTARTS   AGE
nginx-server-replicaset-2ft6v   0/1     ContainerCreating   0          2s
nginx-server-replicaset-rcxlz   1/1     Running             0          17m

可以看到被刪除的Pod: nginx-server-replicaset-4xqm7已經消失,取而代之的是一個新的Pod,系統自動給一個新的名字,狀態是”ContainerCreating”,Ready數量為0/1,稍待一會兒,再查詢一次,所有Pod的狀態都為Running,恢復正常。

NAME                            READY   STATUS    RESTARTS   AGE
nginx-server-replicaset-2ft6v   1/1     Running   0          6s
nginx-server-replicaset-rcxlz   1/1     Running   0          17m

刪除ReplicaSet

若要刪除ReplicaSet,並不是把Pod刪除掉就可以,因為ReplicaSet會不斷的重生這些Pod;只要透過kubectl delete replicaset指令來刪除,即可真的刪除ReplicaSet,指令如下:

$ kubectl delete replicaset 
kubectl delete replicaset

~ END ~


, ,

Related posts

Latest posts