Kubernetes對象之ReplicaSet

系列目錄php

說到ReplicaSet對象,得先說說ReplicationController(簡稱爲RC)。在舊版本的Kubernetes中,只有ReplicationController對象。它的主要做用是確保Pod以你指定的副本數運行,即若是有容器異常退出,會自動建立新的 Pod 來替代;而異常多出來的容器也會自動回收。能夠說,經過ReplicationController,Kubernetes實現了集羣的高可用性。html

在新版本的 Kubernetes 中建議使用 ReplicaSet(簡稱爲RS )來取代 ReplicationController。ReplicaSet 跟 ReplicationController 沒有本質的不一樣,只是名字不同,而且 ReplicaSet 支持集合式的 selector(ReplicationController 僅支持等式)。nginx

雖然也 ReplicaSet 能夠獨立使用,但建議使用 Deployment 來自動管理 ReplicaSet,這樣就無需擔憂跟其餘機制的不兼容問題(好比 ReplicaSet 不支持 rolling-update 但 Deployment 支持),而且Deployment還支持版本記錄、回滾、暫停升級等高級特性。Deployment 的詳細介紹和使用方法參見。redis

ReplicationController和Pod同樣,都是Kubernetes中的對象,所以建立方式相似。經過yaml或json描述文件來定義一個ReplicationController對象。一個最簡單的ReplicationController的定義以下:json

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描述文件中的關鍵點:api

  • kind字段表明你要新建的對象類型。此處指定爲ReplicationController。bash

  • spec.selector字段指定爲你須要管理的Pod的label(label的意義體如今此處)。這兒將spec.selector設置爲app: nginx,意味着全部包含label:app: nginx的Pod都將被這個RC管理。app

  • spec.replicas字段表明了受此RC管理的Pod,須要運行的副本數。frontend

  • template模塊用於定義Pod,包括Pod的名字,Pod擁有的label以及Pod中運行的應用。google

上面的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
相關文章
相關標籤/搜索