kubernetes 核心技術-Controller 控制器

  • 2021 年 1 月 24 日
  • 筆記

一、什麼是Controller?

Controller是在集群上管理和運行容器的對象,Controller是實際存在的,Pod是抽象的,主要創建管理pod

 

二、Pod和Controller的關係

Pod是通過Controller實現應用的運維,比如彈性伸縮,滾動升級等

Pod 和 Controller之間是通過label標籤來建立關係,同時Controller又被稱為控制器工作負載

在这里插入图片描述

 

三、Deployment控制器應用場景

  • Deployment控制器可以部署無狀態應用
  • 管理Pod和ReplicaSet
  • 部署,滾動升級等功能
  • 應用場景:web服務,微服務

  Deployment表示用戶對K8S集群的一次更新操作。Deployment是一個比RS( Replica Set, RS) 應用模型更廣的 API 對象,可以是創建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是創建一個新的RS,然後逐漸將新 RS 中副本數增加到理想狀態,將舊RS中的副本數減少到0的複合操作。

  這樣一個複合操作用一個RS是不好描述的,所以用一個更通用的Deployment來描述。以K8S的發展方向,未來對所有長期伺服型的業務的管理,都會通過Deployment來管理。



四、Deployment控制器部署應用

之前我們也使用Deployment部署過應用,如下程式碼所示

[root@k8s-master ~]$ kubectrl create deployment web --image=nginx

但是上述程式碼不是很好的進行復用,因為每次我們都需要重新輸入程式碼,所以我們都是通過YAML進行配置

但是我們可以嘗試使用上面的程式碼創建一個鏡像【只是嘗試,不會創建】

4.1 導出yaml文件

[root@k8s-master ~]$ kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml

[root@k8s-master ~]$ cat web.yaml
apiVersion: apps/v1  #API版本,可以用kubectl api-versions命令查詢
kind: Deployment  #yaml文件定義的資源類型和角色,可以是Deployment、Job、Ingress、Service等
metadata:  #元數據,固定值寫metadata,包含Pod的一些meta資訊,比如名稱、namespace、標籤等資訊。
  creationTimestamp: null 
  labels:  # 設定資源的標籤
    app: web
  name: web
spec:  # 資源規範欄位
  replicas: 1 # 聲明副本數目
  selector: # 選擇器
    matchLabels: # 匹配標籤
      app: web  #匹配template標籤的web
  strategy: {} # 策略
  template: # 模版
    metadata: # 資源的元數據/屬性
      creationTimestamp: null
      labels:  # 設定資源的標籤
        app: web 
    spec: # 資源規範欄位
      containers:
      - image: nginx # 容器使用的鏡像地址
        name: nginx # 容器的名字
        resources: {}
status: {}

我們看到的 selector 和 label 就是我們Pod 和 Controller之間建立關係的橋樑
在这里插入图片描述

4.2 使用YAML創建Pod

通過剛剛的程式碼,我們已經生成了YAML文件,下面我們就可以使用該配置文件快速創建Pod鏡像了

[root@k8s-master ~]$ kubectl apply -f web.yaml

[root@k8s-master ~]$ kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
web-5dcb957ccc-jph2p   1/1     Running   0          63s

但是因為這個方式創建的,我們只能在集群內部進行訪問,所以我們還需要對外暴露埠

[root@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1

關於上述命令,有幾次參數

  • --port:就是我們內部的埠號
  • --target-get-port:就是暴露外面訪問的埠號
  • --name:名稱
  • --type:類型

導出發布對應的配置文件

[root@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml

[root@k8s-master ~]$ cat web1.yaml
apiVersion: v1 # 指定api版本,此值必須在kubectl api-versions中
kind: Service # 指定創建資源的角色/類型
metadata: # 資源的元數據/屬性
  creationTimestamp: "2021-01-24T12:53:26Z"
  labels: # 設定資源的標籤
    app: web
  managedFields: 
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2021-01-24T12:53:26Z"
  name: web1
  namespace: default
  resourceVersion: "52349"
  selfLink: /api/v1/namespaces/default/services/web1
  uid: 296d8c14-d397-42d4-b26d-28de0a7d372d
spec:
  clusterIP: 10.99.52.163
  externalTrafficPolicy: Cluster
  ports:  #對外發布
  - nodePort: 32180
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}
 

#對外暴露服務
[root@k8s-master ~]$ kubectl apply -f web1.yaml

可以通過下面的命令來查看對外暴露的服務

[root@k8s-master ~]$  kubectl get pods,svc
NAME                       READY   STATUS    RESTARTS   AGE
pod/web-5dcb957ccc-jph2p   1/1     Running   0          11m

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        8h
service/web1         NodePort    10.99.52.163   <none>        80:32180/TCP   6m2s

然後我們訪問對應的url,即可看到 nginx了//192.168.88.11:32180/
在这里插入图片描述

 

五、升級回滾和彈性伸縮

  • 升級: 假設從版本為1.14 升級到 1.15 ,這就叫應用的升級【升級可以保證服務不中斷】
  • 回滾: 從版本1.15 變成 1.14,這就叫應用的回滾
  • 彈性伸縮: 我們根據不同的業務場景,來改變Pod的數量對外提供服務,這就是彈性伸縮

之前創建的pod刪除掉

[root@k8s-master ~]# kubectl delete deployment web

5.1 應用升級和回滾

5.1.1 應用升級

首先創建一個 1.14版本的Pod

[root@k8s-master ~]$ vim web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:1.14 #指定1.14版本
        name: nginx
        resources: {}
status: {}

開始創建Pod

[root@k8s-master ~]$ kubectl apply -f web.yaml

在node節點使用docker images命令,就能看到我們成功拉取到了一個 1.14版本的鏡像
在这里插入图片描述

使用下面的命令,可以將nginx從 1.14 升級到 1.15

[root@k8s-master ~]$ kubectl set image deployment web nginx=nginx:1.15

在这里插入图片描述

  1. 首先是開始的nginx 1.14版本的Pod在運行,然後 1.15版本的在創建
  2. 然後在1.15版本創建完成後,就會暫停1.14版本
  3. 最後把1.14版本的Pod移除,完成我們的升級

我們在下載 1.15版本,容器就處於ContainerCreating狀態,然後下載完成後,就用 1.15版本去替換1.14版本了,這麼做的好處就是:升級可以保證服務不中斷

5.1.2 查看升級狀態

[root@k8s-master ~]$ kubectl rollout status deployment web
deployment "web" successfully rolled out

5.1.3 應用回滾

查看歷史版本

[root@k8s-master ~]$ kubectl rollout history deployment web
deployment.apps/web 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

回滾到上一個版本

[root@k8s-master ~]$ kubectl rollout undo deployment web
#undo

同時我們還可以回滾到指定版本

[root@k8s-master ~]$ kubectl rollout undo deployment web --to-revision=2

 

5.2 彈性伸縮

彈性伸縮,也就是我們通過命令一下創建多個副本

[root@k8s-master ~]$ kubectl scale deployment web --replicas=10

[root@k8s-master ~]$ kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-65b7447c7-28ppk   1/1     Running   0          3m5s
web-65b7447c7-8rspl   1/1     Running   1          6m42s
web-65b7447c7-9mv5n   1/1     Running   0          3m5s
web-65b7447c7-9sqrv   1/1     Running   0          3m5s
web-65b7447c7-c8g9t   1/1     Running   0          3m5s
web-65b7447c7-mczxb   1/1     Running   0          3m5s
web-65b7447c7-nxz2h   1/1     Running   0          3m5s
web-65b7447c7-r6p75   1/1     Running   0          3m5s
web-65b7447c7-vx6mv   1/1     Running   0          3m5s
web-65b7447c7-vzt7s   1/1     Running   0          3m5s

Tags: