本文收录在容器技术学习系列文章总目录

1、Pod控制器

1.1 介绍

  Pod控制器是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。

1.2 pod控制器有多种类型

  • ReplicationController(RC):RC保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,RC就杀死几个,如果太少了,RC会新建几个
  • ReplicaSet(RS):代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
  • Deployment(重要):工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
  • DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
  • Job:只要完成就立即退出,不需要重启或重建。
  • CronJob:周期性任务控制,不需要持续后台运行
  • StatefulSet:管理有状态应用

本文主要讲解ReplicaSet、Deployment、DaemonSet 三中类型的pod控制器。

2、ReplicaSet

2.1 认识ReplicaSet

(1)什么是ReplicaSet?

  ReplicaSet是下一代复本控制器,是Replication Controller(RC)的升级版本。ReplicaSet和 Replication Controller之间的唯一区别是对选择器的支持。ReplicaSet支持labels user guide中描述的set-based选择器要求, 而Replication Controller仅支持equality-based的选择器要求。

(2)如何使用ReplicaSet

  大多数kubectl 支持Replication Controller 命令的也支持ReplicaSets。rolling-update命令除外,如果要使用rolling-update,请使用Deployments来实现。

  虽然ReplicaSets可以独立使用,但它主要被 Deployments用作pod 机制的创建、删除和更新。当使用Deployment时,你不必担心创建pod的ReplicaSets,因为可以通过Deployment实现管理ReplicaSets。

(3)何时使用ReplicaSet?

  ReplicaSet能确保运行指定数量的pod。然而,Deployment 是一个更高层次的概念,它能管理ReplicaSets,并提供对pod的更新等功能。因此,我们建议你使用Deployment来管理ReplicaSets,除非你需要自定义更新编排。

  这意味着你可能永远不需要操作ReplicaSet对象,而是使用Deployment替代管理 。后续讲解Deployment会详细描述。

2.2 ReplicaSet定义资源清单几个字段

  • apiVersion: app/v1  版本
  • kind: ReplicaSet  类型
  • metadata  元数据
  • spec  期望状态
    • minReadySeconds:应为新创建的pod准备好的最小秒数
    • replicas:副本数; 默认为1
    • selector:标签选择器
    • template:模板(必要的)
      • metadata:模板中的元数据
      • spec:模板中的期望状态
  • status  当前状态

2.3 演示:创建一个简单的ReplicaSet

(1)编写yaml文件,并创建启动

简单创建一个replicaset:启动2个pod

  1. [root@master manifests]# vim rs-damo.yaml
  2. apiVersion: apps/v1
  3. kind: ReplicaSet
  4. metadata:
  5. name: myapp
  6. namespace: default
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: myapp
  12. release: canary
  13. template:
  14. metadata:
  15. name: myapp-pod
  16. labels:
  17. app: myapp
  18. release: canary
  19. environment: qa
  20. spec:
  21. containers:
  22. - name: myapp-container
  23. image: ikubernetes/myapp:v1
  24. ports:
  25. - name: http
  26. containerPort: 80
  27. [root@master manifests]# kubectl create -f rs-damo.yaml
  28. replicaset.apps/myapp created

  

(2)查询验证

  1. ---查询replicaset(rs)信息
  2. [root@master manifests]# kubectl get rs
  3. NAME DESIRED CURRENT READY AGE
  4. myapp 2 2 2 23s
  5. ---查询pod信息
  6. [root@master manifests]# kubectl get pods
  7. NAME READY STATUS RESTARTS AGE
  8. myapp-r4ss4 1/1 Running 0 25s
  9. myapp-zjc5l 1/1 Running 0 26s
  10. ---查询pod详细信息;模板中的label都生效了
  11. [root@master manifests]# kubectl describe pod myapp-r4ss4
  12. Name: myapp-r4ss4
  13. Namespace: default
  14. Priority: 0
  15. PriorityClassName: <none>
  16. Node: node2/192.168.130.105
  17. Start Time: Thu, 06 Sep 2018 14:57:23 +0800
  18. Labels: app=myapp
  19. environment=qa
  20. release=canary
  21. ... ...
  22. ---验证服务
  23. [root@master manifests]# curl 10.244.2.13
  24. Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

  

(3)生成pod原则:“多退少补”

① 删除pod,会立即重新构建,生成新的pod

  1. [root@master manifests]# kubectl delete pods myapp-zjc5l
  2. pod "myapp-k4j6h" deleted
  3. [root@master ~]# kubectl get pods
  4. NAME READY STATUS RESTARTS AGE
  5. myapp-r4ss4 1/1 Running 0 33s
  6. myapp-mdjvh 1/1 Running 0 10s

② 若另一个pod,不小心符合了rs的标签选择器,就会随机干掉一个此标签的pod

  1. ---随便启动一个pod
  2. [root@master manifests]# kubectl get pods --show-labels
  3. NAME READY STATUS RESTARTS AGE LABELS
  4. myapp-hxgbh 1/1 Running 0 7m app=myapp,environment=qa,release=canary
  5. myapp-mdjvh 1/1 Running 0 6m app=myapp,environment=qa,release=canary
  6. pod-test 1/1 Running 0 13s app=myapp,tier=frontend
  7. ---将pod-test打上release=canary标签
  8. [root@master manifests]# kubectl label pods pod-test release=canary
  9. pod/pod-test labeled
  10. ---随机停掉一个pod
  11. [root@master manifests]# kubectl get pods --show-labels
  12. NAME READY STATUS RESTARTS AGE LABELS
  13. myapp-hxgbh 1/1 Running 0 8m app=myapp,environment=qa,release=canary
  14. myapp-mdjvh 1/1 Running 0 7m app=myapp,environment=qa,release=canary
  15. pod-test 0/1 Terminating 0 1m app=myapp,release=canary,tier=frontend

  

2.4 ReplicaSet动态扩容/缩容

(1)使用edit 修改rs 配置,将副本数改为5;即可实现动态扩容

  1. [root@master manifests]# kubectl edit rs myapp
  2. ... ...
  3. spec:
  4. replicas: 5
  5. ... ...
  6. replicaset.extensions/myapp edited

(2)验证

  1. [root@master manifests]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. client 0/1 Error 0 1d
  4. myapp-bck7l 1/1 Running 0 16s
  5. myapp-h8cqr 1/1 Running 0 16s
  6. myapp-hfb72 1/1 Running 0 6m
  7. myapp-r4ss4 1/1 Running 0 9m
  8. myapp-vvpgf 1/1 Running 0 16s

  

2.5 ReplicaSet在线升级版本

(1)使用edit 修改rs 配置,将容器的镜像改为v2版;即可实现在线升级版本

  1. [root@master manifests]# kubectl edit rs myapp
  2. ... ...
  3. spec:
  4. containers:
  5. - image: ikubernetes/myapp:v2
  6. ... ...
  7. replicaset.extensions/myapp edited

  

(2)查询rs,已经完成修改

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

  

(3)但是,修改完并没有升级

需删除pod,再自动生成新的pod时,就会升级成功;

即可以实现灰度发布:删除一个,会自动启动一个版本升级成功的pod

  1. ---访问没有删除pod的服务,显示是V1
  2. [root@master manifests]# curl 10.244.2.15
  3. Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
  4. ---删除一个pod,访问新生成pod的服务,版本升级为v2
  5. [root@master manifests]# kubectl delete pod myapp-bck7l
  6. pod "myapp-bck7l" deleted
  7. [root@master ~]# kubectl get pods -o wide
  8. NAME READY STATUS RESTARTS AGE IP NODE
  9. myapp-hxgbh 1/1 Running 0 20m 10.244.1.17 node1
  10. [root@master manifests]# curl 10.244.1.17
  11. Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

  

3、Deployment

3.1 Deployment简述

(1)介绍

  Deployment 为 Pod和Replica Set 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用

  你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

  注意:您不该手动管理由 Deployment 创建的 Replica Set,否则您就篡越了 Deployment controller 的职责!

(2)典型的应用场景包括

  • 使用Deployment来创建ReplicaSetReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
  • 然后,通过更新Deployment 的 PodTemplateSpec 字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
  • 滚动升级和回滚应用:如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
  • 扩容和缩容:扩容Deployment以满足更高的负载。
  • 暂停和继续Deployment:暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
  • 根据Deployment 的状态判断上线是否hang住了
  • 清除旧的不必要的 ReplicaSet。

3.2 Deployment定义资源清单几个字段

  • apiVersion: app/v1  版本
  • kind: Deployment  类型
  • metadata  元数据
  • spec  期望状态
    • --------------replicaset 也有的选项---------------
    • minReadySeconds:应为新创建的pod准备好的最小秒数
    • replicas:副本数; 默认为1
    • selector:标签选择器
    • template:模板(必须的)
      • metadata:模板中的元数据
      • spec:模板中的期望状态
    • --------------deployment 独有的选项---------------
    • strategy:更新策略;用于将现有pod替换为新pod的部署策略
      • Recreate:重新创建
      • RollingUpdate:滚动更新
        • maxSurge:可以在所需数量的pod之上安排的最大pod数;例如:5、10%
        • maxUnavailable:更新期间可用的最大pod数;
    • revisionHistoryLimit:要保留以允许回滚的旧ReplicaSet的数量,默认10
    • paused:表示部署已暂停,部署控制器不处理部署
    • progressDeadlineSeconds:在执行此操作之前部署的最长时间被认为是失败的
  • status  当前状态

3.3 演示:创建一个简单的Deployment

(1)创建一个简单的ReplicaSet,启动2个pod

  1. [root@master manifests]# vim deploy-damo.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: myapp-deploy
  6. namespace: default
  7. spec:
  8. replicas: 2
  9. selector:
  10. matchLabels:
  11. app: myapp
  12. release: canary
  13. template:
  14. metadata:
  15. labels:
  16. app: myapp
  17. release: canary
  18. spec:
  19. containers:
  20. - name: myapp
  21. image: ikubernetes/myapp:v1
  22. ports:
  23. - name: http
  24. containerPort: 80
  25. [root@master manifests]# kubectl apply -f deploy-damo.yaml
  26. deployment.apps/myapp-deploy configured

注:apply 声明式创建启动;和create差不多;但是可以对一个文件重复操作;create不可以。

(2)查询验证

  1. ---查询deployment信息
  2. [root@master manifests]# kubectl get deploy
  3. NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
  4. myapp-deploy 2 2 2 2 14s
  5. ---查询replicaset信息;deployment会先生成replicaset
  6. [root@master manifests]# kubectl get rs
  7. NAME DESIRED CURRENT READY AGE
  8. myapp-deploy-69b47bc96d 2 2 2 28s
  9. ---查询pod信息;replicaset会再创建pod
  10. [root@master manifests]# kubectl get pods
  11. NAME READY STATUS RESTARTS AGE
  12. myapp-deploy-69b47bc96d-bm8zc 1/1 Running 0 18s
  13. myapp-deploy-69b47bc96d-pjr5v 1/1 Running 0 18s

  

3.4 Deployment动态扩容/缩容

有2中方法实现

(1)方法1:直接修改yaml文件,将副本数改为3

  1. [root@master manifests]# vim deploy-damo.yaml
  2. ... ...
  3. spec:
  4. replicas: 3
  5. ... ...
  6. [root@master manifests]# kubectl apply -f deploy-damo.yaml
  7. deployment.apps/myapp-deploy configured

查询验证成功:有3个pod

  1. [root@master manifests]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. myapp-deploy-69b47bc96d-bcdnq 1/1 Running 0 25s
  4. myapp-deploy-69b47bc96d-bm8zc 1/1 Running 0 2m
  5. myapp-deploy-69b47bc96d-pjr5v 1/1 Running 0 2m

  

(2)通过patch命令打补丁命令扩容

与方法1的区别:不需修改yaml文件;平常测试时使用方便;

但列表格式复杂,极容易出错

  1. [root@master manifests]# kubectl patch deployment myapp-deploy -p '{"spec":{"replicas":5}}'
  2. deployment.extensions/myapp-deploy patched

查询验证成功:有5个pod

  1. [root@master ~]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. myapp-deploy-67f6f6b4dc-2756p 1/1 Running 0 26s
  4. myapp-deploy-67f6f6b4dc-2lkwr 1/1 Running 0 26s
  5. myapp-deploy-67f6f6b4dc-knttd 1/1 Running 0 21m
  6. myapp-deploy-67f6f6b4dc-ms7t2 1/1 Running 0 21m
  7. myapp-deploy-67f6f6b4dc-vl2th 1/1 Running 0 21m

  

3.5 Deployment在线升级版本

(1)直接修改deploy-damo.yaml

  1. [root@master manifests]# vim deploy-damo.yaml
  2. ... ...
  3. spec:
  4. containers:
  5. - name: myapp
  6. image: ikubernetes/myapp:v2
  7. ... ...

  

(2)可以动态监控版本升级

  1. [root@master ~]# kubectl get pods -w

发现是滚动升级,先停一个,再开启一个新的(升级);再依次听一个...

(3)验证:访问服务,版本升级成功

  1. [root@master ~]# kubectl get pods -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. myapp-deploy-67f6f6b4dc-6lv66 1/1 Running 0 2m 10.244.1.75 node1
  4. [root@master ~]# curl 10.244.1.75
  5. Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

  

3.6 Deployment修改版本更新策略

(1)方法1:修改yaml文件

  1. [root@master manifests]# vim deploy-damo.yaml
  2. ... ...
  3. strategy:
  4. rollingUpdate:
  5. maxSurge: 1 #每次更新一个pod
  6. maxUnavailable: 0 #最大不可用pod为0
  7. ... ...

  

(2)打补丁:修改更新策略

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

  

(3)验证:查询详细信息

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

  

(4)升级到v3版

① 金丝雀发布:先更新一个pod,然后立即暂停,等版本运行没问题了,再继续发布

  1. [root@master manifests]# kubectl set image deployment myapp-deploy myapp=ikubernetes/myapp:v3 && kubectl rollout pause deployment myapp-deploy
  2. deployment.extensions/myapp-deploy image updated #一个pod更新成功
  3. deployment.extensions/myapp-deploy paused #暂停更新

② 等版本运行没问题了,解除暂停,继续发布更新

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

③ 中间可以一直监控过程

  1. [root@master ~]# kubectl rollout status deployment myapp-deploy #输出版本更新信息
  2. Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
  3. Waiting for deployment spec update to be observed...
  4. Waiting for deployment spec update to be observed...
  5. Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
  6. Waiting for deployment "myapp-deploy" rollout to finish: 1 out of 5 new replicas have been updated...
  7. Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 5 new replicas have been updated...
  8. Waiting for deployment "myapp-deploy" rollout to finish: 2 out of 5 new replicas have been updated...
  9. ---也可以使用get查询pod 更新过程
  10. [root@master ~]# kubectl get pods -w

④ 验证:随便访问一个pod的服务,版本升级成功

  1. [root@master ~]# kubectl get pods -o wide
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. myapp-deploy-6bdcd6755d-2bnsl 1/1 Running 0 1m 10.244.1.77 node1
  4. [root@master ~]# curl 10.244.1.77
  5. Hello MyApp | Version: v3 | <a href="hostname.html">Pod Name</a>

  

3.7 Deployment版本回滚

(1)命令

查询版本变更历史

  1. $ kubectl rollout history deployment deployment_name

undo回滚版本;--to-revision=  回滚到第几版本

  1. $ kubectl rollout undo deployment deployment_name --to-revision=N

(2)演示

  1. ---查询版本变更历史
  2. [root@master manifests]# kubectl rollout history deployment myapp-deploy
  3. deployments "myapp-deploy"
  4. REVISION CHANGE-CAUSE
  5. 1 <none>
  6. 2 <none>
  7. 3 <none>
  8. ---回滚到第1版本
  9. [root@master manifests]# kubectl rollout undo deployment myapp-deploy --to-revision=1
  10. deployment.extensions/myapp-deploy
  11. [root@master manifests]# kubectl rollout history deployment myapp-deploy
  12. deployments "myapp-deploy"
  13. REVISION CHANGE-CAUSE
  14. 2 <none>
  15. 3 <none>
  16. 4 <none>

  

(3)查询验证,已经回到v1版了

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

  

4、DaemonSet

4.1 DaemonSet简述

(1)介绍

  DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用

(2)典型的应用包括

  • 日志收集,比如fluentd,logstash等
  • 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
  • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

4.2 DaemonSet定义资源清单几个字段

  • apiVersion: app/v1  版本
  • kind: DaemonSet  类型
  • metadata  元数据
  • spec  期望状态
    • --------------replicaset 也有的选项---------------
    • minReadySeconds:应为新创建的pod准备好的最小秒数
    • selector:标签选择器
    • template:模板(必须的)
      • metadata:模板中的元数据
      • spec:模板中的期望状态
    • --------------daemonset 独有的选项---------------
    • revisionHistoryLimit:要保留以允许回滚的旧ReplicaSet的数量,默认10
    • updateStrategy:用新pod替换现有DaemonSet pod的更新策略
  • status  当前状态

4.3 演示:创建一个简单的DaemonSet

(1)创建并创建一个简单的DaemonSet,启动pod,只后台运行filebeat手机日志服务

  1. [root@master manifests]# vim ds-demo.yaml
  2. apiVersion: apps/v1
  3. kind: DaemonSet
  4. metadata:
  5. name: filebeat-ds
  6. namespace: default
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: filebeat
  11. release: stable
  12. template:
  13. metadata:
  14. labels:
  15. app: filebeat
  16. release: stable
  17. spec:
  18. containers:
  19. - name: filebeat
  20. image: ikubernetes/filebeat:5.6.5-alpine
  21. env:
  22. - name: REDIS_HOST
  23. value: redis.default.svc.cluster.local
  24. - name: REDIS_LOG_LEVEL
  25. value: info
  26. [root@master manifests]# kubectl apply -f ds-demo.yaml
  27. daemonset.apps/myapp-ds created

  

(2)查询验证

  1. [root@master ~]# kubectl get ds
  2. NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
  3. filebeat-ds 2 2 2 2 2 <none> 6m
  4. [root@master ~]# kubectl get pods
  5. NAME READY STATUS RESTARTS AGE
  6. filebeat-ds-r25hh 1/1 Running 0 4m
  7. filebeat-ds-vvntb 1/1 Running 0 4m
  8. [root@master ~]# kubectl exec -it filebeat-ds-r25hh -- /bin/sh
  9. / # ps aux
  10. PID USER TIME COMMAND
  11. 1 root 0:00 /usr/local/bin/filebeat -e -c /etc/filebeat/filebeat.yml

  

4.4 DaemonSet动态版本升级

(1)使用kubectl set image 命令更新pod的镜像;实现版本升级

  1. [root@master ~]# kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.6.6-alpine
  2. daemonset.extensions/filebeat-ds image updated

(2)验证,升级成功

  1. [root@master ~]# kubectl get ds -o wide
  2. NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
  3. filebeat-ds 2 2 2 2 2 <none> 7m filebeat ikubernetes/filebeat:5.6.6-alpine app=filebeat,release=stable

5、StatefulSet

5.1 认识statefulset

(1)statefulset介绍

  StatefulSet是为了解决有状态服务的问题(对应Deployments和ReplicaSets是为无状态服务而设计),其应用场景包括

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

(2)三个必要组件

从上面的应用场景可以发现,StatefulSet由以下几个部分组成:

  • 用于定义网络标志(DNS domain)的 Headless Service(无头服务)
  • 定义具体应用的StatefulSet控制器
  • 用于创建PersistentVolumes 的 volumeClaimTemplates存储卷模板

5.2 通过statefulset创建pod

5.2.1 创建准备pv

详情请查询PV和PVC详解,创建5个pv,需要有nfs服务器

  1. [root@master volume]# vim pv-demo.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5. name: pv001
  6. labels:
  7. name: pv001
  8. spec:
  9. nfs:
  10. path: /data/volumes/v1
  11. server: nfs
  12. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  13. capacity:
  14. storage: 5Gi
  15. ---
  16. apiVersion: v1
  17. kind: PersistentVolume
  18. metadata:
  19. name: pv002
  20. labels:
  21. name: pv002
  22. spec:
  23. nfs:
  24. path: /data/volumes/v2
  25. server: nfs
  26. accessModes: ["ReadWriteOnce"]
  27. capacity:
  28. storage: 5Gi
  29. ---
  30. apiVersion: v1
  31. kind: PersistentVolume
  32. metadata:
  33. name: pv003
  34. labels:
  35. name: pv003
  36. spec:
  37. nfs:
  38. path: /data/volumes/v3
  39. server: nfs
  40. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  41. capacity:
  42. storage: 5Gi
  43. ---
  44. apiVersion: v1
  45. kind: PersistentVolume
  46. metadata:
  47. name: pv004
  48. labels:
  49. name: pv004
  50. spec:
  51. nfs:
  52. path: /data/volumes/v4
  53. server: nfs
  54. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  55. capacity:
  56. storage: 10Gi
  57. ---
  58. apiVersion: v1
  59. kind: PersistentVolume
  60. metadata:
  61. name: pv005
  62. labels:
  63. name: pv005
  64. spec:
  65. nfs:
  66. path: /data/volumes/v5
  67. server: nfs
  68. accessModes: ["ReadWriteMany","ReadWriteOnce"]
  69. capacity:
  70. storage: 15Gi
  71. [root@master volume]# kubectl get pv
  72. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  73. pv001 5Gi RWO,RWX Retain Available 3s
  74. pv002 5Gi RWO Retain Available 3s
  75. pv003 5Gi RWO,RWX Retain Available 3s
  76. pv004 10Gi RWO,RWX Retain Available 3s
  77. pv005 15Gi RWO,RWX Retain Available 3s

  

5.2.2 编写使用statefulset创建pod的资源清单,并创建

  1. [root@master pod_controller]# vim statefulset-demo.yaml
  2. #Headless Service
  3. apiVersion: v1
  4. kind: Service
  5. metadata:
  6. name: myapp
  7. labels:
  8. app: myapp
  9. spec:
  10. ports:
  11. - port: 80
  12. name: web
  13. clusterIP: None
  14. selector:
  15. app: myapp-pod
  16. ---
  17. #statefuleset
  18. apiVersion: apps/v1
  19. kind: StatefulSet
  20. metadata:
  21. name: myapp
  22. spec:
  23. serviceName: myapp
  24. replicas: 3
  25. selector:
  26. matchLabels:
  27. app: myapp-pod
  28. template:
  29. metadata:
  30. labels:
  31. app: myapp-pod
  32. spec:
  33. containers:
  34. - name: myapp
  35. image: ikubernetes/myapp:v1
  36. ports:
  37. - containerPort: 80
  38. name: web
  39. volumeMounts:
  40. - name: myappdata
  41. mountPath: /usr/share/nginx/html
  42. #volumeClaimTemplates
  43. volumeClaimTemplates:
  44. - metadata:
  45. name: myappdata
  46. spec:
  47. accessModes: [ "ReadWriteOnce" ]
  48. resources:
  49. requests:
  50. storage: 5Gi
  51. [root@master pod_controller]# kubectl apply -f statefulset-demo.yaml
  52. service/myapp created
  53. statefulset.apps/myapp created

  

5.2.3 查询并验证pod

  1. ---无头服务的service创建成功
  2. [root@master pod_controller]# kubectl get svc
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 173d
  5. myapp ClusterIP None <none> 80/TCP 3s
  6. ---statefulset创建成功
  7. [root@master pod_controller]# kubectl get sts
  8. NAME DESIRED CURRENT AGE
  9. myapp 3 3 6s
  10. ---查看pvc,已经成功绑定时候的pv
  11. [root@master pod_controller]# kubectl get pvc
  12. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  13. myappdata-myapp-0 Bound pv002 5Gi RWO 9s
  14. myappdata-myapp-1 Bound pv001 5Gi RWO,RWX 8s
  15. myappdata-myapp-2 Bound pv003 5Gi RWO,RWX 6s
  16. ---查看pv,有3个已经被绑定
  17. [root@master pod_controller]# kubectl get pv
  18. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  19. pv001 5Gi RWO,RWX Retain Bound default/myappdata-myapp-1 21s
  20. pv002 5Gi RWO Retain Bound default/myappdata-myapp-0 21s
  21. pv003 5Gi RWO,RWX Retain Bound default/myappdata-myapp-2 21s
  22. pv004 10Gi RWO,RWX Retain Available 21s
  23. pv005 15Gi RWO,RWX Retain Available 21s
  24. ---启动了3pod
  25. [root@master pod_controller]# kubectl get pods -o wide
  26. NAME READY STATUS RESTARTS AGE IP NODE
  27. myapp-0 1/1 Running 0 16s 10.244.1.127 node1
  28. myapp-1 1/1 Running 0 15s 10.244.2.124 node2
  29. myapp-2 1/1 Running 0 13s 10.244.1.128 node1

  

5.3 statefulset动态扩容和缩容

可以使用scale命令 patch打补丁两种方法实现。

5.3.1 扩容

由原本的3个pod扩容到5个

  1. ---①使用scale命令实现
  2. [root@master ~]# kubectl scale sts myapp --replicas=5
  3. statefulset.apps/myapp scaled
  4. ---②或者通过打补丁来实现
  5. [root@master ~]# kubectl patch sts myapp -p '{"spec":{"replicas":5}}'
  6. statefulset.apps/myapp patched
  7. [root@master pod_controller]# kubectl get pods
  8. NAME READY STATUS RESTARTS AGE
  9. myapp-0 1/1 Running 0 11m
  10. myapp-1 1/1 Running 0 11m
  11. myapp-2 1/1 Running 0 11m
  12. myapp-3 1/1 Running 0 9s
  13. myapp-4 1/1 Running 0 7s
  14. [root@master pod_controller]# kubectl get pvc
  15. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  16. myappdata-myapp-0 Bound pv002 5Gi RWO 11m
  17. myappdata-myapp-1 Bound pv001 5Gi RWO,RWX 11m
  18. myappdata-myapp-2 Bound pv003 5Gi RWO,RWX 11m
  19. myappdata-myapp-3 Bound pv004 10Gi RWO,RWX 13s
  20. myappdata-myapp-4 Bound pv005 15Gi RWO,RWX 11s
  21. [root@master pod_controller]# kubectl get pv
  22. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
  23. pv001 5Gi RWO,RWX Retain Bound default/myappdata-myapp-1 17m
  24. pv002 5Gi RWO Retain Bound default/myappdata-myapp-0 17m
  25. pv003 5Gi RWO,RWX Retain Bound default/myappdata-myapp-2 17m
  26. pv004 10Gi RWO,RWX Retain Bound default/myappdata-myapp-3 17m
  27. pv005 15Gi RWO,RWX Retain Bound default/myappdata-myapp-4 17m

  

5.3.2 缩容

由5个pod扩容到2个

  1. ---①使用scale命令
  2. [root@master ~]# kubectl scale sts myapp --replicas=2
  3. statefulset.apps/myapp scaled
  4. ---②通过打补丁的方法进行缩容
  5. [root@master ~]# kubectl patch sts myapp -p '{"spec":{"replicas":2}}'
  6. statefulset.apps/myapp patched
  7. [root@master pod_controller]# kubectl get pods
  8. NAME READY STATUS RESTARTS AGE
  9. myapp-0 1/1 Running 0 15m
  10. myapp-1 1/1 Running 0 15m
  11. ---但是pvpvc不会被删除,从而实现持久化存储
  12. [root@master pod_controller]# kubectl get pvc
  13. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
  14. myappdata-myapp-0 Bound pv002 5Gi RWO 15m
  15. myappdata-myapp-1 Bound pv001 5Gi RWO,RWX 15m
  16. myappdata-myapp-2 Bound pv003 5Gi RWO,RWX 15m
  17. myappdata-myapp-3 Bound pv004 10Gi RWO,RWX 4m
  18. myappdata-myapp-4 Bound pv005 15Gi RWO,RWX 4m

  

5.4 版本升级

5.4.1 升级配置介绍:rollingUpdate.partition 分区更新

  1. [root@master ~]# kubectl explain sts.spec.updateStrategy.rollingUpdate.partition
  2. KIND: StatefulSet
  3. VERSION: apps/v1
  4. FIELD: partition <integer>
  5. DESCRIPTION:
  6. Partition indicates the ordinal at which the StatefulSet should be
  7. partitioned. Default value is 0.

解释:partition分区指定为n,升级>n的分区;n指第几个容器;默认是0

可以修改yaml资源清单来进行升级;也可通过打补丁的方法升级。

5.4.2 进行“金丝雀”升级

(1)先升级一个pod

先将pod恢复到5个

① 打补丁,将partition的指设为4,就只升级第4个之后的pod;只升级第5个pod,若新版本有问题,立即回滚;若没问题,就全面升级

  1. [root@master ~]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":4}}}}'
  2. statefulset.apps/myapp patched
  3. ---查询认证
  4. [root@master ~]# kubectl describe sts myapp
  5. Name: myapp
  6. Namespace: default
  7. ... ...
  8. Replicas: 5 desired | 5 total
  9. Update Strategy: RollingUpdate
  10. Partition: 4
  11. ... ...

  

② 升级

  1. [root@master ~]# kubectl set image sts/myapp myapp=ikubernetes/myapp:v2
  2. statefulset.apps/myapp image updated
  3. ---已将pod镜像换位v2
  4. [root@master ~]# kubectl get sts -o wide
  5. NAME DESIRED CURRENT AGE CONTAINERS IMAGES
  6. myapp 5 5 21h myapp ikubernetes/myapp:v2

  

③ 验证

  1. 查看第5pod,已经完成升级
  2. [root@master ~]# kubectl get pods myapp-4 -o yaml |grep image
  3. - image: ikubernetes/myapp:v2
  4. 查看前4pod,都还是v1版本
  5. [root@master ~]# kubectl get pods myapp-3 -o yaml |grep image
  6. - image: ikubernetes/myapp:v1
  7. [root@master ~]# kubectl get pods myapp-0 -o yaml |grep image
  8. - image: ikubernetes/myapp:v1

  

(2)全面升级剩下的pod

  1. ---只需将partition的指设为0即可
  2. [root@master ~]# kubectl patch sts myapp -p '{"spec":{"updateStrategy":{"rollingUpdate":{"partition":0}}}}'
  3. statefulset.apps/myapp patched
  4. ---验证,所有pod已经完成升级
  5. [root@master ~]# kubectl get pods myapp-0 -o yaml |grep image
  6. - image: ikubernetes/myapp:v2

kubernetes系列07—Pod控制器详解的更多相关文章

  1. kubernetes系列09—Ingress控制器详解

    本文收录在容器技术学习系列文章总目录 1.认识Ingress 1.1 什么是Ingress? 通常情况下,service和pod仅可在集群内部网络中通过IP地址访问.所有到达边界路由器的流量或被丢弃或 ...

  2. kubernetes系列10—存储卷详解

    本文收录在容器技术学习系列文章总目录 1.认识存储卷 1.1 背景 默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubel ...

  3. kubernetes系列08—service资源详解

    本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...

  4. Kubernetes Pod 驱逐详解

    原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...

  5. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  6. Kubernetes 学习8 Pod控制器

    一.回顾 1.Pod是标准的kubernetes资源,因此其遵循为其资源清单配置定义的基本格式,包含:apiVersion,kind,metadata,spec,status(只读) 2.spec的内 ...

  7. Kubernetes YAML 文件全字段详解

    Kubernetes YAML 文件全字段详解 Deployment yaml 其中主要参数都在podTemplate 中,DaemonSet StatefulSet 中的pod部分一样. apiVe ...

  8. Kubernetes K8S之存储ConfigMap详解

    K8S之存储ConfigMap概述与说明,并详解常用ConfigMap示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS ...

  9. Kubernetes K8S之存储Volume详解

    K8S之存储Volume概述与说明,并详解常用Volume示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

随机推荐

  1. Hive管理表,外部表及外部分区表的深入探讨

    Hive管理表,也叫内部表.Hive控制着管理表的整个生命周期,默认情况下Hive管理表的数据存放在hive的主目录:/user/hive/warehouse/下,并且当我们删除一张表时,这张表的数据 ...

  2. 关于部署php遇到的坑

    业务突然要启动一个久不使用的PHP项目, 发现部署到centos7上后 各种报错 就是不行. 我怀疑是apache或者php问题 就重新安装 编译安装也试过就是不行. 只能按笨办法 在测试环境安装了a ...

  3. 使用Ant Design的select组件时placeholder不生效/不起作用的解决办法

    先来说说使用Ant Design和Element-ui的感觉吧. 公司的项目开发中用的是vue+element-ui,使用了一通下来后,觉得element-ui虽然也有一些问题或坑,但这些小问题或坑凭 ...

  4. Vue-router重修01

    ---恢复内容开始--- 1.在vue中获取dom vue中不建议您亲自进行dom操作 vue实例内置ref属性存储或获取相应的dom元素 <div ref="dv"> ...

  5. Java_Object

    说一下java中的Object类. 1.Object: Object是java类库中的一个特殊类,也是所有类的父类. Object类定义了一些有用的方法,由于是根类,这些方法在其他类中都存在,一般是进 ...

  6. $.each()和$().each(),以及forEach()的用法

    1.forEach() 是JS遍历数组的方法 var arr=[1,2,3]; arr.forEach(function(val,index,arr){ // var 为数组中当前的值 // inde ...

  7. swust oj 1013

    哈希表(开放定址法处理冲突) 1000(ms) 10000(kb) 2698 / 6177 采用除留余数法(H(key)=key %n)建立长度为n的哈希表,处理冲突用开放定址法的线性探测. 输入 第 ...

  8. 操作XML

    别人已经写过很好的XML辅助类,可以直接引用后使用: 我这里自己写一个xml的操作类,目前能实现的是对一个不含集合的类可以操作,含集合的类无法将集合里的数据读取出来, 首先定义一个XML特性,用于区分 ...

  9. 微信小程序开发-窗体设置

    "window": { "backgroundTextStyle": "light", "navigationBarBackgro ...

  10. sqlserver 电脑重启以后服务突然无法启动 报错

    可能是sql server 评估期已过  在升级中输入产品密钥试试