K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

內容摘要

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,結果為:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

1、修改rc的replicas屬性,將副本數量增加到5

使用kubectl edti rc 命令修改,修改後,查詢Pod,結果如下:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

副本數量增加了2個。

2、修改rc的replicas屬性,將副本數量減少到3

仍舊使用kubectl edit rc命令修改,查詢Pod,結果如下:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

rc停止了兩個Pod,數量減少到3個。

除了使用上面修改rc的方式實現水平縮放,還可以使用如下命令:

kubectl scale rc rc名稱 --replicas=副本數量
 

下面我們使用這個命令來實驗下能否將副本數減少到0,運行結果如下:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

可以看到,所有的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:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

rc被成功刪除。

查詢Pod:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

Pod還在,沒有刪除。

在rc刪除,Pod沒有刪除時,我們可以再次新建rc,rc不會新建Pod,而是和已有的Pod匹配。下面實驗一下:

使用kubectl create -f 命令創建,查詢rc:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

查詢Pod:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

沒有新建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信息如下:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

下面我們創建一個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:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

可以看到3個Pod和我們新建的rs匹配成功。

查詢rs詳情,命令為:

kubectl describe rs myrs
K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

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,結果如下圖:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

創建上面的rs,結果如下:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

可以看到和已有的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,結果如下:

K8S動手教程3.2:rc刪除,水平縮放,ReplicaSet

匹配成功。

其他表達式大家可以自行測試。

實驗

1、創建rc,測試水平縮放;

2、創建rs;


分享到:


相關文章: