前幾天我們將最最基本的一些元件講完了,接著我們要來講稍微進階一些,但依舊基本的一些元件。
首先是 Pod 的進階版 ReplicaSet ,簡單說就是一堆 Pod 的複製人,主要是讓我們的服務可以不用單打獨鬥,可以有需多相同服務共同分擔。
那我們的服務要如何從原本的 Pod 變成 ReplicaSet 呢?
我們可以像下面這個 YAML 檔一樣。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: ubuntu-replicaset
spec:
replicas: 5
minReadySeconds: 10
selector:
matchLabels:
app: ubuntu-pod
template:
metadata:
name: ubuntu-replicaset
labels:
app: ubuntu-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
args:
[
bash,
-c,
'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done',
]
基本上就是把 Pod 外面再套一層殼,加上要預計要開多少個同樣的服務即可。
各位是否記得在 Kubernetes 的 Control Plane 中有個元件叫做 kube-controller-manager ,這個元件會監測 selector
所指定標籤,並將具有指定標籤的 Pod 維護至預期的數量,一旦少了就會自動補上。
成功開起來之後,我們可以透過以下指令查看 ReplicaSet 的狀態。
$ kubectl get replicaset
# or
$ kubectl get rs
或是查看 Pod 數量是否正確。
$ kubectl get pods
# or
$ kubectl get po
而我們也可以手動將其中幾個 Pod 刪除,這時就可以看到 ReplicaSet 自動將缺少的 Pod 補回來。
而 ReplicaSet 只能將服務維持在固定數量,如果我們這時候要更新就必須將 ReplicaSet 砍掉在重新建立,稍微有點麻煩;麻煩一點就算了,服務還會暫時停止一小段時間。因此 Kubernetes 提供了一個更加方便的資源,叫做 Deployment ,可以同時維護多個 ReplicaSet ,我們的服務可以透過指令更新, Kubernetes 會自動將服務在不會中斷的情況下慢慢的過渡到新的狀態,我們的服務就不會因此停止。
apiVersion: apps/v1
kind: Deployment
metadata:
name: ubuntu-deployment
labels:
app: ubuntu-deployment
spec:
replicas: 5
strategy:
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
app: ubuntu-pod
template:
metadata:
name: ubuntu-deployment
labels:
app: ubuntu-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
args:
[
bash,
-c,
'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done',
]
基本上跟 ReplicaSet 差不多,但是多了一個 strategy
讓我們可以選擇更新時的政策,可以保持任何情況下皆有數個服務在線,讓我們的服務不至於中斷。
我們同樣可以使用指令來查看 Deployment 的狀態。
$ kubectl get deployment
# or
$ kubectl get deploy
詳細內容可參考官方文件 ReplicaSet 、 Deployment
那麼就先到這邊, Pod 的進階版主要是讓我們使用及維護起來更加方便,話說如果遇到 Pod 砍掉會再生的記得先去查看有沒有 ReplicaSet 或 Deployment ,不要在那邊拚手速。
大家掰~掰~