本文基於kubernetes 1.5.2版本編寫
Replication Controller(RC)
應用託管在K8S後,K8S需要保證應用能夠持續運行,這是RC的工作內容。
主要功能
確保pod數量:RC用來管理正常運行Pod數量,一個RC可以由一個或多個Pod組成,在RC被創建後,系統會根據定義好的副本數來創建Pod數量。在運行過程中,如果Pod數量小於定義的,就會重啓停止的或重新分配Pod,反之則殺死多餘的。
確保pod健康:當pod不健康,運行出錯或者無法提供服務時,RC也會殺死不健康的pod,重新創建新的。
彈性伸縮 :在業務高峯或者低峯期的時候,可以通過RC動態的調整pod的數量來提高資源的利用率。同時,配置相應的監控功能(Hroizontal Pod Autoscaler),會定時自動從監控平臺獲取RC關聯pod的整體資源使用情況,做到自動伸縮。
滾動升級:滾動升級爲一種平滑的升級方式,通過逐步替換的策略,保證整體系統的穩定,在初始化升級的時候就可以及時發現和解決問題,避免問題不斷擴大。
彈性伸縮
彈性伸縮是指適應負載變化,以彈性可伸縮的方式提供資源。反映到K8S中,指的是可根據負載的高低動態調整Pod的副本數量。調整Pod的副本數是通過修改RC中Pod的副本是來實現的,示例命令如下:
擴容Pod的副本數目到10 kubectl scale relicationcontroller lykops --replicas=10
縮容Pod的副本數目到1 kubectl scale relicationcontroller lykops --replicas=1
滾動升級
滾動升級是一種平滑過渡的升級方式,通過逐步替換的策略,保證整體系統的穩定,在初始升級的時候就可以及時發現、調整問題,以保證問題影響度不會擴大。
升級方式
使用配置文件升級
kubecl rolling-update lykops-rc-v1 -f lykops-rc.yaml --update-period=10s
直接使用images
kubectl rolling-update lykops-rc --image=webapache:v3
升級過程
升級開始後,首先依據提供的定義文件創建v2版本的RC,然後每隔10s(--update-period=10s)逐步的增加v2版本的Pod副本數,逐步減少v1版本Pod的副本數。升級完成之後,刪除v1版本的RC,保留v2版本的RC,及實現滾動升級。
升級回滾
升級過程中,發生了錯誤中途退出時,可以選擇繼續升級。K8S能夠智能的判斷升級中斷之前的狀態,然後緊接着繼續執行升級。當然,也可以進行回退,命令如下:
kubectl rolling-update lykops-v1 -f lykops-v2-rc.yaml --update-period=10s -–rollback
yaml文件例子
升級之前的yaml文件爲
apiVersion: v1
kind: ReplicationController
metadata:
name: lykops-rc
labels:
app: apache
version: v1
spec:
replicas: 5
selector:
app: apache
version: v1
template:
metadata:
labels:
app: apache
version: v1
spec:
containers:
- name: apache-rc
image: web:apache
command: [ "sh", "/etc/run.sh" ]
ports:
- containerPort: 80
name: http
protocol: TCP
升級用的yaml文件內容爲
apiVersion: v1
kind: ReplicationController
metadata:
name: test-rc-v2
labels:
app: apache
version: v1
spec:
replicas: 5
selector:
app: apache
version: v2
template:
metadata:
labels:
app: apache
version: v2
spec:
containers:
- name: apache-rc-v2
image: web:apache
command: [ "sh", "/etc/run.sh" ]
ports:
- containerPort: 80
name: http
protocol: TCP
注意事項
要求新的RC需要使用舊的RC的Namespace。
RC的名字(name)不能與舊的RC的名字相同;
在selector中應至少有一個Label與舊的RC的Label不同,以標識其爲新的RC。
metadata與之前相同,否則升級後service無法對應上。
replica set(RS)
被認爲 是“升級版”的RC。RS也是用於保證與label selector匹配的pod數量維持在期望狀態。
區別在於,
1、RC只支持基於等式的selector(env=dev或environment!=qa),但RS還支持新的,基於集合的selector(version in (v1.0, v2.0)或env notin (dev, qa)),這對複雜的運維管理很方便。
2、升級方式
RS不能使用kubectlrolling-update進行升級
kubectl rolling-update專用於rc
RS升級使用deployment或者kubectl replace命令
社區引入這一API的初衷是用於取代vl中的RC,也就是說當v1版本被廢棄時,RC就完成了它的歷史使命,而由RS來接管其工作。
yaml文件例子
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: lykops-rs
labels:
software: apache
project: lykops
app: lykops-rs
version: v1
spec:
replicas: 2
selector:
matchLabels:
name: lykops-rs
software: apache
project: lykops
app: lykops-rs
version: v1
template:
metadata:
labels:
name: lykops-rs
software: apache
project: lykops
app: lykops-rs
version: v1
spec:
containers:
- name: lykops-rs
image: web:apache
command: [ "sh", "/etc/run.sh" ]
ports:
- containerPort: 80
name: http
proto