四、常用控制器
阿新 • • 發佈:2020-10-22
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:StatefulSet.yaml容器啟動檔案- protocol: TCP port: 80 targetPort: 80 selector: app: web
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:我們可以手動啟動一個busybox容器去解析,解析有狀態應用返回的是三個pod的ip和對應的dns記錄,為了保證通訊地址的固定 StatefulSet的儲存卷yaml檔案 使用VolumeClaimTemplate建立, 稱為卷申請模板(StatefulSet獨有),當StatefulSet使用VolumeClaimTemplate 建立一個PersistentVolume時,同樣也會為每個Pod分配 並建立一個編號的PVC,給每個pod也都會生成一個pv作為獨立儲存 和deployment的區別是:deployment的pod是共用一個pv,而StatefulSet是一個pod對應一個pv- name: nginx image: nginx
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: 1GiDaemonSet • 在每一個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: 80Job 分為普通任務(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: NeverCronJob
定時任務,像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