中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-05-26 14:00:32 來源:億速云 閱讀:435 作者:鴿子 欄目:系統運維

在機器人技術和自動化中,控制環是一個控制系統狀態的不終止的循環

這是一個控制環的例子:"房間里的溫度自動調節器"
當你設置了溫度,告訴了溫度自動調節器你的"期望狀態",房間的實際溫度是"當前狀態"。通過對設備的開關控制,溫度自動調節器讓其當前狀態無限接近于期望狀態。
控制器通過 k8s的apiserver 去監控集群的公共狀態,并致力于將當前狀態轉變為所期望的狀態。

kubernetes 之Pod控制器(Controller)

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

  • 常用的內置控制器類型,它通常與集群API服務器進行交互:
    ReplicaSet:是Replication Controller 升級版本,區別是對選擇器的支持;
    Deployments:管理RS并提供對Pod的更新等功能,建議使用它管理RS,除非自定義更新編排;
    DaemonSet:用于確保集群中的每一個節點只運行一個Pod副本,通常用來實現系統級的后臺任務;
    StatefulSets:通常用來管理有狀態應用;
    Job:一次性任務執行;
    Crontab:定時任務執行;舉個例子:
  • 運行Pod之前,盡量把鏡像給先下載到本地,依據Pod調度結果使用docker save load導入導出
[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是什么你需要了解容器

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

Pod 是什么

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

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

Pod = "進程組"

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

Pod 的工作特點

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

Kubernetes 中Pod 的運行方式

  • 運行單個容器的 Pod
    "每個 Pod 一個容器"的模型是最常見的 Kubernetes 用例,即one-container-per-Pod模式。在這種情況下可以將 Pod 看作單個容器的包裝器,并且 Kubernetes 直接管理 Pod,而不是容器。
  • 運行多個協同工作的容器的 Pod
    Pod 可能封裝由多個緊密耦合且需要共享資源的共處容器組成的應用程序。即sidecar模式,Pod 封裝了一組緊耦合、共享資源、協同尋址的容器,將這組容器作為一個管理單元作為一個可管理的實體。
    舉個例子:
    自包含式容器設計Sidecar示例,鏡像可私有倉庫創建打包并上傳至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控制器實現滾動更新及灰度應用發布

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

此示例中會告訴您怎么實現一組應用的滾動更新,版本回退,Pod數量更新等。

[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]# 
  • 創建、刪除、查看、日志查看、容器描述查看
    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數量,滾動更新
    通過打補丁的方式進行更新,也可直接編輯文件進行更新,其值默認為1
# 更新當前副本集為5個
[root@node1 controllers]# kubectl patch deployment myapp-deploy -p '{"spec":{"relicas":5}}' 
# 實時查看更新狀態
[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版本號狀態
[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 
  • 模擬金絲雀發布
    更改maxSurge和maxUnavailable更新策略
# 命令幫助
[root@node1 controllers]# kubectl explain deploy.spec.strategy.rollingUpdate
# 先打補丁,更改當前更新策略,以模擬金絲雀發布
[root@node1 controllers]# kubectl patch deployment myapp-deployment -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
# 查看
[root@node1 controllers]# kubectl describe deploy myapp-deployment
# 再更新(金絲雀發布)
[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" 參數可看到每個版本所使用的命令
[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
# 如以上沒問題,再次執行更新操作
[root@node1 controllers]# kubectl rollout resume deploy myapp-deployment

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

向AI問一下細節

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

AI

澎湖县| 胶州市| 泗水县| 澄江县| 民勤县| 哈巴河县| 威海市| 祁门县| 朝阳县| 兴隆县| 西林县| 惠来县| 江西省| 衡阳县| 内丘县| 连州市| 怀宁县| 永福县| 吉林省| 万荣县| 阜新市| 湘乡市| 昆明市| 阳春市| 康定县| 叙永县| 汶川县| 广南县| 华蓥市| 桦甸市| 秀山| 江门市| 沙洋县| 广灵县| 若羌县| 金堂县| 林口县| 加查县| 邓州市| 甘谷县| 辽源市|