kubernetes(k8s)從入門到精通--pod控制器-第一章-第五節【入門篇】

一、pod控制器概要

  Pod控制器是什麼呢?簡單的來說Pod控制器就是用來管理pod的。大量部署過docker的同學,有一點會感同身受,難針對、難管理而,今天我們學習的核心組件pod就可以解決這個問題。官方點來說Pod控制器是用於實現管理pod的中間層,確保pod資源符合預期的狀態,pod的資源出現故障時,會嘗試 進行重啓,當根據重啓策略無效,則會重新新建pod的資源。那麼pod控制器包含哪些呢?如下|:

  • ReplicationController:1.2以前的老版本管理工具,後續會被Replicaset取代,這裏我們就瞭解一下,有這樣一個東西即可。
  • Replicaset:用作pod 創建、刪除和更新,ReplicaSet能確保運行指定數量的pod ,通過label selector來確定pod數量是否滿足用戶指定的副本數量。(管理副本)
  • Deployment:將 Pod 和ReplicaSet 的實際狀態改變到用戶的目標狀態。支持擴容、回滾、更新等功能;管理無狀態應用最好的控制器;守護進程類(作用於replicaset上,支持回滾等操作)
  • Daemonset:確保每個節點上運行一個Pod副本。無狀態服務;守護進程類
  • Job: 執行一次性運行任務。不需要持續運行
  • Cronjob: 週期性運行任務。不需要持續運行
  • StatefulSet: 管理有狀態應用,每一個應用都被單獨管理。管理比較麻煩

二、Replicaset

   replicaset用作pod 創建、刪除和更新,ReplicaSet能確保運行指定數量的pod ,通過label selector來確定pod數量是否滿足用戶指定的副本數量。(管理副本)

那麼它是如何定義的呢?請參考下文yaml文件。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
    name: rsdemo
    namespace: default
spec:
    replicas: 2
    selector:
        matchLabels:
            app: rsdemo
            release: can
    template:
        metadata:
            name: rsdemo1
            labels:
                app: rsdemo
                release: can
        spec:
            containers:
            - name: resdemocontainers
              image: ikubernetes/myapp:v1
              imagePullPolicy: IfNotPresent
              ports:
              - name: http
                containerPort: 80

三、Deployment(重點)

  Pod 和ReplicaSet 的實際狀態改變到用戶的目標狀態。支持擴容、回滾、更新等功能;管理無狀態應用最好的控制器;守護進程類(作用於replicaset上,支持回滾等操作),定義的yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploymentdemo
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
        version: v1
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80

版本更新和回滾

 

版本更新修策略改:(少用)

如果您要選擇更新策略,如您希望更新時  不停止原容器,可以修改maxUnavailable參數爲0,具體如何使用可在master節點上執如下命令,查看解釋:

kubectl explain deployment.spec.strategy.rollingUpdate

查看回滾版本:

kubectl rollout history deploy  myapp-deploy

回滾到上一個版本:

kubectl rollout undo deployment/nginx-test

kubectl rollout undo deployment myapp

也可以使用 --revision參數指定某個歷史版本:

kubectl rollout undo deployment/nginx-test --to-revision=2

kubectl rollout undo deployment myapp --to-revision=1

當您回滾到第一個版本時,再選擇回滾一個版本 就會回滾到最後一個修改的版本。

資源更新

  當您需要修改鏡像時,最簡單的方式是選擇修改yaml文件,然後apply -f 重新加載文件,deployment會自動讀取滾動升級。但如果您要通過腳本等方式來實現修改deployment,修改配置文件就不是明智的選擇了,我們可以使用patch命令:

kubectl patch

語法

$ patch (-f FILENAME | TYPE NAME) -p PATCH

示例

使用patch更新Node節點。

kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

更新容器的鏡像

kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'
更新deployment
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1, "maxUnavailable":0}}}}'

當然,如果只是修改容器的話 ,我們可以使用更簡單的命令 set image

kubectl set image

更新現有的資源對象的容器鏡像。

可使用資源對象包括(不區分大小寫):

pod (po)、replicationcontroller (rc)、deployment (deploy)、daemonset (ds)、job、replicaset (rs)

語法

$ image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N

示例

將deployment中的nginx容器鏡像設置爲“nginx:1.9.1”。

kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1

所有deployment和rc的nginx容器鏡像更新爲“nginx:1.9.1”

kubectl set image deployments,rc nginx=nginx:1.9.1 --all

將daemonset abc的所有容器鏡像更新爲“nginx:1.9.1”

kubectl set image daemonset abc *=nginx:1.9.1

從本地文件中更新nginx容器鏡像

kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml

四、Daemonset

本部分參考:https://www.cnblogs.com/breezey/p/6582519.html

在有種場景下,我們需要在所有的kubernetes節點上都運行同一個應用的一個副本,比如在後續我們會說如何收集kubernetes中的pod日誌,在收集日誌的時候,需要在每個k8s node節點上運行一個收集日誌的進程 ,如fluentd。我們知道在通常情況下,kubernetes基於它內部的調度算法來自動分配pod運行在哪個節點上,沒有辦法保證在每個node上運行一個fluentd pod。這個時候,daemonsets的調度方式就派上了用場。簡單來說,daemonsets就是讓一個應用在所有的k8s集羣節點上都運行一個副本。

我們直接看下面的示例,在所有節點上都啓動一個busybox:

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: busybox
spec:
  template:
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: myhub.mingyuanyun.com/library/busybox
        command:
        - sleep
        - "3600"

我們通過kubectl get daemonset可以看到啓動了6個busybox的pod,因爲我們有6個kubernetes節點。而事實上,我們並沒有指定複製的個數,這就是daemonsets的作用:

NAME      DESIRED   CURRENT   READY     NODE-SELECTOR   AGE
busybox   6         6         6         <none>          1m

您還可以參考:https://www.cnblogs.com/xzkzzz/p/9553321.html (啓動一個redis配置一下filebeat)

 

此部分 後續還會更新,

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