kubernetes-控制器Deployment和DaemonSet(八)
Pod與controllers的關系
?controllers:在集群上管理和運行容器的對象
?通過label-selector相關聯
?Pod通過控制器實現應用的運維,如伸縮,升級等
控制器又稱工作負載是用於實現管理pod的中間層,確保pod資源符合預期的狀態,pod的資源出現故障時,會嘗試 進行重啟,當根據重啟策略無效,則會重新新建pod的資源。
控制器有多種類型:
Deployment:工作在ReplicaSet之上,用於管理無狀態應用,目前來說最好的控制器。支持滾動更新和回滾功能,還提供聲明式配置。
DaemonSet:用於確保集群中的每一個節點只運行特定的pod副本,通常用於實現系統級後臺任務。比如ELK服務
Job:只要完成就立即退出,不需要重啟或重建。
Cronjob:周期性任務控制,不需要持續後臺運行,
StatefulSet:管理有狀態應用
ReplicaSet: 代用戶創建指定數量的pod副本數量,確保pod副本數量符合預期狀態,並且支持滾動式自動擴容和縮容功能。
Deployment
Deployment為Pod和Replica Set(下一代Replication Controller)提供聲明式更新。
只需要在 Deployment 中描述想要的目標狀態是什麽,Deployment controller 就會幫您將 Pod 和ReplicaSet 的實際狀態改變到您的目標狀態。也可以定義一個全新的 Deployment 來創建 ReplicaSet 或者刪除已有的 Deployment 並創建一個新的來替換。
典型的用例如下:
(1)使用Deployment來創建ReplicaSet。ReplicaSet在後臺創建pod。檢查啟動狀態,看它是成功還是失敗。 (2)然後,通過更新Deployment的PodTemplateSpec字段來聲明Pod的新狀態。這會創建一個新的ReplicaSet,Deployment會按照控制的速率將pod從舊的ReplicaSet移動到新的ReplicaSet中。 (3)如果當前狀態不穩定,回滾到之前的Deployment revision。每次回滾都會更新Deployment的revision。 (4)擴容Deployment以滿足更高的負載。 (5)暫停Deployment來應用PodTemplateSpec的多個修復,然後恢復上線。 (6)根據Deployment 的狀態判斷上線是否hang住了。 (7)清除舊的不必要的 ReplicaSet。
創建deployment
[root@k8s-master1 demo]# vim deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: default spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14 ports: - containerPort: 80 [root@k8s-master1 demo]# kubectl create -f deploy-demo.yaml deployment.apps/nginx-deployment created
查看Deployment已經創建了3個 replica ,剛創建的Replica Set將保證總是有3個副本的 pod 存在
[root@k8s-master1 demo]# kubectl get deploy,rs,pod -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR deployment.extensions/nginx-deployment 3/3 3 3 8s nginx nginx:1.14 app=nginx NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR replicaset.extensions/nginx-deployment-75465b4f74 3 3 3 8s nginx nginx:1.14 app=nginx,pod-template-hash=75465b4f74 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/nginx-deployment-75465b4f74-7qsh7 1/1 Running 0 8s 172.17.73.3 192.168.0.126 <none> <none> pod/nginx-deployment-75465b4f74-9p9kl 1/1 Running 0 8s 172.17.73.4 192.168.0.126 <none> <none> pod/nginx-deployment-75465b4f74-r9snc 1/1 Running 0 8s 172.17.32.2 192.168.0.125 <none> <none>
ReplicaSet 的名字總是<Deployment的名字>-<pod template的hash值>
。
[root@k8s-master1 demo]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-deployment-75465b4f74-7qsh7 1/1 Running 0 70s app=nginx,pod-template-hash=75465b4f74 nginx-deployment-75465b4f74-9p9kl 1/1 Running 0 70s app=nginx,pod-template-hash=75465b4f74 nginx-deployment-75465b4f74-r9snc 1/1 Running 0 70s app=nginx,pod-template-hash=75465b4f74
DaemonSet
DaemonSet 確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod。
使用 DaemonSet 的一些典型用法:
- 運行集群存儲 daemon,例如在每個 Node 上運行 ,應用場景:Agent。
- 在每個 Node 上運行日誌收集 daemon,例如
fluentd
、logstash
。 - 在每個 Node 上運行監控 daemon,例如 Prometheus Node Exporter、
collectd
、Datadog 代理、New Relic 代理,或 Gangliagmond
。
DaemonSet示例
創建redis-filebeat的yaml文件
[root@k8s-master1 demo]# vim ds-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: redis namespace: default spec: replicas: 1 selector: matchLabels: app: redis role: logstor template: metadata: labels: app: redis role: logstor spec: containers: - name: redis image: redis:4.0-alpine ports: - name: redis containerPort: 6379 --- apiVersion: apps/v1 kind: DaemonSet metadata: name: filebeat-ds namespace: default spec: selector: matchLabels: app: filebeat release: stable template: metadata: labels: app: filebeat release: stable spec: containers: - name: filebeat image: ikubernetes/filebeat:5.6.5-alpine env: - name: REDIS_HOST value: redis.default.svc.cluster.local - name: REDIS_LOG_LEVEL value: info
創建pod
[root@k8s-master1 demo]# kubectl apply -f ds-demo.yaml deployment.apps/redis created daemonset.apps/filebeat-ds created
暴露端口
[root@k8s-master1 demo]# kubectl expose deployment redis --port=6379 service/redis exposed [root@k8s-master1 demo]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 5d19h service/redis ClusterIP 10.0.0.150 <none> 6379/TCP 19s
查看pod ,DaemonSet在每個node上運行一個filebeat的pod
[root@k8s-master1 demo]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES filebeat-ds-dndjq 1/1 Running 0 17m 172.17.32.3 192.168.0.125 <none> <none> filebeat-ds-k6d6b 1/1 Running 0 17m 172.17.73.3 192.168.0.126 <none> <none> redis-85b846ff9c-wlxcg 1/1 Running 0 17m 172.17.32.2 192.168.0.125 <none> <none>
kubernetes-控制器Deployment和DaemonSet(八)