溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

docker中pod控制器怎么用

發(fā)布時間:2021-11-19 11:29:18 來源:億速云 閱讀:205 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)docker中pod控制器怎么用的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

    之前創(chuàng)建的pod,是通過資源配置清單定義的,如果手工把這樣的pod刪除后,不會自己重新創(chuàng)建,這樣創(chuàng)建的pod叫自主式Pod。

    在生產(chǎn)中,我們很少使用自主式pod。

    下面我們學(xué)習(xí)另外一種pod,叫控制器管理的Pod,控制器會按照定義的策略嚴(yán)格控制pod的數(shù)量,一旦發(fā)現(xiàn)pod數(shù)量少了,會立即自動建立出來新的pod;一旦發(fā)現(xiàn)pod多了,也會自動殺死多余的Pod。

    pod控制器:ReplicaSet控制器、Deployment控制器(必須掌握)、DaenibSet控制器、Job控制器

    ReplicaSet控制器:替用戶創(chuàng)建指定數(shù)量Pod的副本,并保證pod副本滿足用戶期望的數(shù)量;而且更新自動擴(kuò)縮容機(jī)制。replicat主要由三個組件組成:1、用戶期望的pod副本數(shù)量;2、標(biāo)簽選擇器(控制管理pod副本);3、pod資源模板(如果pod數(shù)量少于期望的,就根據(jù)pod模板來新建一定數(shù)量的pod)。

    Deployment控制器:Deployment通過控制replicaset來控制Pod。Deployment支持滾動更新和回滾,聲明式配置的功能。Deployment只關(guān)注群體,而不關(guān)注個體。

    DaemonSet控制器:用于確保集群中的每一個節(jié)點(diǎn)只運(yùn)行一個pod副本(畫外音,如果沒有DaemonSet,一個節(jié)點(diǎn)可以運(yùn)行多個pod副本)。如果在集群中新加一個節(jié)點(diǎn),那么這個新節(jié)點(diǎn)也會自動生成一個Pod副本。

    Job控制器:對于那些只做一次,只要完成就正常退出,沒完成才重構(gòu)pod ,叫job控制器。

    StatefulSet控制器:管理有狀態(tài)應(yīng)用,每一個pod副本都是被單獨(dú)管理的。它擁有著自己獨(dú)有的標(biāo)識。

    K8s在1.2+和1.7開始,支持TPR(third party resources 第三方資源)。在k8s 1.8+中,支持CDR(Custom Defined Reources,用戶自定義資源)。

 replicaset控制器

[root@master manifests]# kubectl explain replicaset
[root@master manifests]# kubectl explain  rs (replicaset的簡寫)
[root@master manifests]# kubectl explain rs.spec.template
[root@master manifests]# kubectl get deploy
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp          2         2         2            0           10d
mytomcat       3         3         3            3           10d
nginx-deploy   1         1         1            1           13d
[root@master manifests]# kubectl delete deploy myapp 
deployment.extensions "myapp" deleted
[root@master manifests]# kubectl delete deploy nginx-deploy
deployment.extensions "nginx-deploy" deleted
[root@master manifests]# cat rs-demo.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp
  namespace: default
spec: #這是控制器的spec
  replicas: 2 #幾個副本
  selector:   #查看幫助:,標(biāo)簽選擇器。 kubectl explain rs.spec.selector
    matchLabels:
      app: myapp
      release: canary
  template:  # 查看幫助:模板 kubectl explain rs.spec.template
    metadata: # kubectl explain rs.spec.template.metadata
      name: myapp-pod
      labels:  #必須符合上面定義的標(biāo)簽選擇器selector里面的內(nèi)容
        app: myapp
        release: canary
        environment: qa
    spec: #這是pod的spec
      containers:
      - name: myapp-container
        image: ikubernetes/nginx:latest
        ports: 
        - name: http
          containerPort: 80
[root@master manifests]# kubectl create -f rs-demo.yaml 
replicaset.apps/myapp created
[root@master manifests]# kubectl get rs
NAME                 DESIRED   CURRENT   READY     AGE
myapp                2         2         2         3m

    看到上面的ready是2,表示兩個replcatset控制器都在正常運(yùn)行。

[root@master manifests]# kubectl get pods --show-labels
myapp-6kncv                1/1       Running            0          15m       app=myapp,environment=qa,release=canary
myapp-rbqjz                1/1       Running            0          15m       app=myapp,environment=qa,release=canary         5m
pod-demo                   0/2       CrashLoopBackOff   2552       9d        app=myapp,tier=frontend

    上面就是replicatset控制器創(chuàng)建的兩個pod。

[root@master manifests]# kubectl describe pods myapp-6kncv 
IP:                 10.244.2.44
[root@master manifests]# curl  10.244.2.44
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

編輯replicatset的配置文件(這個文件不是我們手工創(chuàng)建的,而是apiserver維護(hù)的)

[root@master manifests]# kubectl edit rs myapp

    把里面的replicas改成5,保存后就立即生效。

[root@master manifests]#  kubectl get pods --show-labels
NAME                       READY     STATUS              RESTARTS   AGE       LABELS
client                     0/1       Error               0          11d       run=client
liveness-httpget-pod       1/1       Running             3          5d        <none>
myapp-6kncv                1/1       Running             0          31m       app=myapp,environment=qa,release=canary
myapp-c64mb                1/1       Running             0          3s        app=myapp,environment=qa,release=canary
myapp-fsrsg                1/1       Running             0          3s        app=myapp,environment=qa,release=canary
myapp-ljczj                0/1       ContainerCreating   0          3s        app=myapp,environment=qa,release=canary
myapp-rbqjz                1/1       Running             0          31m       app=myapp,environment=qa,release=canary

    同樣,也可以用命令kubectl edit rs myapp升級版本,改里面的image: ikubernetes/myapp:v2,這樣就變成v2版本了。

[root@master manifests]# kubectl get rs -o wide
NAME                 DESIRED   CURRENT   READY     AGE       CONTAINERS        IMAGES                 SELECTOR
myapp                5         5         5         1h        myapp-container   ikubernetes/myapp:v2   app=myapp,release=canary

    不過,只有pod重建后,比如增加刪除Pod,才會更新成v2版本。

Deployment控制器

    docker中pod控制器怎么用

    我們可以通過Deployment控制器來動態(tài)更新pod的版本。

    我們先建立replicatset v2版本,然后一個一個的刪除replicatset v1版本中的Pod,這樣自動新創(chuàng)建的pod就會變成v2版本了。當(dāng)pod全部變成v2版本后,replicatset v1并不會刪除,這樣一旦發(fā)現(xiàn)v2版本有問題,還可以回退到v1版本。

    通常deployment默認(rèn)保留10版本的replicatset。

[root@master manifests]# kubectl explain deploy
[root@master manifests]# kubectl explain deploy.spec
[root@master manifests]# kubectl explain deploy.spec.strategy (更新策略)
[root@master ~]# kubectl delete rs myapp
[root@master manifests]# cat deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector: #標(biāo)簽選擇器
    matchLabels: #匹配的標(biāo)簽為
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp #和上面的myapp要匹配
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
[root@master manifests]# kubectl apply -f deploy-demo.yaml 
deployment.apps/myapp-deploy created

    apply表示是聲明式更新和創(chuàng)建。

[root@master manifests]# kubectl get deploy
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp-deploy   2         2         2            2           1m
[root@master ~]# kubectl get rs
NAME                      DESIRED   CURRENT   READY     AGE
myapp-deploy-69b47bc96d   2         2         2         17m

    上面的rs式deployment自動創(chuàng)建的。

[root@master ~]# kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
myapp-deploy-69b47bc96d-7jnwx   1/1       Running   0          19m
myapp-deploy-69b47bc96d-btskk   1/1       Running   0          19m

    修改配置文件deploy-demo.yaml,把replicas數(shù)字改成3,然后再執(zhí)行kubectl apply -f deploy-demo.yaml 即可使配置文件里面的內(nèi)容生效。

[root@master ~]# kubectl describe deploy myapp-deploy
[root@master ~]# kubectl get pods -l app=myapp -w

  -l使標(biāo)簽過濾

 -w是動態(tài)監(jiān)控

[root@master ~]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                 SELECTOR
myapp-deploy-69b47bc96d   2         2         2         1h        myapp        ikubernetes/myapp:v1   app=myapp,pod-template-hash=2560367528,release=canary

看滾動更新的歷史:

[root@master ~]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION  CHANGE-CAUSE
1         <none>

  下面我們把deployment改成5個:我們可以使用vim  deploy-demo.yaml方法,把里面的replicas改成5。當(dāng)然,還可以使用另外一種方法,就patch方法,舉例如下。

[root@master manifests]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
deployment.extensions/myapp-deploy patched
[root@master manifests]#  kubectl get deploy
NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
myapp-deploy   5         5         5            5           2h
[root@master manifests]#  kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
myapp-deploy-69b47bc96d-7jnwx   1/1       Running   0          2h
myapp-deploy-69b47bc96d-8gn7v   1/1       Running   0          59s
myapp-deploy-69b47bc96d-btskk   1/1       Running   0          2h
myapp-deploy-69b47bc96d-p5hpd   1/1       Running   0          59s
myapp-deploy-69b47bc96d-zjv4p   1/1       Running   0          59s
mytomcat-5f8c6fdcb-9krxn        1/1       Running   0          8h

下面修改策略:

[root@master manifests]# kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavaliable":0}}}}'
deployment.extensions/myapp-deploy patched

strategy:表示策略

maxSurge:表示最多幾個控制器存在

maxUnavaliable:表示最多有幾個控制器不可用

[root@master manifests]# kubectl describe deployment myapp-deploy
RollingUpdateStrategy: 0 max unavailable, 1 max surge

    下面我們用set image命令,將鏡像myapp升級為v3版本,并且將myapp-deploy控制器標(biāo)記為暫停。被pause命令暫停的資源不會被控制器協(xié)調(diào)使用,可以使“kubectl rollout resume”命令恢復(fù)已暫停資源。

[root@master manifests]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 &&
kubectl rollout pause deployment myapp-deploy
[root@master ~]# kubectl get pods -l app=myapp -w

停止暫停:

[root@master ~]# kubectl rollout resume deployment myapp-deploy
deployment.extensions/myapp-deploy resumed

看到繼續(xù)更新了(即刪一個更新一個,刪一個更新一個):

[root@master manifests]# kubectl rollout status deployment myapp-deploy
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment spec update to be observed...
Waiting for deployment spec update to be observed...
Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "myapp-deploy" rollout to finish: 1 old replicas are pending termination...
deployment "myapp-deploy" successfully rolled out
[root@master manifests]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                 SELECTOR
myapp-deploy-69b47bc96d   0         0         0         6h        myapp        ikubernetes/myapp:v1   app=myapp,pod-template-hash=2560367528,release=canary
myapp-deploy-6bdcd6755d   5         5         5         3h        myapp        ikubernetes/myapp:v3   app=myapp,pod-template-hash=2687823118,release=canary
mytomcat-5f8c6fdcb        3         3         3         12h       mytomcat     tomcat                 pod-template-hash=194729876,run=mytomcat

    上面可以看到myapp有v1和v3兩個版本。

[root@master manifests]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

    上面可以看到有兩個歷史更新記錄。

    下面我們把v3回退到上一個版本(不指定就是上一個版本)。

[root@master manifests]# kubectl  rollout undo deployment myapp-deploy --to-revision=1
deployment.extensions/myapp-deploy

    可以看到第一版還原成第3版了:

[root@master manifests]# kubectl rollout history deployment myapp-deploy
deployments "myapp-deploy"
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

    可以看到正在工作的是v1版,即回退到了v1版。

[root@master manifests]# kubectl get rs -o wide
NAME                      DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                 SELECTOR
myapp-deploy-69b47bc96d   5         5         5         6h        myapp        ikubernetes/myapp:v1   app=myapp,pod-template-hash=2560367528,release=canary
myapp-deploy-6bdcd6755d   0         0         0         3h        myapp        ikubernetes/myapp:v3   app=myapp,pod-template-hash=2687823118,release=canary

DaemonSet控制器

    通過 https://hub.docker.com/r/ikubernetes/filebeat/tags/可以看到filebeat的版本有哪些:

docker中pod控制器怎么用

[root@node1 manifests]# docker pull ikubernetes/filebeat:5.6.5-alpine
[root@node2 manifests]# docker pull ikubernetes/filebeat:5.6.5-alpine

    node1和node2上都下載filebeat鏡像。

[root@node1 ~]# docker image inspect ikubernetes/filebeat:5.6.5-alpine
[root@master manifests]# kubectl explain pods.spec.containers.env
[root@master manifests]# cat ds-demo.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myapp-ds
  namespace: default
spec:
  selector: #標(biāo)簽選擇器
    matchLabels: #匹配的標(biāo)簽為
      app: filebeat
      release: stable
  template:
    metadata:
      labels:
        app: filebeat #和上面的myapp要匹配
        release: stable
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        env:
        - name: REDIS_HOST
          value: redis.default.svc.cluster.local #隨便取的名字
          name: REDIS_LOG_LEVEL
          value: info
[root@master manifests]# kubectl apply -f ds-demo.yaml 
daemonset.apps/myapp-ds created

    看到myapp-ds已經(jīng)運(yùn)行起來了,并且是兩個myapp-ds,這是因為我們有兩個Node節(jié)點(diǎn)。另外master節(jié)點(diǎn)上是不會運(yùn)行myapp-ds控制器的,因為master有污點(diǎn)(除非你設(shè)置允許有污點(diǎn),才可以在master上允許myapp-ds)

[root@master manifests]# kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
myapp-ds-5tmdd                  1/1       Running   0          1m
myapp-ds-dkmjj                  1/1       Running   0          1m
[root@master ~]# kubectl logs  myapp-ds-dkmjj
[root@master manifests]# kubectl delete -f ds-demo.yaml
[root@master manifests]# cat 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: #這個是容器的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: #標(biāo)簽選擇器
    matchLabels: #匹配的標(biāo)簽為
      app: filebeat
      release: stable
  template:
    metadata:
      labels:
        app: filebeat #和上面的myapp要匹配
        release: stable
    spec:
      containers:
      - name: filebeat
        image: ikubernetes/filebeat:5.6.6-alpine
        env:
        - name: REDIS_HOST #這是環(huán)境變量名,value是它的值
          value: redis.default.svc.cluster.local #隨便取的名字
        - name: REDIS_LOG_LEVEL
          value: info
[root@master manifests]# kubectl create -f ds-demo.yaml 
deployment.apps/redis created
daemonset.apps/filebeat-ds created
[root@master manifests]# kubectl expose deployment redis --port=6379 ##這是在用expose方式創(chuàng)建service,其實還有一種方式是根據(jù)清單創(chuàng)建service
service/redis exposed
[root@master manifests]# kubectl get svc  #service的簡稱
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
redis        ClusterIP   10.106.138.181   <none>        6379/TCP       48s
[root@master manifests]# kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
filebeat-ds-hgbhr               1/1       Running   0          9h
filebeat-ds-xc7v7               1/1       Running   0          9h
redis-5b5d6fbbbd-khws2          1/1       Running   0          33m
[root@master manifests]# kubectl exec -it redis-5b5d6fbbbd-khws2 -- /bin/sh
/data # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      
tcp        0      0 :::6379                 :::*                    LISTEN   
/data # nslookup redis.default.svc.cluster.local  #看到DNS可以解析出來ip
nslookup: can't resolve '(null)': Name does not resolve
Name:      redis.default.svc.cluster.local
Address 1: 10.106.138.181 redis.default.svc.cluster.local 
/data # redis-cli -h redis.default.svc.cluster.local
redis.default.svc.cluster.local:6379> keys *
(empty list or set)
redis.default.svc.cluster.local:6379>
[root@master manifests]# kubectl exec -it filebeat-ds-pnk8b -- /bin/sh
/ # ps aux
PID   USER     TIME   COMMAND
    1 root       0:00 /usr/local/bin/filebeat -e -c /etc/filebeat/filebeat.yml
   15 root       0:00 /bin/sh
   22 root       0:00 ps aux
  
/ # cat  /etc/filebeat/filebeat.yml
filebeat.registry_file: /var/log/containers/filebeat_registry
filebeat.idle_timeout: 5s
filebeat.spool_size: 2048
logging.level: info
filebeat.prospectors:
- input_type: log
  paths:
    - "/var/log/containers/*.log"
    - "/var/log/docker/containers/*.log"
    - "/var/log/startupscript.log"
    - "/var/log/kubelet.log"
    - "/var/log/kube-proxy.log"
    - "/var/log/kube-apiserver.log"
    - "/var/log/kube-controller-manager.log"
    - "/var/log/kube-scheduler.log"
    - "/var/log/rescheduler.log"
    - "/var/log/glbc.log"
    - "/var/log/cluster-autoscaler.log"
  symlinks: true
  json.message_key: log
  json.keys_under_root: true
  json.add_error_key: true
  multiline.pattern: '^\s'
  multiline.match: after
  document_type: kube-logs
  tail_files: true
  fields_under_root: true
output.redis:
  hosts: ${REDIS_HOST:?No Redis host configured. Use env var REDIS_HOST to set host.}
  key: "filebeat"
  
 
 
/ # printenv
REDIS_HOST=redis.default.svc.cluster.local
/ # nslookup redis.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve
Name:      redis.default.svc.cluster.local
Address 1: 10.106.138.181 redis.default.svc.cluster.local

    daemon-set也支持滾動更新。

[root@master manifests]# kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.5.7-alpine

說明: daemonsets filebeat-ds表示daemonsets名字叫filebeat-ds;

           filebeat=ikubernetes/filebeat:5.5.7-alpine表示filebeat容器=ikubernetes/filebeat:5.5.7-alpine

感謝各位的閱讀!關(guān)于“docker中pod控制器怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI