k8s之pod控制器


1.生產中,很少會跑一個自主式pod,一般由控制器去創建pod,其配置文件中內嵌了pod的創建方式.

pod控制器:ReplicaSet、Deployment、DaemonSet、Job、Cronjob、StatefulSet

ReplicaSet:代用戶創建指定數量的pod副本數量,確保pod副本數量符合預期狀態,並且支持滾動式自動擴容和縮容功能.

ReplicaSet主要由三個組件組成:

a.用戶期望的pod副本數量;
b.標簽選擇器,判斷哪個pod歸自己管理;
c.pod資源模板,當現存的pod數量不足,會根據pod資源模板進行新建.

幫助用戶管理無狀態的pod資源,精確反應用戶定義的目標數量,但RelicaSet不是直接使用的控制器,而是使用Deployment;

Deployment:工作在ReplicaSet之上,用於管理無狀態應用,目前來說最好的控制器.支持滾動更新和回滾功能,還提供聲明式配置;

DaemonSet:用於確保集群中的每一個節點只運行特定的pod副本,通常用於實現系統級后台任務,比如ELK中負責收集日志filebeat,特性:服務是無狀態的,服務必須是守護進程;

Job:只要完成就立即退出,不需要重啟或重建;

Cronjob:周期性任務控制,不需要持續后台運行;

StatefulSet:管理有狀態應用.

2.ReplicaSet(rs)示例

cat rs-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-myapp
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      run: myapp
      release: canary
  template:
    metadata:
      name: whatever
      labels:
        run: myapp
        release: canary
        env: test
    spec:
      containers:
      - name: nginx-web
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
template:資源模板中定義的name其實不生效,pod運行起來之后,真正的名字是控制器名+隨機字符串
kubectl create -f rs-demo.yaml
kubectl get pods -o wide
NAME             READY   STATUS      RESTARTS   AGE     IP           NODE     
rs-myapp-2hxc9   1/1     Running     0          74s     10.244.2.7   k8s-node2
rs-myapp-d6845   1/1     Running     0          74s     10.244.1.9   k8s-node1
curl 10.244.2.7
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
# 編輯replicatset的配置文件,這個文件不是我們手工創建的,而是apiserver維護的,修改副本數
kubectl edit rs myapp
# 也可以升級版本,將v1改成v2,但只有pod重建后,比如增加或刪除Pod,才會更新成v2版本

3.Deployment控制器

圖解:通過Deployment控制器來動態更新pod版本,Deployment下有眾多replicatset,但只有一個是激活的,更改配置文件中的鏡像版本,就會一個一個的刪除replicatset v1版本中的Pod,自動新創建的pod就會變成v2版本,當pod全部變成v2版本后,replicatset v1不會被刪除,這樣一旦發現v2版本有問題,還可以回退到v1版本,通常deployment默認保留10個版本的replicatset.

kubectl explain deploy  # 文檔是落后於k8s版本的
deploy示例:
cat deploy-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      labels:
        app: myapp
        release: canary
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
# apply:聲明式更新和創建,可以應用多次,create只能用一次
kubectl apply -f deploy-demo.yaml
kubectl get deploy  # 會看見一個名為myapp-deploy的deploy生成
kubectl get rs
NAME                      DESIRED   CURRENT   READY     AGE
myapp-deploy-574965d786   2         2         2         93s
kubectl get pods
NAME                            READY     STATUS    RESTARTS   AGE
myapp-deploy-574965d786-5x42g   1/1       Running   0          70s
myapp-deploy-574965d786-dqzpd   1/1       Running   0          70s

# 默認滾動策略是RollingUpdate,查看滾動更新的歷史
kubectl rollout history deployment myapp-deploy

# 如果要修改副本數,則編輯deploy-demo.yaml修改副本數,或者:
kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
# 給更新策略打補丁:
kubectl patch deployment myapp-deploy -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'
# maxSurge:pod的數量最多可超出期望值多少個;maxUnavailable:最多不可用的pod有多少個.

# 金絲雀發布,先發布一個,此時多了一個pod,現在有6個
# 用set image命令將鏡像myapp升級為v3版本,並且將myapp-deploy控制器標記為暫停,
# 被暫停的資源不會被控制器使用,可以使"kubectl rollout resume"命令恢復已暫停資源
kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 
&& kubectl rollout pause deployment myapp-deploy 
kubectl get pods -l app=myapp -w
# resume:繼續,重新開始,可以看到繼續更新,刪一個更新一個
kubectl rollout status deployment myapp-deploy 
kubectl rollout resume deployment myapp-deploy
# 查看副本集的詳細信息
kubectl get rs -o wide
# 版本回滾
kubectl rollout history deployment myapp-deploy
kubectl rollout undo deployment myapp-deploy --to-revision=1

4.DaemonSet示例

# node1、node2下載filebeat鏡像
docker pull ikubernetes/filebeat:5.6.5-alpine
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:
      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

# REDIS_HOST這個鍵值對是filebeat-ds向filebeat配置文件傳的環境變量
kubectl apply -f ds-demo.yaml
# 暴露redis端口
kubectl expose deployment redis --port=6379
# 進入redis
kubectl exec -it redis-664bbc646b-sg6wk -- /bin/sh
/data # redis-cli -h redis.default.svc.cluster.local
# 進入filebeat
kubectl exec -it filebeat-ds-bszfz -- /bin/sh
nslookup redis.default.svc.cluster.local
# daemon-set也支持滾動更新
kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.5.7-alpine
kubectl explain pods.spec # 有一個字段hostNetwork,可以讓容器直接共享宿主機的網絡
注:不同pod之間通信,filebeat向redis發送日志靠的是service

 

參考博客:http://blog.itpub.net/28916011/viewspace-2214692/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM