Replication Controller
介紹
Replication Controller 會持續監控正在運行的pod列表, 並保證相應 ” 類型” 的 pod的數目與期望相符(多了刪除,少了新增)。所謂的類型就是通過標簽選擇器監控模板中指定標簽的pod的數量。
注意:在新版本的k8s中的副本控制器為Replica Set 完全替代了Replication Controller。在kubectl 命令中 Replication Controller 可簡寫為rc ,Replica Set 為rs。
ReplicationController的三部分
• label selector ( 標簽選擇器), 用於確定ReplicationController作用域中有哪些pod
• replica count (副本個數), 指定應運行的pod 數量
• pod template (pod模板), 用於創建新的pod 副本
Tips:
1、ReplicationController 的副本個數、標簽選擇器,甚至是 pod模板都可以隨時修改,但只有副本數目的變更會影響現有的 pod。
2、更改標簽選擇器和pod模板對現有 pod 沒有影響。在創建 pod后,RC也不關心其 pod的實際 “ 內容 ”(容器鏡像、 環境變量及其他)。因此更改模板僅影響由此RC 創建的新pod例如在模板中添加標簽不會立馬給現有Pod 添加,而是新建新的Pod 的時候會添加這個新的標簽。
3、修改Pod 的標簽,pod 就會脫離了RC控制,然后PC 會新建一個pod,給pod 添加新的標簽不影響RC對pod 的管理。
4、修改了 ReplicationController 的標簽選擇器,那么原有的pod 脫離RC控制,然后RC會新創建幾個新的 pod。
作用
1、人為刪除、增加pod后,副本控制器就會根據模板中定義的數量通過創建/刪除來維持應有的數量,或者pod 異常丟失停止都會根據模板創建新的pod
2、集群節點發生故障時, 它將為故障節 點 上運行的所有 pod (即受ReplicationController 控制的節點上的那些 pod) 創建替代副本。
3、根據使用需求它能輕松實現 pod的水平伸縮,手動和自動都可以。
相關操作
創建副本控制器

vi rs.yaml apiVersion: v1 kind: ReplicaSet #資源類型為rc metadata: name: asdf spec: replicas: 2 selector: # pod 選擇器決定了 RC 的操作對象 app: pay template: #創建新 pod 所用的pod 模板 metadata: labels: app: pay pod-template-hash: c6f6fdd spec: containers: - name: app1 image: luksa/asdf ports: 8090
編輯副本控制器
kubectl edit rc rc-name -n namespace 將你的默認文本編輯器中打開RC的YAML配置。找到要配置的部分編輯完成后保存更改並退出編輯器后,kubectl將更新RC並打印以下消息: replicationcontroller " kubsdf" edited
通過更改副本控制器可以完成以下任務:
1、擴縮Pod數量
2、更改pod 標簽
3、更改副本編輯器的標簽選擇器
pod 擴容/縮容

方式一 kubectl scale rc kusdf --replicas=8 方式二 kubectl edit re kubia #找到 spec.replicas字段並將其值更改為8,保存該文件並關閉編輯器, ReplicationController會更新並立即將pod的數量增加到8
查看控制器

kubectl get rc NAME DESIRED CURRENT READY AGE adsf 8 8 4 10m
刪除副本控制器
kubectl delete rc kubia --cascade=false #如果不加--cascade=false 那么就會連同pod 也一起刪除
ReplicaSet 和 ReplicationController 的比較
ReplicaSet 的行為與ReplicationController 完全相同, 但pod 選擇器的表達能力更強。 雖然 ReplicationController 的標簽選擇器只允許包含某個標簽的匹配 pod, 但ReplicaSet 的選擇器還允許匹配缺少某個標簽的 pod, 或包含特定標簽名的 pod, 不管其值如何。
另外, 舉個例子, 單個RC 無法將 pod與標簽 env=prd與env=dev同時匹配
它只能匹配帶有 env
=
devel 標簽的 pod 或帶有
env
=
devel 標簽的 pod。 但是
一
個ReplicaSet 可以匹配兩組 pod 並將它們視為
一
個大組。同樣, 無論ReplicationController 的值如何, ReplicationController 都無法僅基於標簽名的存在來匹配 pod, 而ReplicaSet 則可以。 例如, ReplicaSet 可匹配所有包含名為 env 的標簽的 pod, 無論ReplicaSet 的實際值是什么(可以理解為 env= *)。
ReplicaSet
創建一個RS
首先要注意的是ReplicaSet不是v1 API的一部分,因此你需要確保在創建資源時指定正確的apiVersion。你正在創建一個類型為ReplicaSet的資源,它的內容與你之前創建的ReplicationController的內容大致相同。
唯一的區別在選擇器中。不必在selector屬性中直接列出pod需要的標簽,而是在selector.matchLabels下指定它們。這是在ReplicaSet中定義標簽選擇器的更簡單(也更不具表達力)的方式。之后,你會看到表達力更強的選項。
其他操作
與ReplicationController 命令格式相似,只是資源名稱由rc 變為rs即可。另外由於rs 的標簽選擇器更強大所以在標簽選擇器配置時會有更多的表達方式可以參考標簽的博文來配置rs 中的標簽選擇器。