如何解析k8s中pod控制器的Deployment、DaemonSet、StatefulSet

50次阅读
没有评论

共计 5331 个字符,预计需要花费 14 分钟才能阅读完成。

行业资讯    
服务器    
云计算    
如何解析 k8s 中 pod 控制器的 Deployment、DaemonSet、StatefulSet

本篇文章为大家展示了如何解析 k8s 中 pod 控制器的 Deployment、DaemonSet、StatefulSet,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

pod 控制器分类:
1、ReplicationController
2、ReplicaSet
3、Deployment
4、StatefulSet
5、DaemonSet
6、Job,Cronjob
7、HPA
pod 控制器:一般包括 3 部分
1、标签选择器
2、期望的副本数(DaemonSet 控制器不需要)
3、pod 模板
deploy 控制器构建于 rs 控制器之上,新特性包括:
1、事件和状态查看
2、回滚
3、版本记录
4、暂停和启动
5、支持两种自动更新方案
Recreate 删除重建
RollingUpdate 回滚升级(默认方式)

创建 deploy
$ kubectl run –help
$ kubectl run nginx –image=nginx –port=80 –replicas=2        # 用命令直接创建
$ kubectl run nginx –image=nginx –port=80 –dry-run -o yaml

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
 run: nginx
 name: nginx
spec:
 replicas: 1
 selector:
 matchLabels:
 run: nginx
 template:
 metadata:
 labels:
 run: nginx
 spec:
 containers:
 - image: nginx
 name: nginx
 ports:
 - containerPort: 80

创建 deploy 控制器时会自动创建 rs 控制器,二者具有相同的标签选择器
$ kubectl get deploy
nginx                    1/1     1            1           7s
$ kubectl get rs

修改 pod 副本数的方式
1、kubectl edit deploy nginx
2、kubectl scale deploy nginx –replicas=5
3、修改 yaml 文件

升级 pod 镜像的方法:
1、直接修改 yaml
2、kubectl edit deploy nginx
3、kubectl set image deploy/nginx nginx=nginx:1.9 –record        # 升级并记录,可实现回滚,推荐使用该方法

滚动升级是 deployment pod 升级时的默认策略,也可以修改默认值
用命令 kubectl edit deploy nginx 可以查看默认值

 replicas: 3
 selector:
 matchLabels:
 run: nginx
 minReadySeconds: 5 # 默认看不到,需要手工添加
 strategy:
 rollingUpdate:
 maxSurge: 25%
 maxUnavailable: 25%
 type: RollingUpdate

默认情况下,当 6 个 pod 副本需要升级时:Kubernetes 将终止 1 个实例(625%=1.5 个实例,向下舍去 =1),创建 3 个新实例(625%=1.5 个实例,向上舍入 =2,加 1 个实例来弥补 1 个终止实例 = 3 个实例),此时总共运行 8 个副本。一旦新的 pod 就绪,它将从旧的副本集中终止另外 2 个实例,以便将部署恢复到所需的副本数,然后重复这个过程,直到部署完成为止。
minReadySeconds:Kubernetes 在等待设置的时间后才进行升级
maxSurge:升级过程中最多可以比原先设置多出的 POD 数量
maxUnavaible:升级过程中最多有多少个 POD 处于无法提供服务的状态

滚动升级相关命令
$ kubectl set image deploy/nginx nginx=nginx:1.7.9 –record
$ kubectl set image deploy/nginx nginx=nginx –record
$ kubectl rollout status deploy nginx        # 查看升级状态
$ kubectl rollout pause deployment nginx        # 升级暂停
$ kubectl rollout resume deployment nginx       #恢复升级
$ kubectl describe deploy nginx         #查看升级详情
$ kubectl rollout history deploy/nginx        # 查看升级历史
deployment.extensions/nginx
REVISION  CHANGE-CAUSE
4         kubectl set image deploy/nginx nginx=nginx:1.7.9 –record=true
5         kubectl set image deploy/nginx nginx=nginx –record=true
$ kubectl rollout history deployment nginx –revision=5
$ kubectl rollout undo deployment/nginx –to-revision=4          # 回滚到指定版本
$ kubectl rollout undo deployment nginx-deploy        # 回滚到前一个版本

显式指定滚动升级参数

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
 run: nginx
 name: nginx
spec:
 replicas: 1
 selector:
 matchLabels:
 run: nginx
 minReadySeconds: 5 
 strategy:
 rollingUpdate:
 maxSurge: 1
 maxUnavailable: 1
 type: RollingUpdate
 template:
 metadata:
 labels:
 run: nginx
 spec:
 containers:
 - image: nginx
 name: nginx
 ports:
 - containerPort: 80

DaemonSet 用于在每个 Kubernetes 节点中将守护进程的副本作为后台进程运行,说白了就是在每个节点部署一个 Pod 副本,当节点加入到 Kubernetes 集群中,Pod 会被自动调度到该节点上运行。
每个节点有一个 ds pod,新加入的节点也会自动生成一个 ds pod
ds pod 不受调度策略控制
使用 DaemonSe 场景:
1、集群存储守护程序,如 glusterd、ceph 要部署在每个节点上以提供持久性存储;
2、节点监视守护进程,如 Prometheus 监控集群,可以在每个节点上运行一个 node-exporter 进程来收集监控节点的信息;
3、日志收集守护程序,如 fluentd 或 logstash,在每个节点上运行以收集容器的日志
示例:

kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
 name: nginx-ds
 labels:
 k8s-app: nginx
spec:
 template:
 metadata:
 labels:
 k8s-app: nginx
 spec:
 containers:
 - image: nginx:1.7.9
 name: nginx
 ports:
 - name: http
 containerPort: 80

无状态服务(Stateless Service):所有 pod 只需要共享一个持久存储,并不需要每个 pod 一个持久存储,并且多个实例对于同一个请求响应的结果是完全一致的
有状态服务(Stateful Service):每个 pod 都需要一个独立的持久存储,对于这种类型的资源,我们一般是通过创建一个 Headless Service 类型的服务来暴露服务,将 clusterIP 设置为 None 就是一个无头的服务。
1、有状态服务一般使用 pvc 模板和存储类为每个 pod 自动生成一对 pv 和 pvc 来实现持久化存储。
2、也可以手动创建 pv,然后和利用 StatefulSet 中的 volumeClaimTemplates 自动生成的 pvc 进行配对。

手动创建 pv 用于 StatefulSet
1、创建两个 pv

apiVersion: v1
kind: PersistentVolume
metadata:
 name: pv001 # 第二个是 pv002
 labels:
 release: stable
spec:
 capacity:
 storage: 1Gi
 accessModes:
 - ReadWriteOnce
 persistentVolumeReclaimPolicy: Recycle
 hostPath:
 path: /tmp/data

2、先创建无头服务

apiVersion: v1
kind: Service
metadata:
 name: nginx
spec:
 ports:
 - port: 80
 name: web
 clusterIP: None
 selector:
 app: nginx
 role: stateful

3、创建 StatefulSet pod 使用 pv

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
 name: web
spec:
 serviceName:  nginx  # 使用上面创建的无头服务
 replicas: 2
 template:
 metadata:
 labels:
 app: nginx
 role: stateful
 spec:
 containers:
 - name: nginx
 image: cnych/nginx-slim:0.8
 ports:
 - containerPort: 80
 name: web
 volumeMounts:
 - name: www
 mountPath: /usr/share/nginx/html
 volumeClaimTemplates:
 - metadata:
 name: www
 spec:
 accessModes: [  ReadWriteOnce  ]
 resources:
 requests:
 storage: 1Gi

volumeClaimTemplates 会根据其对应的 pv 自动生成 pvc 并自动配对,数量由 replicas: 2 决定。

使用 pvc 模板和存储类自动生成 pv 和 pvc
1、创建存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: course-nfs-storage
provisioner: fuseim.pri/ifs

2、先创建无头服务

apiVersion: v1
kind: Service
metadata:
 name: nfs-web
spec:
 ports:
 - port: 80
 name: web
 clusterIP: None
 selector:
 app: nginx
 role: stateful

3、使用存储类创建 StatefulSet pod

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
 name: nfs-web
spec:
 serviceName:  nfs-web  # 使用上面创建的无头服务
 replicas: 2
 template:
 metadata:
 labels:
 app: nfs-web
 spec:
 terminationGracePeriodSeconds: 10
 containers:
 - name: nginx
 image: nginx
 ports:
 - containerPort: 80
 name: web
 volumeMounts:
 - name: www
 mountPath: /usr/share/nginx/html
 volumeClaimTemplates:
 - metadata:
 name: www
 annotations:
 volume.beta.kubernetes.io/storage-class: course-nfs-storage
 spec:
 accessModes: [  ReadWriteOnce  ]
 #storageClassName: course-nfs-storage  使用存储类
 resources:
 requests:
 storage: 1Gi

会自动生成两对 pv 和 pvc

上述内容就是如何解析 k8s 中 pod 控制器的 Deployment、DaemonSet、StatefulSet,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计5331字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)