1. 程式人生 > >kubernetes RC 與 Deployment ,Pod,Horizontal Pod Autoscaling ,replica set資源

kubernetes RC 與 Deployment ,Pod,Horizontal Pod Autoscaling ,replica set資源

Pod:

Pod是 kubernetes 的最基本的操作單元,包含一個或多個緊密相關的容器

kubernetes 使用pod在容器之上再封裝一層,其一個很重要的原因是,docker容器之間的通訊受到docker網路機制的限制。在docker中,因為每個容器內的網路不同,在以前,往往需要通過link方式才能訪問另一個容器提供服務,但是這種方式,docker官網已經不再推薦,docker官方推薦讓兩個需要通訊的容器放在同一個網路,三劍客之一的docker-compose就能提供了這樣的條件。kubernetes通過pod的概念將多個容器組合在一個虛擬的 主機內,可以實現容器之間僅需通過localhost就能相互通訊了

kubernetes 設計了pod物件,將每個服務程序包裝到相應的pod中,使其成為pod中執行的一個容器,在使用時,我們會將 pod物件打上 標籤,例如 提供mysql服務功能的pod,我們會為該pod打上name=mysql的標籤. 然後將 mysql service 的標籤選擇器設定為 mysql , 這樣pod 物件 和 service 就能關聯起來了

pod 的 proxy 介面的作用: 在kubernetes叢集之外訪問某個pod容器的服務(HTTP服務)時,可以用Proxy API實現,這種場景多用於管理目的,比如逐一排查Service的Pod副本,檢查哪些Pod的服務存在異常問題

kubernetes的pod使用分兩種主要方式:

(1)pod中執行一個容器 "one-container-per-pod"模式是kubernetes最常見的用法。在這種情況下,你可以將pod視為當個封裝的容器,但是kubernetes是直接管理pod而不是容器

(2)pods中執行多個需要一起工作的容器。pod可以封裝緊密耦合的應用,它們需要由多個容器組成,它們之間能夠共享資源、

 

 

Replication Controller 簡稱 RC:

Replication Controller 是 kubernetes 系統中的核心概念,用於定義pod副本的數量。在master內,controller manager 程序通過RC的定義來完成pod的建立,監控,啟停等操作

當我們定義了一個RC並提交到kubernetes叢集中以後,master節點上的controller manager元件就得到通知,定期巡檢系統中當前存活的目標pod,並確保目標pod例項的數量剛好等於此RC的期望值,如果有多個pod副本在執行,系統就會停掉一些pod,否則系統就會再自動建立一些pod。可以說,通過RC,kubernetes實現了使用者應用叢集的高可用性,並且大大減少了系統管理員在傳統IT環境中需要完成的許多手工運維工作

在執行的時候,我們可以通過修改RC的副本數量,來實現Pod的動態縮放(scaling)

kubectl scale rc jxc --replicas=3

刪除RC並不會影響通過該RC已建立好的pod,為了刪除所有pod,可以設定replicas=0,然後更新該RC。另外,客戶端工具kubectl提供了stop和delete命令來完成一次性刪除

RC 和 RC控制的全部pod

指定容器的配額:

對指定容器實施配額管理非常簡單,只要在pod或 rc 的定義檔案中設定 resources屬性即可為某個容器指定配額。目前支援CPU和Memory兩類資源的配額限制。

例如

apiVersion: v1
kind: ReplicationController
metadata:
  name: jxc
  labels:
    name: jxc
spec:
  replicas: 1
  selector:
    name: jxc
  template:
    metadata:
      labels:
        name: jxc
    spec:
      containers:
      - name: jxc
        image: 192.168.255.128:5000/jxc:0.0.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 0.5
            memory: 500Mi

以上配置表示,系統將對容器 限制 CPU為0.5,可用記憶體限制為500MIB位元組

kubernetes 啟動一個容器時,會將CPU的配額 值乘以1024 並轉為整數傳遞給docker run 的 --cpu-shares 引數, 之所以乘以1024 是因為docker的

cpu-shares 引數是以1024為基數基數CPU時間的。 關於 docker 的 cpu-shares 引數 解析 請參考 https://blog.csdn.net/weixin_39639119/article/details/83046676

,同樣的,memory 配額也會被轉換為整數傳遞給 docker run 的 --memory引數。

 

全域性預設配額:

通常情況下,我們將會定義非常多的 rc,如果 每個 資源 都要我們 設定 配額的話,那會顯得 十分麻煩,

我們可以通過 建立 LimitRange物件 設定全域性預設配額。

vim pod-container-limits.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: limit-range-1
spec:
  limits:
    - type: "Pod"
      max:
        cpu: "2"
        memory: 1Gi
      min:
        cpu: 250m
        memory: 32Mi
    - type: "Container"
      max:
        cpu: "2"
        memory: 1Gi
      min:
        cpu: 250m
        memory: 32Mi
      default:
        cpu: 250m
        memory: 64Mi

~                           

上述 設定表明:

任意 pod內所有容器的CPU 使用 限制在 0.25 -2

任意 pod 內所有 容器 的記憶體 使用限制在 32Mi - 1Gi

任意容器的 CPU使用限制在0.25 - 2,預設值為64Mi

任意容器的記憶體使用限制在 32Mi - 1Gi,預設值為64Mi

 

 

kubectl replace -f pod-container-limits.yaml

kubectl describe limits limit-range-1

[[email protected] kubefile]# kubectl describe limits limit-range-1

Name: limit-range-1

Namespace: default

Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio

---- -------- --- --- --------------- ------------- -----------------------

Pod cpu 250m 2 - - -

Pod memory 32Mi 1Gi - - -

Container memory 32Mi 1Gi 64Mi 64Mi -

Container cpu 250m 2 250m 250m -

 

執行 kubectl create 命令 建立該 pod

[[email protected] kubefile]# kubectl describe pod jxc

Limits:

cpu: 250m

memory: 64Mi

Requests:

cpu: 250m

memory: 64Mi

建立成功後,檢視該pod的詳細資訊,可以看到系統中LimitRange的設定對新建立的容器進行了資源限制(使用了LimitRange中的預設值)

 

如果,我們在pod的定義檔案中指定了配額引數,則可遵循區域性覆蓋全域性的原則,當不能超過了全域性設定的最大值

 

replica set:

由於replication controller 與kubernetes程式碼中的模組replication controller 同名,同時這個詞也無法準確表達它的本意,所以在kubernetes 1.2 的時候,它就升級成了另外一個新的概念 -- replica set。二者之間唯一的區別是,Replica Set支援了基於集合的Label Selector功能

ReplicaSet是支援新的set-based 選擇器要求的下一代 ReplicationController。它主要用作Deployment 協調pod建立,刪除和更新。雖然ReplicaSets可以獨立使用,但它主要被

Deployment協調pod建立,刪除和更新。建議使用Deployment而不是直接使用ReplicaSets

 

 

Deployment:

學過saltstack都值得,salt有一個狀態模組,只要你在salt配置檔案描述好狀態,salt就會將你指定的主機狀態改變到你的目標狀態。

Deployment也能剛這樣的事情,你只需要在Deployment中描述您想要的目標狀態是什麼。Deployment Controller就會幫你將Pod 和

ReplicaSet的實際狀態改變到您的目標狀態

典型用例:

(1)建立一個Deployment物件來生成對應的ReplicaSet,並完成Pod副本的建立過程

(2) 檢查Deployment的狀態來檢視部署動作是否完成,pod副本的數量是否達到預期的值

(3)更新Deployment以建立新的Pod,通過修改pod-template-spec欄位來宣告pod的新狀態。這會建立一個新的

replicaSet, Deployment 會按照控制的速率將pod從舊的ReplcaSet移動到新的ReplicaSet中

(4)如果當前狀態不穩定,則回滾到一個早先的Deployment版本

(5)擴容 Deployment 以滿足更高的負載

(6)檢視 Deployment 狀態,判斷髮布是否成功

(7)清除舊的replicaSets

 

建立deployment

[[email protected] kubefile]# vim ku-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jxc-deployment
  labels:
    web: jxc
spec:
  replicas: 1
  selector:
    matchLabels:
      web: jxc
  template:
    metadata:
      labels:
        web: jxc
    spec:
      containers:
      - name: jxc
        image: 192.168.255.128:5000/jxc:0.0.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

建立 deployment

kubectl create -f ku-deployment.yaml --record

-- record 當我們需要檢視 歷史版本時,可以很方便的檢視每次 revision變化

 

檢視deployment 的 建立詳情

[[email protected]node1 kubefile]# kubectl describe deployment jxc-deployment

[[email protected] kubefile]# kubectl get deployments

[[email protected] kubefile]# kubectl get rs

 

runing說明啟動成功

[[email protected] kubefile]# kubectl get pods

NAME READY STATUS RESTARTS AGE

jxc-deployment-3952983837-mw8df 1/1 Running 0 3m

 

 

 

更新

deployment的更新

當 使用 kubectl edit 命令 時,就可以 編輯 yaml 檔案,當deployment的pod template的 label 發生更新或者映象發生 更改時

,才會觸發更新 訊號(rollout)

例如將 jxc:0.0.3 更改為 jxc0.0.4

kubectl edit deployment/jxc-deployment

spec:

containers:

- image: 192.168.255.128:5000/jxc:0.0.4

imagePullPolicy: IfNotPresent

name: jxc

ports:

- containerPort: 8080

protocol: TCP

resources: {}

terminationMessagePath: /dev/termination-log

dnsPolicy: ClusterFirst

restartPolicy: Always

securityContext: {}

terminationGracePeriodSeconds: 30

 

[[email protected] kubefile]# kubectl rollout status deployment/jxc-deployment

deployment "jxc-deployment" successfully rolled out

 

 

回退

當deployment 更新時,就會建立一個revision。我們可以通過設定.spec.revisionHistoryLimit來指定deployment最多保留多少個

revision歷史記錄。預設會保留所有的revision;如果將該項設定為0,deployment就不允許回退了

 

我們先用 kubectl edit deployment/jxc-deployment 將 版本 修改為一個不存在的版本

spec:

containers:

- image: 192.168.255.128:5000/jxc:0.0.6

imagePullPolicy: IfNotPresent

name: jxc

ports:

- containerPort: 8080

protocol: TCP

resources: {}

terminationMessagePath: /dev/termination-log

dnsPolicy: ClusterFirst

restartPolicy: Always

securityContext: {}

terminationGracePeriodSeconds: 30

 

[[email protected] kubefile]# kubectl rollout status deployment/jxc-deployment

Waiting for rollout to finish: 0 of 1 updated replicas are available...

通過 該 命令 , 我們可以得知 版本更新 卡住了

[[email protected] kubefile] kubectl get pods

NAME READY STATUS RESTARTS AGE

jxc-deployment-4197170976-8sph2 0/1 ImagePullBackOff 0 2m

pods 也處於 ImagePullBackOff 狀態

 

我們 需要 回退到穩定的版本

我們 先 檢視 deployment 歷史版本記錄

[[email protected] kubefile]# kubectl rollout history deployment/jxc-deployment

deployments "jxc-deployment"

REVISION CHANGE-CAUSE

1 kubectl create -f ku-deployment.yaml --record

2 kubectl edit deployment/jxc-deployment

3 kubectl edit deployment/jxc-deployment

 

檢視當個 version 資訊

kubectl rollout history deployment/jxc-deployment --revision=2

deployments "jxc-deployment" with revision #2

Labels: pod-template-hash=4034379550

web=jxc

Annotations: kubernetes.io/change-cause=kubectl edit deployment/jxc-deployment

Containers:

jxc:

Image: 192.168.255.128:5000/jxc:0.0.4

Port: 8080/TCP

Volume Mounts: <none>

Environment Variables: <none>

No volumes.

回退到 上一個版本

 kubectl rollout undo deployment/jxc-deployment

[[email protected] kubefile]# kubectl rollout undo deployment/jxc-deployment

deployment "jxc-deployment" rolled back

[[email protected] kubefile]# kubectl get pods

NAME READY STATUS RESTARTS AGE

jxc-deployment-4034379550-pjfp9 1/1 Running 0 3s

回退到指定版本

kubectl rollout undo deployment/jxc-deployment --to-revision=2

[[email protected] kubefile]# kubectl rollout undo deployment/jxc-deployment --to-revision=1

deployment "jxc-deployment" rolled back

[[email protected] kubefile]# kubectl get pods

NAME READY STATUS RESTARTS AGE

jxc-deployment-3952983837-tq31x 1/1 Running 0 4s

 

擴容

kubectl scale deployment deployment/jxc-deployment --replicas 2

[[email protected] kubefile]# kubectl scale deployment jxc-deployment --replicas 2

deployment "jxc-deployment" scaled

[[email protected] kubefile]# kubectl get pods

NAME READY STATUS RESTARTS AGE

jxc-deployment-3952983837-jzzzv 1/1 Running 0 4s

jxc-deployment-3952983837-tq31x 1/1 Running 0 2m

 

暫停和 恢復

當需要對 deployment 進行多次修改時, 我們可以 先暫時,再恢復,防止 不必要的rollout

kubectl rollout pause deployment/jxc-deployment

[[email protected] kubefile]# kubectl rollout pause deployment/jxc-deployment

deployment "jxc-deployment" paused

 

我 把 映象的版本改為 0.0.4 ,然後恢復

kubectl rollout resume deploy jxc-deployment

[[email protected] kubefile]# kubectl rollout resume deploy jxc-deployment

deployment "jxc-deployment" resumed

 

 

Horizontal Pod Autoscaling

HPA 的操作物件是RC,RS 或 Deployment對應的Pod,根據觀察到的CPU等實際使用量與使用者的期望值進行比對,做出是否需要增減例項數量的決策

kubernetes 根據 pod當前系統的負載來自動擴容,如果系統負載超過預定值,就開始增加pod的個數,如果低於某個值,就自動減少pod的個數。在v1.6

版本之前,僅支援使用CPU負載作為是否擴容的判定條件;自v1.6版本開始提供了根據應用自定義指標進行自動擴容和縮容的功能

我們可以通過建立 yaml 檔案,來實現自動擴容

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: jxc
  namespace: default
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    kind: Deployment
    name: jxc
  targetCPUUtilizationPercentage: 90

kubectl create -f jxc-hpa.yaml

上述 指令碼的意思 是 當名為 jxc 的 deployment 的 pod副本的CPU使用率 超過 90%時,會觸發自動擴容行為。但 擴容或縮容都必須滿足約束條件

pod 的副本數量 在 1-10 之間