kubernetes 核心技術-Controller 控制器

1、什麼是Controller?

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

 

2、Pod和Controller的關係

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

Pod 和 Controller之間是經過label標籤來創建關係,同時Controller又被稱爲控制器工做負載nginx

在這裏插入圖片描述

 

3、Deployment控制器應用場景

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

  Deployment表示用戶對K8S集羣的一次更新操做。Deployment是一個比RS( Replica Set, RS) 應用模型更廣的 API 對象,能夠是建立一個新的服務,更新一個新的服務,也能夠是滾動升級一個服務。滾動升級一個服務,實際是建立一個新的RS,而後逐漸將新 RS 中副本數增長到理想狀態,將舊RS中的副本數減小到0的複合操做。web

  這樣一個複合操做用一個RS是很差描述的,因此用一個更通用的Deployment來描述。以K8S的發展方向,將來對全部長期伺服型的業務的管理,都會經過Deployment來管理。docker



4、Deployment控制器部署應用

以前咱們也使用Deployment部署過應用,以下代碼所示shell

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

可是上述代碼不是很好的進行復用,由於每次咱們都須要從新輸入代碼,因此咱們都是經過YAML進行配置vim

可是咱們能夠嘗試使用上面的代碼建立一個鏡像【只是嘗試,不會建立】api

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之間創建關係的橋樑
在這裏插入圖片描述session

4.2 使用YAML建立Pod

經過剛剛的代碼,咱們已經生成了YAML文件,下面咱們就可使用該配置文件快速建立Pod鏡像了app

[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了http://192.168.88.11:32180/
在這裏插入圖片描述

 

5、升級回滾和彈性伸縮

  • 升級: 假設從版本爲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 
相關文章
相關標籤/搜索