1. 程式人生 > 實用技巧 >四、常用控制器

四、常用控制器

POD與controllers的關係   controllers:在叢集上管理和執行容器的物件   通過label和seletor相關聯   pod通過控制器實現應用的運維,如彈性伸縮,滾動更新等 Controllers的分類   Deployment : 無狀態應用部署   StatefulSet : 有狀態應用部署   DaemonSet : 確保所有Node運行同一個Pod   Job : 一次性任務   Cronjob : 定時任務 Deployment 部署無狀態應用   • 管理Pod和ReplicaSet   • 具有上線部署、副本設定、滾動升級、回滾等功能   • 提供宣告式更新,例如只更新一個新的Image   應用場景:Web服務,微服務,API 無狀態部署也就是說啟動的pod都是基於一個模板的,比如有個node掛了,那麼pod會在別的node上拉起,不會考慮儲存,網路,只要能在任意節點上能起來,並且多個例項對於同一個請求響應的結果是完全一致的 1、部署應用   kubectl create deployment web --image=nginx:1.14   kubectl get deploy,pods 2、暴露應用   kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web kubectl get service 3、應用升級   kubectl set image deployment/web nginx=nginx:1.15   kubectl rollout status deployment/web   或者直接修改ymal檔案,執行kubectl apply -f deployment.yaml   k8s會先去啟動pod,啟動成功後再關閉原來的pods 4、應用回滾   在啟動pod的時候最後加上 --record,可以在檢視歷史版本的時候看到pod資訊   如:kubectl apply -f deployment.yaml --record     檢視歷史版本       kubectl rollout history deployment {控制器名稱}     回滾       kubectl rollout undo deployment {控制器名稱}     回滾到指定版本       kubectl rollout undo deployment {控制器名稱} --to-revision=2 5、擴容/縮容   kubectl scale deployment web --replicas=10 StatefulSet
部署有狀態應用 解決Pod獨立生命週期,保持Pod啟動順序和唯一性   1. 穩定,唯一的網路識別符號(例項之間通訊地址要固定),持久儲存   2. 有序,按先後順序進行部署和擴充套件、刪除和終止 應用場景:分散式應用(mysql,zk,etcd) 有狀態部署就是每個pod都有獨立的資料和網路,在建立一個新的有狀態應用時,可以通過備份恢復這些資料 Headless Service.yaml檔案 就是把clusterIP設定為None,不需要clusterIP,而是為每個pod提供一個固定的dns名稱,部署成功可以通過kubectl get svc可以看到clusterIP為None clusterIP為None表示誰用了這個service,service就要負責這個pod的網路
apiVersion: v1
kind: Service
metadata:
  labels:
    app: web
  name: web
spec:
  clusterIP: None
  ports:
  
- protocol: TCP port: 80 targetPort: 80 selector: app: web
StatefulSet.yaml容器啟動檔案
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: web
  name: web
spec:
  # 需要設定service的name,告訴StatefulSet控制器要使用hanless service來保證pod身份
  serviceName: web
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      
- name: nginx image: nginx
我們可以手動啟動一個busybox容器去解析,解析有狀態應用返回的是三個pod的ip和對應的dns記錄,為了保證通訊地址的固定

StatefulSet的儲存卷yaml檔案 使用VolumeClaimTemplate建立, 稱為卷申請模板(StatefulSet獨有),當StatefulSet使用VolumeClaimTemplate 建立一個PersistentVolume時,同樣也會為每個Pod分配 並建立一個編號的PVC,給每個pod也都會生成一個pv作為獨立儲存 和deployment的區別是:deployment的pod是共用一個pv,而StatefulSet是一個pod對應一個pv
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: web
  name: web
spec:
  serviceName: web
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  # 使用卷申請模板
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      # 訪問模式
      accessModes: [ "ReadWriteOnce" ]
      # 指定儲存的pv名稱
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 1Gi
DaemonSet   • 在每一個Node上執行一個Pod   • 新加入的Node也同樣會自動執行一個Pod   應用場景:Agent DaemonSetymal部署的ymal格式,和Deployment 相似
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dsl
spec:
  selector:
    matchLabels:
      projecte: blog
      app: java-demo
  template:
    metadata:
      labels:
        projecte: blog
        app: java-demo
    spec:
      containers:
      - name: web
        image: nginx
        ports:
        - containerPort: 80

Job   分為普通任務(Job)和定時任務(CronJob)   一次性執行   應用場景:離線資料處理,視訊解碼等業務
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
       - name: pi
         # 跑的映象
         image: perl
         # 傳遞的引數,跑任務
         command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
       restartPolicy: Never
CronJob

  定時任務,像Linux的Crontab一樣

  定時任務

  應用場景:通知,備份
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  # 分時日月周,這裡代表每分鐘執行一次
  schedule: "*/1 * * * *"
  template:
    spec:
      containers:
       - name: pi
         image: busybox
         args: 
         - /bin/sh 
         - -c 
         - date; echo Hello from the Kubernetes cluster
       restartPolicy: OnFailure
    # 定義重啟次數
    backoffLimit: 4