正規(guī)網(wǎng)站建設(shè)代理網(wǎng)店運(yùn)營工作內(nèi)容
文章目錄
- 1. ReplicaSet 基礎(chǔ)概念
- 1.1 RS 是什么?
- 1.2 RS 工作原理
- 1.3 什么時(shí)候使用 RS
- 1.4 RS 示例
- 1.5 非模板 Pod 的獲得
- 1.6 編寫 RS
- 1.7 使用 RS
- 1.8 RS 替代方案
- 2. ReplicaSet 與 ReplicationController
- 2.1 關(guān)于 RS、RC
- 2.2 兩者的選擇器區(qū)別
- 2.3 總結(jié)
1. ReplicaSet 基礎(chǔ)概念
1.1 RS 是什么?
ReplicaSet
的目的是維護(hù)一組在任何時(shí)候都處于運(yùn)行狀態(tài)的 Pod 副本的穩(wěn)定集合
- 保證給定數(shù)量、完全相同的
Pod
的可用性
打一個(gè)比方
我們以前進(jìn)行 Deployment
部署的時(shí)候,存在這個(gè)字段信息:
replicas: 5 ## 5個(gè)副本selector:matchLabels:app: nginx
上面就意味著我們要部署的副本數(shù)是5
1.2 RS 工作原理
通過以下字段來進(jìn)行一個(gè)定義:
- 用來識別可獲取的
Pod
的集合的選擇算符,這個(gè)選擇算符是可以寫復(fù)雜表達(dá)式的 - 用來標(biāo)明應(yīng)用維護(hù)的副本個(gè)數(shù)的數(shù)值:比如
replicas: 5
- 用來指定應(yīng)該創(chuàng)建新
Pod
的模板
每個(gè) ReplicaSet
都通過根據(jù)需要?jiǎng)?chuàng)建和刪除 Pod
以使得副本個(gè)數(shù)達(dá)到期望值
1.3 什么時(shí)候使用 RS
ReplicaSet 確保任何時(shí)間都有指定數(shù)量的 Pod 副本在運(yùn)行。 然而,Deployment 是一個(gè)更高級的概念,它管理 ReplicaSet,并向 Pod 提供聲明式的更新以及許多其他有用的功能。 因此,建議使用 Deployment 而不是直接使用 ReplicaSet, 除非你需要自定義更新業(yè)務(wù)流程或根本不需要更新。
1.4 RS 示例
怎么寫還是直接使用 kubectl explain rs
這是一個(gè)測試用例
###rs-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet ##資源類型
metadata: ## 元數(shù)據(jù)信息name: nginxlabels:app: nginxtier: frontend
spec: ## RS期望狀態(tài)replicas: 3 ## 副本數(shù)selector:matchLabels: ##標(biāo)簽選擇算符app: nginxtemplate: ##pod模塊metadata:labels:app: nginxspec:containers:- name: nginximage: nginx
啟動(dòng)測試
一些便捷的查詢
##當(dāng)前被部署的 ReplicaSet
kubectl get rs##查看 ReplicaSet 的狀態(tài)
kubectl describe rs nginx##查看Pod的屬主引用(信息被設(shè)置在 metadata 的 ownerReferences 字段中)
kubectl get pods nginx-klt65 -o yaml
1.5 非模板 Pod 的獲得
RS 也不會局限于擁有在其模板(.spec.template)設(shè)置的 Pod
,它也可以管理創(chuàng)建的裸 Pod
我先創(chuàng)建了一個(gè) rs
apiVersion: apps/v1
kind: ReplicaSet ##資源類型
metadata: ## 元數(shù)據(jù)信息name: nginxlabels:tier: frontend
spec: ## RS期望狀態(tài)replicas: 5 ## 副本數(shù)selector:matchLabels: ##標(biāo)簽選擇算符app: nginxtemplate: ##pod模塊metadata:labels:app: nginxspec:containers:- name: pod1image: nginx
我這里運(yùn)行了一個(gè)裸的 pod
###pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: podlabels:app: nginx
spec:containers:- name: podimage: php:5-apache
我們查看一下狀態(tài)
總結(jié)如下:
- 上面的
Pod
,雖然沒有控制器,但是標(biāo)簽與RS
的選擇算符匹配,它會立即被RS
獲取 - 新的
Pod
被RS
獲取,并立即被RS
終止,因?yàn)樗拇嬖跁沟?RS
中超過期望值
如果先創(chuàng)建 Pod 再創(chuàng)建 RS 觀察下
[root@k8s-01 k8s-yaml]# kubectl apply -f pod1.yaml
pod/pod created
[root@k8s-01 k8s-yaml]# kubectl apply -f rs-demo.yaml
replicaset.apps/nginx created
[root@k8s-01 k8s-yaml]#
總結(jié)如下:
RS
已經(jīng)獲得了該Pod
,并僅根據(jù)其規(guī)約創(chuàng)建新的Pod
, 直到新的Pod
和原來的Pod
的總數(shù)達(dá)到其預(yù)期個(gè)數(shù)。- 采用這種方式,一個(gè)
RS
中可以包含異質(zhì)的Pod
集合
1.6 編寫 RS
我們一般不會在實(shí)際工作直接編寫 RS
資源,而是編寫 Deploment
資源來替代 RS
,但是實(shí)際副本數(shù)控制依然是 RS
編寫清單參考:
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/#how-a-replicaset-works
1.7 使用 RS
刪除 RS 和 其 Pod
##刪除rs和pod
kubectl delete -f
只是刪除 RS
##只刪除RS
kubectl delete -f rs-demo.yaml --cascade=orphan
一旦刪除了原來的 ReplicaSet,就可以創(chuàng)建一個(gè)新的來替換它。 由于新舊 ReplicaSet 的
.spec.selector
是相同的,新的 ReplicaSet 將接管老的 Pod。 但是,它不會努力使現(xiàn)有的 Pod 與新的、不同的 Pod 模板匹配。 若想要以可控的方式更新 Pod 的規(guī)約,可以使用 Deployment 資源,因?yàn)?ReplicaSet 并不直接支持滾動(dòng)更新。
從 RS 中隔離 Pod
可以通過改變標(biāo)簽來從 ReplicaSet 中移除 Pod。 這種技術(shù)可以用來從服務(wù)中去除 Pod,以便進(jìn)行排錯(cuò)、數(shù)據(jù)恢復(fù)等。 以這種方式移除的 Pod 將被自動(dòng)替換(假設(shè)副本的數(shù)量沒有改變)。
擴(kuò)縮 RS
通過更新
.spec.replicas
字段,ReplicaSet 可以被輕松地進(jìn)行擴(kuò)縮。ReplicaSet 控制器能確保匹配標(biāo)簽選擇器的數(shù)量的 Pod 是可用的和可操作的。
在縮的時(shí)候,一般性算法:
- 首先選擇剔除懸決(Pending,且不可調(diào)度)的各個(gè) Pod
- 如果設(shè)置了
controller.kubernetes.io/pod-deletion-cost
注解,則注解值較小的優(yōu)先被裁減掉 - 所處節(jié)點(diǎn)上副本個(gè)數(shù)較多的 Pod 優(yōu)先于所處節(jié)點(diǎn)上副本較少者
- 如果 Pod 的創(chuàng)建時(shí)間不同,最近創(chuàng)建的 Pod 優(yōu)先于早前創(chuàng)建的 Pod 被裁減
**RS 可被用于 HPA **
1.8 RS 替代方案
上面已經(jīng)說過很多次了,我們一般不直接使用 RS,而是推薦使用 Deploy
Deployment
是一個(gè)可以擁有 ReplicaSet 并使用聲明式方式在服務(wù)器端完成對 Pod 滾動(dòng)更新的對象。 盡管 ReplicaSet 可以獨(dú)立使用,目前它們的主要用途是提供給 Deployment 作為編排 Pod 創(chuàng)建、刪除和更新的一種機(jī)制。當(dāng)使用 Deployment 時(shí),你不必關(guān)心如何管理它所創(chuàng)建的 ReplicaSet,Deployment 擁有并管理其 ReplicaSet。 因此,建議在需要 ReplicaSet 時(shí)使用 Deployment
2. ReplicaSet 與 ReplicationController
2.1 關(guān)于 RS、RC
RC(ReplicationController):副本控制器
RS(ReplicaSet):副本集
RC:老版
RS:新版
ReplicaSet 是 ReplicationController 的后繼者。二者目的相同且行為類似,只是 ReplicationController 不支持標(biāo)簽用戶指南中討論的基于集合的選擇算符需求。 因此,相比于 ReplicationController,應(yīng)優(yōu)先考慮 ReplicaSet
2.2 兩者的選擇器區(qū)別
對于RS
kubectl explain rs.spec.selector
- matchLabels:匹配標(biāo)簽
- matchExpressions:匹配表達(dá)式
kubectl explain rs.spec.selector.matchExpressions
- 匹配復(fù)雜的表達(dá)式的場景來說
- 我現(xiàn)在匹配了一個(gè)
key-value
形式為“app=nginx”- 如果
operator
值為 In:只要Pod
標(biāo)簽的值有 nginx,就會被匹配 - 如果
operator
值為 NotIn:只要Pod
標(biāo)簽的值不是 nginx,就會被匹配 - 如果
operator
值為 Exists:只要Pod
標(biāo)簽?zāi)芷ヅ涞?#xff0c;不用管值多少,就會被匹配 - 如果
operator
值為 DoesNotExist:只要Pod
標(biāo)簽沒有匹配到,不管值多少,就會被匹配
- 如果
- 我現(xiàn)在匹配了一個(gè)
對于RC
kubectl explain rc.spec.selector
相對就單一了撒
2.3 總結(jié)
雖然 RS 強(qiáng)大,但是我們也不直接寫 RS;而是使用更多特性的 Deployment,Deployment 會自動(dòng)產(chǎn)生 RS