1. 程式人生 > >kubernetes-控制器Deployment和DaemonSet(八)

kubernetes-控制器Deployment和DaemonSet(八)

日誌收集 無狀態應用 分享圖片 template images star 替換 selector 技術分享

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,例如fluentdlogstash
  • 在每個 Node 上運行監控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond
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(八)