Kubernetes 中,有一個比 Pod 更進階的元件叫做 ReplicaSet,這是一群 Pod 的複製人,讓服務可以不單打獨鬥,可以有多個相同服務共同分擔。
要將服務從原本的 Pod 變成 ReplicaSet,我們像下面這個 YAML 檔一樣:
# replicaset-example.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',
]
這樣就可以將 ReplicaSet 部署起來。ReplicaSet 由 kube-controller-manager 監測 selector 標籤,將具有指定標籤的 Pod 維護至預期的數量。一旦少了 Pod,ReplicaSet 會自動補上。
你可以使用以下指令查看 ReplicaSet 的狀態:
kubectl get replicaset
# 或
kubectl get rs
如果手動刪除其中幾個 Pod,你會發現 ReplicaSet 會自動將缺少的 Pod 補回來。
然而,如果我們想要更新服務,只有使用 ReplicaSet 可能還不夠方便。這時 Kubernetes 提供了 Deployment 元件,可以同時維護多個 ReplicaSet。使用 Deployment,你可以透過指令更新服務,Kubernetes 會自動將服務在不中斷的情況下過渡到新的狀態。
以下是使用 Deployment 的 YAML 檔案範例:
# deployment-example.yaml
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',
]
Deployment 多了一個 strategy 選項,讓你可以選擇更新時的策略,以確保在任何情況下都有數個服務在線,避免服務中斷。
你可以使用以下指令查看 Deployment 的狀態:
kubectl get deployment
# 或
kubectl get deploy