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同時提供相同的服務,不僅可以確保高可用性,還能提升整體服務的容量。
運作機制
在同一個ReokicaSet下的其中任一個Container故障,Kubernetes會啟動復回機制,將自動建立一個新的Container,讓整體ReplicaSet保持一個固定的數量,維持高可用性及服務容量。
建立一個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
查看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
步驟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
~ END ~