溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes中Pod控制器的介紹以及運行方式

發(fā)布時間:2020-05-26 14:00:32 來源:億速云 閱讀:434 作者:鴿子 欄目:系統(tǒng)運維

在機器人技術(shù)和自動化中,控制環(huán)是一個控制系統(tǒng)狀態(tài)的不終止的循環(huán)

這是一個控制環(huán)的例子:"房間里的溫度自動調(diào)節(jié)器"
當你設(shè)置了溫度,告訴了溫度自動調(diào)節(jié)器你的"期望狀態(tài)",房間的實際溫度是"當前狀態(tài)"。通過對設(shè)備的開關(guān)控制,溫度自動調(diào)節(jié)器讓其當前狀態(tài)無限接近于期望狀態(tài)。
控制器通過 k8s的apiserver 去監(jiān)控集群的公共狀態(tài),并致力于將當前狀態(tài)轉(zhuǎn)變?yōu)樗谕臓顟B(tài)。

kubernetes 之Pod控制器(Controller)

Controller是kubernetes中用于對Pod進行管理的控制器,通過該控制器可以讓Pod始終維持在一個用戶原本設(shè)定或期望的狀態(tài)下。如節(jié)點宕機或Pod因其他原因死亡,則在其他節(jié)點起一個相同的Pod來替代該Pod。

  • 常用的內(nèi)置控制器類型,它通常與集群API服務(wù)器進行交互:
    ReplicaSet:是Replication Controller 升級版本,區(qū)別是對選擇器的支持;
    Deployments:管理RS并提供對Pod的更新等功能,建議使用它管理RS,除非自定義更新編排;
    DaemonSet:用于確保集群中的每一個節(jié)點只運行一個Pod副本,通常用來實現(xiàn)系統(tǒng)級的后臺任務(wù);
    StatefulSets:通常用來管理有狀態(tài)應(yīng)用;
    Job:一次性任務(wù)執(zhí)行;
    Crontab:定時任務(wù)執(zhí)行;舉個例子:
  • 運行Pod之前,盡量把鏡像給先下載到本地,依據(jù)Pod調(diào)度結(jié)果使用docker save load導(dǎo)入導(dǎo)出
[root@node1 controllers]# cat replicaset-demo.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp
  namespace: default
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      name: myapp-httpd
      labels:
        app: myapp
        release: canary
        environment: qa
    spec:
      containers:
      - name: myapp-container
        image: httpd
                imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
[root@node1 controllers]# 

Kubernetes 最小運行單元 Pod,了解Pod是什么你需要了解容器

容器本質(zhì)實際上是一個進程,是一個視圖被隔離,資源受限的進程。
容器的設(shè)計本身是"單進程"模型,不是容器里只能起一個進程,因為容器的應(yīng)用等于進程,只能管理PID=1的進程。(Linux 容器的"單進程"模型,指的是容器的生命周期等同于 PID=1 的進程的生命周期,而不是說容器里不能創(chuàng)建多進程),也可以啟動多個進程,但是只有PID=1的進程被容器所管理,這時其它進程則處于tuoguan狀態(tài)。如果這個時候PID=1的這個進程出問題了被kill掉了或者是fail了沒人知道,然后其它的進程資源怎么辦呢?就沒人管,沒人回收......
所以往往在容器當中運行一個復(fù)雜程序是比較苦難的,但kubernetes的控制器的脫引而出,為它奠定了其在容器當中運行多個應(yīng)用的歷史地位,至少現(xiàn)階段是的。

Pod 是什么

讓Kubernetes集群能跑起來的基礎(chǔ)組件就叫 Pod。

  • Pod 是 Kubernetes 應(yīng)用程序的基本執(zhí)行單元,即它是 Kubernetes 對象模型中創(chuàng)建或部署的最小和最簡單的單元。Pod 表示在 集群 上運行的一個進程。
  • Pod 可以是封裝了單個應(yīng)用程序的容器(或多個)、存儲資源、唯一網(wǎng)絡(luò) IP 以及控制容器應(yīng)該如何運行的選項。 Pod 表示部署單元:"Kubernetes 中應(yīng)用程序的單個實例",它可能由單個 容器 或少量緊密耦合并共享資源的容器組成。
  • Docker 是 Kubernetes Pod 中最常用的容器運行時,但 Pod 也能支持其他的容器運行。

Pod = "進程組"

在 Kubernetes 里面,Pod 實際上正是 Kubernetes 項目為你抽象出來的一個可以類比為進程組的概念。
簡單點就是在kubernets當中會把多個應(yīng)用定義為多個容器,然后把多個容器運行在一個Pod資源里面,你也可以說是多個容器的組合就叫做 Pod。當Kubernetes把定義在一個Pod組合里的容器運行起來后,你會看到多個容器在運行。它們會同時去共享系統(tǒng)底層的某些資源(共享同一個底層的net、uts、ipc、等...),而這些資源都屬于 Pod。
Pod 在 Kubernetes 里面只有一個邏輯單位,Pod 是 Kubernetes 分配資源的一個單位。因為里面的容器要共享某些資源,所以Pod 它也是 Kubernetes 的原子調(diào)度單位。

Pod 的工作特點

  • 自主式Pod,自主式管理;
  • 將多個容器連接起來,給容器做成抽象封裝;
  • 一個Pod包含多個容器,共享同一個底層的 UTS、IPC、Network、等......;
  • Pod模擬傳統(tǒng)虛擬機,一個Pod建議只運行一個容器;
  • 共享存儲卷,不再屬于容器而屬于Pod;
  • Pod在各node上運行,取決其節(jié)點容忍度;
  • Pod控制器:Replication Controller、ReplicaSet、DeployMent、StatefulSet、DaemonSet、Job;

Kubernetes 中Pod 的運行方式

  • 運行單個容器的 Pod
    "每個 Pod 一個容器"的模型是最常見的 Kubernetes 用例,即one-container-per-Pod模式。在這種情況下可以將 Pod 看作單個容器的包裝器,并且 Kubernetes 直接管理 Pod,而不是容器。
  • 運行多個協(xié)同工作的容器的 Pod
    Pod 可能封裝由多個緊密耦合且需要共享資源的共處容器組成的應(yīng)用程序。即sidecar模式,Pod 封裝了一組緊耦合、共享資源、協(xié)同尋址的容器,將這組容器作為一個管理單元作為一個可管理的實體。
    舉個例子:
    自包含式容器設(shè)計Sidecar示例,鏡像可私有倉庫創(chuàng)建打包并上傳至github
[root@node1 controllers]# cat pod-tomcat-demo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: web-2
  namespace: default
spec:
  initContainers:
  - image: ik8s.io/sample:v2
    imagePullPolicy: IfNotPresent
    name: war
    command: [ "cp", "/sample.war", "/app" ]
    volumeMounts:
    - mountPath: /app
      name: app-volume
  containers:
  - image: ik8s.io/tomcat:8.0
    imagePullPolicy: IfNotPresent
    name: tomcat8
    command: [ "sh", "-c", "/root/apache-tomcat-8.0.5/bin/start.sh" ]
    volumeMounts:
    - mountPath: /root/apache-tomcat-8.0.5/webapps
      name: app-volume
    ports:
    - containerPort: 8080
      hostPort: 8008
  volumes:
  - name: app-volume
    emptyDir: {}
[root@node1 controllers]# 

利用DeployMents控制器實現(xiàn)滾動更新及灰度應(yīng)用發(fā)布

  • 任意應(yīng)用程序創(chuàng)建必須滿足三個核心組件:
    用戶期望的Pod副本、標簽選擇器、Pod模版(現(xiàn)有Pods數(shù)量不夠副本中所定義的期望Pod)
    命令幫助:
[root@node1 controllers]# kubectl explain deploy
[root@node1 controllers]# kubectl explain deploy.spec
[root@node1 controllers]# kubectl explain deploy.spec.strategy

此示例中會告訴您怎么實現(xiàn)一組應(yīng)用的滾動更新,版本回退,Pod數(shù)量更新等。

[root@node1 controllers]# cat deployment-myapp-demo.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  namespace: default
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
[root@node1 controllers]# 
  • 創(chuàng)建、刪除、查看、日志查看、容器描述查看
    kubectl 官方指令介紹
[root@node1 controllers]# kubectl apply -f deployment-myapp-demo.yaml 
deployment.apps/myapp-deployment created
[root@node1 controllers]# 
[root@node1 controllers]# kubectl delete -f deployment-myapp-demo.yaml 
deployment.apps "myapp-deployment" deleted
[root@node1 controllers]# 
[root@node1 controllers]# kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
myapp-deployment-5b776d9cf7-29s7b   1/1     Running   0          9m26s
myapp-deployment-5b776d9cf7-8hb8c   1/1     Running   0          9m26s
[root@node1 controllers]# 
[root@node1 controllers]# kubectl logs myapp-deployment-5b776d9cf7-8hb8c
[root@node1 controllers]# 
[root@node1 controllers]# kubectl describe pods myapp-deployment-5b776d9cf7-8hb8c
.............
Events:
Type    Reason     Age        From               Message
    ----    ------     ----       ----               -------
    Normal  Scheduled  <unknown>  default-scheduler  Successfully assigned default/myapp-deployment-5b776d9cf7-8hb8c to node2
    Normal  Pulled     10h        kubelet, node2     Container image "nginx" already present on machine
    Normal  Created    10h        kubelet, node2     Created container myapp
    Normal  Started    10h        kubelet, node2     Started container myapp
[root@node1 controllers]# 
  • 更新Pod數(shù)量,滾動更新
    通過打補丁的方式進行更新,也可直接編輯文件進行更新,其值默認為1
# 更新當前副本集為5個
[root@node1 controllers]# kubectl patch deployment myapp-deploy -p '{"spec":{"relicas":5}}' 
# 實時查看更新狀態(tài)
[root@node1 controllers]# kubectl get pods -w 
  • 更新image版本號,滾動更新
    所運用到的命令:kubectl set、kubectl edit、kubectl apply、kubectl rollout
# 更新容器鏡像版本至最新
[root@node1 controllers]# kubectl set image deployment/myapp-deployment nginx=nginx:latest 
# 查看滾動更新歷史
[root@node1 controllers]# kubectl rollout history deployment myapp-deployment 
# 查看ReplicaSet空間image版本號狀態(tài)
[root@node1 controllers]# kubectl get rs -l app=myapp -o wide
# 查看image字段
[root@node1 controllers]# kubectl describe pods myapp-deployment-5b776d9cf7-8hb8c | grep 'Image' 
# 查看其更新的過程是怎么更新的,做了什么
[root@node1 controllers]# kubectl describe deployment/myapp-deployment 
  • 模擬金絲雀發(fā)布
    更改maxSurge和maxUnavailable更新策略
# 命令幫助
[root@node1 controllers]# kubectl explain deploy.spec.strategy.rollingUpdate
# 先打補丁,更改當前更新策略,以模擬金絲雀發(fā)布
[root@node1 controllers]# kubectl patch deployment myapp-deployment -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
# 查看
[root@node1 controllers]# kubectl describe deploy myapp-deployment
# 再更新(金絲雀發(fā)布)
[root@node1 controllers]# kubectl set image deployment myapp-deployment myapp=nginx:v1  && kubectl rollout pause deployment myapp-
Waiting for deployment "myapp-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
# 查看歷史版本,使用 "--record" 參數(shù)可看到每個版本所使用的命令
[root@node1 controllers]# kubectl rollout history deployment myapp-deployment 
# 回滾不加版本號,默認回退到上一個版本
[root@node1 controllers]# kubectl rollout undo deployment myapp-deployment
# 使用 "--to-reversion=[N]" 回滾到指定版本
[root@node1 controllers]# kubectl rollout undo deploy myapp-deployment --to-reversion=1
# 如以上沒問題,再次執(zhí)行更新操作
[root@node1 controllers]# kubectl rollout resume deploy myapp-deployment

利用DaemonSet 運行指定一個Pod副本,把系統(tǒng)某個目錄作為存儲卷

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI