kubernetes資源對象--RC和RS

本文基於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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章