在前一天的文章中,我們理解了 Replication Controller 的運作,以及知道了利用Replication Controller 可以確保 pod 的運作效能符合我們的需求,但對於一些敏捷開開的場景、以及開發流程中常發生的滾動升級及回滾應用,有一個更好的控制器 Deployment 可以更符合我們的需求。
Replica Set被k8s譽為下一代的Replication controller,因其不止功能該有的都有,更有更為方便的 selector
spec.selector.matchLabels :在 Replica Set的selector裡面提供了matchLabels,Pod的labels必須與matchLabels中指定的值相同,才算符合條件。spec.selector.matchExpressions:matchExpressions的用法較為彈性,每一筆條件主要由三個部分組成key, operator,value;目前operator支援4種條件In, NotIn, Exists, 以及 DoesNotExis
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
雖然 ReplicaSet 可以獨立使用,但一般還是建議使用 Deployment 来自動管理 ReplicaSet,這樣就無需擔心跟其他機制的不兼容问题
Deployment 為 pod和replica set提供聲明式更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 告知 Deployment 運行 2 個 Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
利用指令kubectl apply -f <YAML位置>,便可以創建一個deployment,
而當我們要更新pod的時候,只需要更動YAML檔的內容之後,重新apply就可以了,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4 # 將副本數 2 更新為 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
並重新用 kubectl 去 apply,nginx 數量便會從 2 個變成 4 個;
若要刪除deployment,則下 kubectl delete deployment <meta.name> 就可以了!