Kubernetes之控制器詳解
Kubernetes控制器介紹
Pod通過控制器實現應用的運維,如伸縮、升級等,控制器決定了建立pod資源的方式和型別,在叢集上管理和執行容器的物件通過label-selector 相關聯。
控制器 又稱之為工作負載,分別包含以下型別控制器:
5種控制器型別
- Deployment
- StatefulSet
- DaemonSet
- Job
- CronJob
1.deployment
deployment詳解參見:https://www.cnblogs.com/wuxinchun/p/15226903.html
deployment特點:
- 部署無狀態應用,只關心數量,不論角色等,稱無狀態
- 管理Pod和ReplicaSet
- 具有上線部署、副本設定、滾動升級、回滾等功能
- 提供宣告式更新,例如只更新一個新的image
- 應用場景: web 服務
[root@k8s-master yaml]# cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: replicas: 3 #副本數 selector: matchLabels: app: nginx-pod template: metadata: labels: app: nginx-pod spec: containers: - name: nginx image: nginx:1.17.2 #建立資源 [root@k8s-master yaml]# kubectl create -f nginx.deployment.yaml #檢視建立的pod資源、控制器和副本 [root@k8s-master yaml]# kubectl get deploy,rs,pod NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/nginx-deployment 3/3 3 3 8m8s NAME DESIRED CURRENT READY AGE replicaset.apps/nginx-deployment-7c7477c7ff 3 3 3 8m8s NAME READY STATUS RESTARTS AGE pod/nginx-deployment-7c7477c7ff-486lz 1/1 Running 0 8m8s pod/nginx-deployment-7c7477c7ff-8fn2b 1/1 Running 0 8m8s pod/nginx-deployment-7c7477c7ff-jks7j 1/1 Running 0 8m8s #檢視歷史版本 [root@k8s-master yaml]# kubectl rollout history deployment nginx-deployment deployment.apps/nginx-deployment REVISION CHANGE-CAUSE 1 <none>
2. SatefulSet
SatefulSet特點:
- 部署有狀態應用
- 解決Pod獨立生命週期,保持Pod啟動順序和唯一性
- 穩定,唯一的網路識別符號,持久儲存(例如: etcd 配置檔案,節點地址發生變化,將無法使用)
- 有序,優雅的部署和擴充套件、刪除和終止(例如: mysql 主從關係,先啟動主,再啟動從)
- 有序,滾動更新
- 應用場景: 資料庫
有狀態和無狀態的區別:
無狀態:
- deployment認為所有的pod都是一樣的
- 不用考慮順序的要求
- 不用考慮在哪個node節點上執行
- 可以隨意擴容和縮容
有狀態:
- 例項之間有差別,每個例項都有自己的獨特性,元資料不同,例如etcd, zookeeper
- 例項之間不對等的關係,以及依靠外部儲存的應用。
常規service和無頭服務區別
service: 一組Pod訪問策略,提供cluster-IP群集之間通訊,還提供負載均衡和服務發現。
Headless service無頭服務, 不需要cluster-IP,直接繫結具體的Pod的IP(當Pod的IP地址是動態變化時,所以常用於繫結DNS訪問)
示例:先建立DNS資源
[root@k8s-master yaml]# cat dns-test.yaml apiVersion: v1 kind: Pod metadata: name: dns-test spec: containers: - name: busybox image: busybox:1.28.4 args: - /bin/sh - -c - sleep 36000 restartPolicy: Never [root@k8s-master yaml]# kubectl apply -f dns-test.yaml pod/dns-test created [root@k8s-master yaml]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dns-test 1/1 Running 0 13s 10.244.36.112 k8s-node1 <none> <none>
再用statefulset控制器型別 建立nginx pod資源,並建立無頭服務資源
[root@k8s-master yaml]# cat sts.yaml apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-statefulset namespace: default spec: serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 [root@k8s-master yaml]# kubectl create -f sts.yaml #有狀態化建立的pod,是自動進行打標籤進行區分 [root@k8s-master yaml]# kubectl get pod,svc -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/dns-test 1/1 Running 0 8m26s 10.244.36.112 k8s-node1 <none> <none> pod/nginx-statefulset-0 1/1 Running 0 6m46s 10.244.36.113 k8s-node1 <none> <none> pod/nginx-statefulset-1 1/1 Running 0 6m29s 10.244.169.147 k8s-node2 <none> <none> pod/nginx-statefulset-2 1/1 Running 0 6m26s 10.244.36.114 k8s-node1 <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d8h <none> service/nginx ClusterIP None <none> 80/TCP 6m46s app=nginx
#驗證DNS解析,解析pod的唯一域名和自身的IP [root@k8s-master yaml]# kubectl exec -it dns-test sh kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. / # nslookup nginx-statefulset-0 Server: 10.96.0.10 Address 1: 10.96.0.10 nslookup: can't resolve 'nginx-statefulset-0'
//在busybox容器去解析nginxpod域名異常,期望值應該根據nginx-statefulset-0解析出對應的pod IP為10.244.36.113
總結:StatefulSet與Deployment區別:StatefulSet建立的pod是有身份的!
身份三要素:
- 域名 nginx-statefulset-0.nginx
- 主機名 nginx-statefulset-0
- 儲存 (PVC)
3.DaemonSet
特點:
- 在每一個Node上執行一個Pod
- 新加入的Node也同樣會自動執行一個Pod
- 應用場景:Agent、監控
示例:用DaemonSet 控制器型別建立nginx pod資源,沒有指定副本replicats,它會根據node節點的個數建立,如果再新加一個node節點,也會給新node節點建立pod
[root@k8s-master yaml]# cat ds.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-deployment labels: app: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.4 ports: - containerPort: 80 [root@k8s-master yaml]# kubectl apply -f ds.yaml # DaemonSet會在每個node節點都建立一個Pod # 如果再新加一個node節點,也會給新node節點建立pod [root@k8s-master yaml]# kubectl get pods -o wide
4.Job
Job分為普通任務(Job)和定時任務(CronJob)
-
一次性執行
-
應用場景:離線資料處理,視訊解碼等業務:https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
示例:用job控制器型別建立資源,執行算圓周率的命令,保持後2000位,建立過程等同於在計算,重試次數預設是6次,修改為4次,當遇到異常時Never狀態會重啟,所以要設定次數。
# vim job.yaml 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 backoffLimit: 4 在node節點提前下載perl映象,因為映象比較大所以提前下載好 node1 node2節點: # docker pull perl 建立過程等同於在計算 # kubectl apply -f job.yaml job.batch/pi created 檢視狀態 # kubectl get pods # kubectl describe pod pi-tkdlc 檢視日誌,看計算結果,結果輸出到控制檯 # kubectl logs pi-tkdlc 3.141592653589793.............................................共2000位
檢視日誌,看計算結果,結果輸出到控制檯
5.CronJob
特點:
-
週期性任務,像Linux的Crontab一樣。
-
週期性任務
-
應用場景:通知,備份:https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/
示例:每隔一分鐘輸出一條資訊,列印hello
[root@k8s-master yaml]# cat cronjob.yaml apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure #建立資源 [root@k8s-master yaml]# kubectl create -f cronjob.yaml [root@k8s-master yaml]# kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 <none> 25s [root@k8s-master yaml]# kubectl get pods #檢視日誌,內容輸出到控制檯 [root@k8s-master yaml]# kubectl logs hello-1630755720-2psh8 Sat Sep 4 11:42:20 UTC 2021 Hello from the Kubernetes cluster #等待一分鐘後又會再執行一次 [root@k8s-master yaml]# kubectl get pods [root@k8s-master yaml]# kubectl logs hello-1630755720-2psh8 #最後刪除資源,不然第二天伺服器宕機 [root@k8s-master yaml]# kubectl delete -f cronjob.yaml
原文連結:https://blog.csdn.net/weixin_45691464/article/details/106326605
作者:傑巨集唯一 出處:http://www.cnblogs.com/wuxinchun/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利.