內容摘要
rc刪除
rc水平縮放
ReplicaSet
測試環境
創建兩節點K8S集群。
rc水平縮放
上一節我們講到了rc的副本數,該副本數可以在rc運行時修改,可以增加也可以減少,這就是rc的水平縮放特性。
我們仍舊使用上一節的測試容器鏡像,rc的配置如下:
apiVersion: v1 kind: ReplicationController metadata: name: myrc spec: replicas: 3 selector: app: myrc template: metadata: labels: app: myrc spec: containers: - name: rcimage image: huqianakls/rc_image:latest ports: - containerPort: 8080
創建該rc,查詢Pod,結果為:
1、修改rc的replicas屬性,將副本數量增加到5
使用kubectl edti rc 命令修改,修改後,查詢Pod,結果如下:
副本數量增加了2個。
2、修改rc的replicas屬性,將副本數量減少到3
仍舊使用kubectl edit rc命令修改,查詢Pod,結果如下:
rc停止了兩個Pod,數量減少到3個。
除了使用上面修改rc的方式實現水平縮放,還可以使用如下命令:
kubectl scale rc rc名稱 --replicas=副本數量
下面我們使用這個命令來實驗下能否將副本數減少到0,運行結果如下:
可以看到,所有的Pod都被停止了。
這種方式可以實現刪除Pod,不刪除rc。
rc刪除
rc刪除方式如下:
1、kubectl delete -f rc的yaml文件
2、kubectl delete rc rc名稱
上述兩種方式比較簡單,大家自己測試。
如何在刪除rc的時候不想刪除Pod如何做呢?
使用--cascade= false參數可以做到這一點,下面我們實驗一下:
首先將前面的rc副本數增加到3,命令為:
kubectl scale rc myrc --replicas=3
帶Pod狀態變為Running後,執行如下命令:
kubectl delete rc myrc --cascade=false
查詢rc:
rc被成功刪除。
查詢Pod:
Pod還在,沒有刪除。
在rc刪除,Pod沒有刪除時,我們可以再次新建rc,rc不會新建Pod,而是和已有的Pod匹配。下面實驗一下:
使用kubectl create -f 命令創建,查詢rc:
查詢Pod:
沒有新建Pod,還是先前的Pod。
ReplicaSet
rc是第1代副本控制器,後來K8S又提供了ReplicaSet,下面簡稱rs。rs比rc要更加先進,主要體現在Pod選擇器屬性上,rs具有更加靈活的Pod標籤匹配機制。rs將會完全替換rc,rc最終要被廢棄。
下面我們通過實驗來展示一下rs標籤匹配機制的強大。
創建上面的rc,之後再使用--cascade=false參數刪除該rc,這樣系統中就有3個不受rc約束的Pod了。3個Pod信息如下:
下面我們創建一個rs,先來個簡單的,rs配置如下:
apiVersion: apps/v1beta2 kind: ReplicaSet metadata: name: myrs spec: replicas: 3 selector: matchLabels: app: myrc template: metadata: labels: app: myrc spec: containers: - name: rs image: huqianakls/rc_image:latest
說明:
1、由於3個Pod的標籤是app=myrc,所有這裡還是使用它;
2、第1個spec下的selector中,使用了matchLabels屬性,這是rc沒有的,這裡的配置的和先前的rc一樣;
3、請注意kind和apiVerson;
創建rs,查詢rs和Pod:
可以看到3個Pod和我們新建的rs匹配成功。
查詢rs詳情,命令為:
kubectl describe rs myrs
Events顯示,沒有新建Pod。
rs還支持更加複雜的表達式,比如:
apiVersion: apps/v1beta2 kind: ReplicaSet metadata: name: myrs spec: replicas: 3 selector: matchExpressions: - key: app operator: In values: - myrc template: metadata: labels: app: myrc spec: containers: - name: rs image: huqianakls/rc_image:latest
說明:
1、上面的Pod選擇器變成了一個表達式,表示app這個key的值可以是myrc,values屬性是一個數組,因此可以指定多個值,In表示在某個集合中,是一個邏輯運算符;
2、rs支持的邏輯運算符包括:
In:表示key的值必須與至少一個values中的項匹配;
NotIn:表示key的值與任何values中的項都不匹配;
Exists:表示Pod必須存在某個key才能和rs匹配;
DoesNotExist:表示Pod必須不存在某個key才能和rs匹配;
下面我們實驗下這些表達式:
1、創建上面的rs
先刪除先前創建rs,使用--cascasde=false參數,只刪除rs,不刪除Pod,結果如下圖:
創建上面的rs,結果如下:
可以看到和已有的Pod匹配成功。
下面我們在做個實驗,rs改為如下配置:
apiVersion: apps/v1beta2 kind: ReplicaSet metadata: name: myrs spec: replicas: 3 selector: matchExpressions: - key: app operator: Exists template: metadata: labels: app: myrc spec: containers: - name: rs image: huqianakls/rc_image:latest
說明:將operator改為Exists,匹配規則變為存在app標籤。
先刪除上面的rs,同樣不刪除Pod,之後創建rs,結果如下:
匹配成功。
其他表達式大家可以自行測試。
實驗
1、創建rc,測試水平縮放;
2、創建rs;