Kubernetes(K8S)(五)——控制器(ReplicaSet 、Deployment 、DaemonSet 、Job 、CronJob )

1.控制器的介紹

Pod 的分類:
• 自主式 Pod:Pod 退出後不會被創建
• 控制器管理的 Pod:在控制器的生命週期裏,始終要維持 Pod 的副本數目

控制器類型:
• Replication Controller和ReplicaSet
• Deployment
• DaemonSet
• StatefulSet
• Job
• CronJob
• HPA全稱Horizontal Pod Autoscaler

1.Replication Controller和ReplicaSet
ReplicaSet 是下一代的 Replication Controller,官方推薦使用ReplicaSet。
ReplicaSet 和 Replication Controller 的唯一區別是選擇器的支持,ReplicaSet 支持新的基於集合的選擇器需求。ReplicaSet 確保任何時間都有指定數量的 Pod 副本在運行。雖然 ReplicaSets 可以獨立使用,但今天它主要被Deployments 用作協調 Pod 創建、刪除和更新的機制。

2.Deployment
Deployment 爲 Pod 和 ReplicaSet 提供了一個申明式的定義方法。典型的應用場景: 用來創建Pod和ReplicaSet 、滾動更新和回滾、擴容和縮容、暫停與恢復。

3.DaemonSet
DaemonSet 確保全部(或者某些)節點上運行一個 Pod 的副本。當有節點加入集羣時, 也會爲他們新增一個 Pod 。當有節點從集羣移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod。
DaemonSet 的典型用法:
在每個節點上運行集羣存儲 DaemonSet,例如 glusterd、ceph。
在每個節點上運行日誌收集 DaemonSet,例如 fluentd、logstash。
在每個節點上運行監控 DaemonSet,例如 Prometheus Node Exporter、zabbix agent等
• 一個簡單的用法是在所有的節點上都啓動一個 DaemonSet,將被作爲每種 類型的 daemon 使用。 • 一個稍微複雜的用法是單獨對每種 daemon 類型使用多個 DaemonSet, 但具有不同的標誌, 並且對不同硬件類型具有不同的內存、CPU 要求。

4.StatefulSet
StatefulSet 是用來管理有狀態應用的工作負載 API 對象。實例之間有不對 等關係,以及實例對外部數據有依賴關係的應用,稱爲“有狀態應用”
StatefulSet 用來管理 Deployment 和擴展一組 Pod,並且能爲這些 Pod 提供序號和唯一性保證
StatefulSets 對於需要滿足以下一個或多個需求的應用程序很有價值:
• 穩定的、唯一的網絡標識符。
• 穩定的、持久的存儲
• 有序的、優雅的部署和縮放。
• 有序的、自動的滾動更新。

5.Job
Job執行批處理任務,僅執行一次任務,保證任務的一個或多個Pod成功結束。

6.CronJob
Cron Job 創建基於時間調度的 Jobs。 一個 CronJob 對象就像 crontab (cron table) 文件中的一行,它用 Cron 格式進行編寫,並週期性地在給定的調度時間執行 Job。

7.HPA
HPA根據資源利用率自動調整service中Pod數量,實現Pod水平自動縮放。


2. ReplicaSet控制器

參考官網:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#replicaset-v1-apps

[kubeadm@server1 mainfest]$ vim rs.yml
[kubeadm@server1 mainfest]$ cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[kubeadm@server1 mainfest]$ kubectl apply -f rs.yml 
replicaset.apps/replicaset-example created
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
replicaset-example-69tbm   1/1     Running   0          17s   10.244.1.31   server2   <none>           <none>
replicaset-example-d46ff   1/1     Running   0          17s   10.244.2.44   server3   <none>           <none>
replicaset-example-tmm25   1/1     Running   0          17s   10.244.2.45   server3   <none>           <none>
[kubeadm@server1 mainfest]$ vim rs.yml
[kubeadm@server1 mainfest]$ cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 10
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[kubeadm@server1 mainfest]$ kubectl apply -f rs.yml 
replicaset.apps/replicaset-example configured
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
replicaset-example-69tbm   1/1     Running   0          39s   10.244.1.31   server2   <none>           <none>
replicaset-example-7zxcw   1/1     Running   0          4s    10.244.1.35   server2   <none>           <none>
replicaset-example-94p7z   1/1     Running   0          4s    10.244.2.47   server3   <none>           <none>
replicaset-example-d46ff   1/1     Running   0          39s   10.244.2.44   server3   <none>           <none>
replicaset-example-f9vf9   1/1     Running   0          4s    10.244.1.33   server2   <none>           <none>
replicaset-example-lbpls   1/1     Running   0          4s    10.244.2.48   server3   <none>           <none>
replicaset-example-spt6f   1/1     Running   0          4s    10.244.1.32   server2   <none>           <none>
replicaset-example-tfwjh   1/1     Running   0          4s    10.244.1.34   server2   <none>           <none>
replicaset-example-tmm25   1/1     Running   0          39s   10.244.2.45   server3   <none>           <none>
replicaset-example-vsl5k   1/1     Running   0          4s    10.244.2.46   server3   <none>           <none>
[kubeadm@server1 mainfest]$ vim rs.yml
[kubeadm@server1 mainfest]$ cat rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[kubeadm@server1 mainfest]$ kubectl apply -f rs.yml 
replicaset.apps/replicaset-example configured
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME                       READY   STATUS        RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
replicaset-example-69tbm   1/1     Running       0          57s   10.244.1.31   server2   <none>           <none>
replicaset-example-7zxcw   0/1     Terminating   0          22s   10.244.1.35   server2   <none>           <none>
replicaset-example-94p7z   0/1     Terminating   0          22s   10.244.2.47   server3   <none>           <none>
replicaset-example-d46ff   0/1     Terminating   0          57s   10.244.2.44   server3   <none>           <none>
replicaset-example-f9vf9   0/1     Terminating   0          22s   10.244.1.33   server2   <none>           <none>
replicaset-example-lbpls   0/1     Terminating   0          22s   10.244.2.48   server3   <none>           <none>
replicaset-example-spt6f   0/1     Terminating   0          22s   10.244.1.32   server2   <none>           <none>
replicaset-example-tfwjh   0/1     Terminating   0          22s   10.244.1.34   server2   <none>           <none>
replicaset-example-tmm25   1/1     Running       0          57s   10.244.2.45   server3   <none>           <none>
replicaset-example-vsl5k   0/1     Terminating   0          22s   10.244.2.46   server3   <none>           <none>
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
replicaset-example-69tbm   1/1     Running   0          66s   10.244.1.31   server2   <none>           <none>
replicaset-example-tmm25   1/1     Running   0          66s   10.244.2.45   server3   <none>           <none>
[kubeadm@server1 mainfest]$ kubectl get all
NAME                           READY   STATUS    RESTARTS   AGE
pod/replicaset-example-69tbm   1/1     Running   0          74s
pod/replicaset-example-tmm25   1/1     Running   0          74s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/replicaset-example   2         2         2       74s

控制器可以任意拉縮
在這裏插入圖片描述
在這裏插入圖片描述
回收的時候會優先回收新創建的容器
在這裏插入圖片描述
在這裏插入圖片描述
但是如果修改鏡像,則不會滿足。
在這裏插入圖片描述
在這裏插入圖片描述


3.deployment控制器

參考官網:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#deployment-v1-apps

3.1 單個deployment控制器

[kubeadm@server1 mainfest]$ vim deployment.yml
[kubeadm@server1 mainfest]$ cat deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
        ports:
        - containerPort: 80
[kubeadm@server1 mainfest]$ kubectl apply -f deployment.yml 
deployment.apps/deployment-myapp created
[kubeadm@server1 mainfest]$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/deployment-myapp-569fb7cdcb-4z2bp   1/1     Running   0          10s
pod/deployment-myapp-569fb7cdcb-s7qv6   1/1     Running   0          10s
pod/deployment-myapp-569fb7cdcb-wrddw   1/1     Running   0          10s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d1h

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-myapp   3/3     3            3           10s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-myapp-569fb7cdcb   3         3         3       10s

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
注意:在deployment控制器中,如果刪除pod後還會有新的pod的pod,所以如果pod狀態不對可以刪除進行調整。


3.2 多個deployment控制器

[kubeadm@server1 mainfest]$ vim deployment.yml 
[kubeadm@server1 mainfest]$ cat deployment.yml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-v1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-v2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2
        ports:
        - containerPort: 80

[kubeadm@server1 mainfest]$ kubectl apply -f deployment.yml 
deployment.apps/deployment-v1 created
deployment.apps/deployment-v2 created
[kubeadm@server1 mainfest]$ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod/deployment-myapp-569fb7cdcb-2tnnl   1/1     Running   0          10m
pod/deployment-myapp-569fb7cdcb-9n92v   1/1     Running   0          10m
pod/deployment-myapp-569fb7cdcb-pzjwt   1/1     Running   0          10m
pod/deployment-v1-569fb7cdcb-bqtjj      1/1     Running   0          8s
pod/deployment-v1-569fb7cdcb-ctzp6      1/1     Running   0          8s
pod/deployment-v1-569fb7cdcb-xjnf4      1/1     Running   0          8s
pod/deployment-v2-6b54f6ffb9-lbbbx      1/1     Running   0          7s
pod/deployment-v2-6b54f6ffb9-q7fph      1/1     Running   0          8s
pod/deployment-v2-6b54f6ffb9-rvgzq      1/1     Running   0          7s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d1h

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deployment-myapp   3/3     3            3           18m
deployment.apps/deployment-v1      3/3     3            3           8s
deployment.apps/deployment-v2      3/3     3            3           8s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/deployment-myapp-569fb7cdcb   3         3         3       18m
replicaset.apps/deployment-myapp-6b54f6ffb9   0         0         0       13m
replicaset.apps/deployment-v1-569fb7cdcb      3         3         3       8s
replicaset.apps/deployment-v2-6b54f6ffb9      3         3         3       8s

[kubeadm@server1 mainfest]$ kubectl delete deployments.apps deployment-v1 ##刪除其中一個控制器

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


4.DaemonSet控制器

DaemonSet控制器可以每個節點部署一個容器
參考

[kubeadm@server1 mainfest]$ vim daemonset.yml
[kubeadm@server1 mainfest]$ cat daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
  labels:
    k8s-app: zabbix-agent
spec:
  selector:
    matchLabels:
      name: zabbix-agent
  template:
    metadata:
      labels:
        name: zabbix-agent
    spec:
      containers:
      - name: zabbix-agent
        image: zabbix-agent
[kubeadm@server1 mainfest]$ kubectl apply -f daemonset.yml 
daemonset.apps/daemonset-example created
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
daemonset-example-8n9mv   1/1     Running   0          8s    10.244.2.59   server3   <none>           <none>
daemonset-example-zfprr   1/1     Running   0          8s    10.244.1.44   server2   <none>           <none>

在這裏插入圖片描述


5.Job控制器

參考官網:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#job-v1-batch

[kubeadm@server1 mainfest]$ vim job.yml
[kubeadm@server1 mainfest]$ cat job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
   metadata:
     name: pi
   spec:
     containers:
     - name: pi
       image: perl
       command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
     restartPolicy: Never
[kubeadm@server1 mainfest]$ kubectl apply -f job.yml 
job.batch/pi created
[kubeadm@server1 mainfest]$ kubectl get pod 
NAME       READY   STATUS      RESTARTS   AGE
pi-fzj8p   0/1     Completed   0          6s
[kubeadm@server1 mainfest]$ kubectl get pod -o wide
NAME       READY   STATUS      RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
pi-fzj8p   0/1     Completed   0          12s   10.244.2.60   server3   <none>           <none>
[kubeadm@server1 mainfest]$ kubectl logs pi-fzj8p
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901

在這裏插入圖片描述


6. CronJob 控制器

[kubeadm@server1 mainfest]$ vim cronjob.yml
[kubeadm@server1 mainfest]$ cat cronjob.yml
apiVersion: batch/v1beta1 
kind: CronJob 
metadata:  
  name: cronjob-example 
spec:  
  schedule: "* * * * *"  
  jobTemplate:    
    spec:      
      template:        
        spec:          
          containers:          
          - name: cronjob            
            image: busybox            
            args:            
            - /bin/sh            
            - -c            
            - date; echo Hello from k8s cluster          
          restartPolicy: OnFailure
[kubeadm@server1 mainfest]$ kubectl apply -f cronjob.yml 
cronjob.batch/cronjob-example created
[kubeadm@server1 mainfest]$ kubectl get pod
No resources found in default namespace.
[kubeadm@server1 mainfest]$ kubectl get pod 
NAME                               READY   STATUS      RESTARTS   AGE
cronjob-example-1593121920-sv47j   0/1     Completed   0          54s
[kubeadm@server1 mainfest]$ kubectl get pod 
NAME                               READY   STATUS              RESTARTS   AGE
cronjob-example-1593121920-sv47j   0/1     Completed           0          65s
cronjob-example-1593121980-pxjvs   0/1     ContainerCreating   0          5s
[kubeadm@server1 mainfest]$ kubectl logs cronjob-example-1593121920-sv47j
Thu Jun 25 21:52:39 UTC 2020
Hello from k8s cluster
[kubeadm@server1 mainfest]$ kubectl logs cronjob-example-1593121980-pxjvs
Thu Jun 25 21:53:13 UTC 2020
Hello from k8s cluster

在這裏插入圖片描述
在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章