java replica set_Kubernetes对象之ReplicaSet
說(shuō)到ReplicaSet對(duì)象,得先說(shuō)說(shuō)ReplicationController(簡(jiǎn)稱為RC)。在舊版本的Kubernetes中,只有ReplicationController對(duì)象。它的主要作用是確保Pod以你指定的副本數(shù)運(yùn)行,即如果有容器異常退出,會(huì)自動(dòng)創(chuàng)建新的 Pod 來(lái)替代;而異常多出來(lái)的容器也會(huì)自動(dòng)回收。可以說(shuō),通過(guò)ReplicationController,Kubernetes實(shí)現(xiàn)了集群的高可用性。
在新版本的 Kubernetes 中建議使用 ReplicaSet(簡(jiǎn)稱為RS )來(lái)取代 ReplicationController。ReplicaSet 跟 ReplicationController 沒(méi)有本質(zhì)的不同,只是名字不一樣,并且 ReplicaSet 支持集合式的 selector(ReplicationController 僅支持等式)。
雖然也 ReplicaSet 可以獨(dú)立使用,但建議使用 Deployment 來(lái)自動(dòng)管理 ReplicaSet,這樣就無(wú)需擔(dān)心跟其他機(jī)制的不兼容問(wèn)題(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且Deployment還支持版本記錄、回滾、暫停升級(jí)等高級(jí)特性。Deployment 的詳細(xì)介紹和使用方法參見(jiàn)。
ReplicationController和Pod一樣,都是Kubernetes中的對(duì)象,因此創(chuàng)建方式類似。通過(guò)yaml或json描述文件來(lái)定義一個(gè)ReplicationController對(duì)象。一個(gè)最簡(jiǎn)單的ReplicationController的定義如下:
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
下面簡(jiǎn)要解釋一下上述ReplicationController描述文件中的關(guān)鍵點(diǎn):
kind字段代表你要新建的對(duì)象類型。此處指定為ReplicationController。
spec.selector字段指定為你需要管理的Pod的label(label的意義體現(xiàn)在此處)。這兒將spec.selector設(shè)置為app: nginx,意味著所有包含label:app: nginx的Pod都將被這個(gè)RC管理。
spec.replicas字段代表了受此RC管理的Pod,需要運(yùn)行的副本數(shù)。
template模塊用于定義Pod,包括Pod的名字,Pod擁有的label以及Pod中運(yùn)行的應(yīng)用。
上面的RC通過(guò)kubectl apply命令創(chuàng)建成功后,Kubernetes會(huì)在所有可用的Node上,新建三個(gè)Pod。每個(gè)Pod都有一個(gè)app: nginx的label,并且每個(gè)Pod中都運(yùn)行一個(gè)nginx容器。一旦其中某個(gè)Pod發(fā)生故障停止運(yùn)行了,Controller Manager都能夠及時(shí)發(fā)現(xiàn),然后根據(jù)當(dāng)前RC定義,創(chuàng)建出一個(gè)新的Pod,從而使包含label:app: nginx的Pod的運(yùn)行副本數(shù)始終為3。
Kubernetes官方強(qiáng)烈建議避免直接使用ReplicaSet,而應(yīng)該通過(guò)Deployment來(lái)創(chuàng)建RS和Pod。
由于ReplicaSet是ReplicationController的代替物,因此用法基本相同,唯一的區(qū)別在于ReplicaSet支持集合式的selector。一個(gè)典型的RS描述文件如下:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
template:
metadata:
labels:
app: guestbook
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
以上RS描述文件中,selector除了可以使用matchLabels,還支持集合式的操作:
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
ReplicaSet的刪除
使用kubectl delete命令會(huì)刪除此RS以及它管理的Pod。在Kubernetes刪除RS前,會(huì)將RS的replica調(diào)整為0,等待所有的Pod被刪除后,在執(zhí)行RS對(duì)象的刪除。
如果希望僅僅刪除RS對(duì)象(保留Pod),請(qǐng)使用kubectl delete命令時(shí)添加--cascade=false選項(xiàng)。
ReplicaSet的伸縮
通過(guò)修改.spec.replicas的值可以實(shí)時(shí)修改RS運(yùn)行的Pod數(shù)量。
Horizontal Pod Autoscaler(HPA)
RS可以通過(guò)HPA來(lái)根據(jù)一些運(yùn)行時(shí)指標(biāo)實(shí)現(xiàn)自動(dòng)伸縮,下面是一個(gè)簡(jiǎn)單的例子:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: frontend-scaler
spec:
scaleTargetRef:
kind: ReplicaSet
name: frontend
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 50
可以通過(guò)kubectl create -f來(lái)創(chuàng)建HPA或者使用
# 注意此命令并不會(huì)調(diào)用HAP定義,而是直接通過(guò)命令達(dá)到自動(dòng)擴(kuò)容效果,與上面通過(guò)yml效果類似
kubectl autoscale rs frontend --max=10
總結(jié)
以上是生活随笔為你收集整理的java replica set_Kubernetes对象之ReplicaSet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 张学友
- 下一篇: Western blot 技术