java replica set_Kubernetes对象之ReplicaSet
說到ReplicaSet對象,得先說說ReplicationController(簡稱為RC)。在舊版本的Kubernetes中,只有ReplicationController對象。它的主要作用是確保Pod以你指定的副本數運行,即如果有容器異常退出,會自動創建新的 Pod 來替代;而異常多出來的容器也會自動回收??梢哉f,通過ReplicationController,Kubernetes實現了集群的高可用性。
在新版本的 Kubernetes 中建議使用 ReplicaSet(簡稱為RS )來取代 ReplicationController。ReplicaSet 跟 ReplicationController 沒有本質的不同,只是名字不一樣,并且 ReplicaSet 支持集合式的 selector(ReplicationController 僅支持等式)。
雖然也 ReplicaSet 可以獨立使用,但建議使用 Deployment 來自動管理 ReplicaSet,這樣就無需擔心跟其他機制的不兼容問題(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且Deployment還支持版本記錄、回滾、暫停升級等高級特性。Deployment 的詳細介紹和使用方法參見。
ReplicationController和Pod一樣,都是Kubernetes中的對象,因此創建方式類似。通過yaml或json描述文件來定義一個ReplicationController對象。一個最簡單的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
下面簡要解釋一下上述ReplicationController描述文件中的關鍵點:
kind字段代表你要新建的對象類型。此處指定為ReplicationController。
spec.selector字段指定為你需要管理的Pod的label(label的意義體現在此處)。這兒將spec.selector設置為app: nginx,意味著所有包含label:app: nginx的Pod都將被這個RC管理。
spec.replicas字段代表了受此RC管理的Pod,需要運行的副本數。
template模塊用于定義Pod,包括Pod的名字,Pod擁有的label以及Pod中運行的應用。
上面的RC通過kubectl apply命令創建成功后,Kubernetes會在所有可用的Node上,新建三個Pod。每個Pod都有一個app: nginx的label,并且每個Pod中都運行一個nginx容器。一旦其中某個Pod發生故障停止運行了,Controller Manager都能夠及時發現,然后根據當前RC定義,創建出一個新的Pod,從而使包含label:app: nginx的Pod的運行副本數始終為3。
Kubernetes官方強烈建議避免直接使用ReplicaSet,而應該通過Deployment來創建RS和Pod。
由于ReplicaSet是ReplicationController的代替物,因此用法基本相同,唯一的區別在于ReplicaSet支持集合式的selector。一個典型的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命令會刪除此RS以及它管理的Pod。在Kubernetes刪除RS前,會將RS的replica調整為0,等待所有的Pod被刪除后,在執行RS對象的刪除。
如果希望僅僅刪除RS對象(保留Pod),請使用kubectl delete命令時添加--cascade=false選項。
ReplicaSet的伸縮
通過修改.spec.replicas的值可以實時修改RS運行的Pod數量。
Horizontal Pod Autoscaler(HPA)
RS可以通過HPA來根據一些運行時指標實現自動伸縮,下面是一個簡單的例子:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: frontend-scaler
spec:
scaleTargetRef:
kind: ReplicaSet
name: frontend
minReplicas: 3
maxReplicas: 10
targetCPUUtilizationPercentage: 50
可以通過kubectl create -f來創建HPA或者使用
# 注意此命令并不會調用HAP定義,而是直接通過命令達到自動擴容效果,與上面通過yml效果類似
kubectl autoscale rs frontend --max=10
總結
以上是生活随笔為你收集整理的java replica set_Kubernetes对象之ReplicaSet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张学友
- 下一篇: 【QCA】SDK11.2添加Marvel