K8S中五种控制器的介绍以及使用

阅读: 评论:0

K8S中五种控制器的介绍以及使⽤
⽬录
k8s的控制器类型
pod与控制器之间的关系
Deployment(⽆状态化应⽤)
状态与⽆状态化对特点
Deployment的更新
Deployment的回滚
CronJob控制器
总结
k8s的控制器类型
Kubernetes中内建了很多controller(控制器),这些相当于⼀个状态机,⽤来控制Pod的具体状态和⾏为Deployment:适合⽆状态的服务部署
StatefullSet:适合有状态的服务部署
DaemonSet:⼀次部署,所有的node节点都会部署,例如⼀些典型的应⽤场景:
运⾏集存储 daemon,例如在每个Node上运⾏ glusterd、ceph
在每个Node上运⾏⽇志收集 daemon,例如 fluentd、 logstash
在每个Node上运⾏监控 daemon,例如 Prometheus Node Exporter
Job:⼀次性的执⾏任务
Cronjob:周期性的执⾏任务
总体来说,K8S有五种控制器,分别对应处理⽆状态应⽤、有状态应⽤、守护型应⽤和批处理应⽤
pod与控制器之间的关系
controllers:在集上管理和运⾏容器的对象通过label-selector相关联
Pod通过控制器实现应⽤的运维,如伸缩,升级等
Deployment(⽆状态化应⽤)
应⽤场景:web服务
Deployment中⽂意思为部署、调度,通过Deployment我们能操作RS(ReplicaSet),你可以简单的理解为它是⼀种通过yml
⽂件的声明,在Deployment ⽂件⾥可以定义Pod数量、更新⽅式、使⽤的镜像,资源限制等。⽆状态应⽤都⽤Deployment来创建
通过Deployment对象,你可以轻松的做到以下事情:
创建ReplicaSet和Pod
滚动升级(不停⽌旧服务的状态下升级)和回滚应⽤(将应⽤回滚到之前的版本
平滑地扩容和缩容
暂停和继续Deployment
Deployment创建
[root@master shuai]# vim nginx-delpoy.yaml
apiVersion: apps/v1
kind: Deployment  '定义是Deployment'
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3  '副本数量为3'
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
显示器驱动- containerPort: 80
'创建资源'
[root@master shuai]# kubectl apply -f nginx-delpoy.yaml
deployment.apps/nginx-deployment created
//Replicaset 是控制版本,副本数,回滚就是通过此来实现
'//查看所有资源'
[root@master shuai]# kubectl get all
NAME                                  READY  STATUS    RESTARTS  AGE
pod/nginx-deployment-d55b94fd-cndf2  1/1    Running  0          3m31s
pod/nginx-deployment-d55b94fd-ghlwk  1/1    Running  0          3m31s
pod/nginx-deployment-d55b94fd-tm4sw  1/1    Running  0          3m31s
pod/pod-example                      1/1    Running  0          10h
NAME                TYPE        CLUSTER-IP  EXTERNAL-IP  PORT(S)  AGE
service/kubernetes  ClusterIP  10.0.0.1    <none>        443/TCP  3d6h
NAME                              DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
deployment.apps/nginx-deployment  3        3        3            3          3m31s
NAME                                        DESIRED  CURRENT  READY  AGE
压力维持阀
replicaset.apps/nginx-deployment-d55b94fd  3        3        3      3m31s
查看控制器信息
kubectl deit deployment/nginx-deployment
.....省略信息.....
strategy:
rollingUpdate:        '版本更新为滚动更新机制'
maxSurge: 25%        '最⼤更新副本数是25%,最多扩容125%' '为了保持副本数量,增加的百分⽐同时要销毁多少'
maxUnavailable: 25%  '最⼤删除副本是25%,最多缩容到75%'
type: RollingUpdate
...省略信息....
'执⾏kubectl describe deploy nginx-deployment 也可以查看'
....省略信息....
RollingUpdateStrategy:  25% max unavailable, 25% max surge
查看历史版本
[root@master shuai]# kubectl rollout history deploy/nginx-deployment
REVISION  CHANGE-CAUSE
1        <none>  '//这边只有⼀个,证明还没有滚动更新'
状态与⽆状态化对特点
⽆状态服务的特点:
1)deployment 认为所有的pod都是⼀样的
2)不⽤考虑顺序的要求
3)不⽤考虑在哪个node节点上运⾏
4)可以随意扩容和缩容
1)实例之间有差别,每个实例都有⾃⼰的独特性,元数据不同,例如etcd,zookeeper
2)实例之间不对等的关系,以及依靠外部存储的应⽤。
Deployment的更新
如果想要让 nginx pod 使⽤ nginx:1.9.1 的镜像来代替原来的 nginx的镜像,运⾏以下命令
[root@master ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps/nginx-deployment image updated
或者我们可以使⽤ edit 命令来编辑 Deployment,将image从nginx改写成 nginx:1.9.1
kubectl edit deployment/nginx-deployment
查看更新进度
[root@master ~]# kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are
deployment "nginx-deployment" successfully rolled out
Deployment更新时会创建⼀个新的ReplicaSet,然后将新的ReplicaSet中的Pod慢慢扩容到指定的副本数,将旧的ReplicaSet 慢慢缩容到0。因此,更新时总能够确保旧的服务不会停⽌,这就是滚动更新。
Deployment的回滚
当我们像上⽂⼀样更新了Deployment之后,我们发现nginx:1.9.1的镜像不是很稳定,因此想要修改回nginx:1.7.9的版本,此时我们不需要⼿动更改Deployment⽂件,⽽是利⽤Deployment的回滚功能。
使⽤rollout history命令查看Deployment的版本(revision):
[root@master ~]# kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
预应力锚索
REVISION  CHANGE-CAUSE健康枕
1        kubectl create --l --record=true
2        kubectl create --l --record=true
因为我们创建 Deployment 的时候使⽤了 —recored 参数可以记录命令,我们可以很⽅便的查看每次 revison 的变化。
查看单个 revision 的详细信息:
[root@master ~]# kubectl rollout history deployment/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
Labels:      app=nginx
pod-template-hash=658d7f4b4b
Annotations:  kubernetes.io/change-cause: kubectl create --l --record=true
Containers:
nginx:
Image:      nginx:1.9.1
Port:      80/TCP
Host Port:  0/TCP
Environment:        <none>
Mounts:    <none>
Volumes:      <none>
可以使⽤rollout undo命令回滚到前⼀个revision
[root@master ~]# kubectl rollout undo deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back
[root@master ~]# kubectl describe deployment/nginx-deployment
Name:                  nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800
Labels:                <none>
Annotations:            deployment.kubernetes.io/revision: 3
kubernetes.io/change-cause: kubectl create --l --record=true
Selector:              app=nginx
Replicas:              3 desired | 3 updated | 3 total | 3 available | 0 unavailable
直埋电缆盖板
StrategyType:          RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
Labels:  app=nginx
Containers:
声源定位nginx:
Image:        nginx
Port:        80/TCP
Host Port:    0/TCP
Environment:  <none>
Mounts:      <none>
Volumes:        <none>
也可以使⽤–to-revision参数指定某个历史版本:
[root@master ~]#  kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.apps/nginx-deployment rolled back
[root@master ~]# kubectl describe deployment/nginx-deployment
Name:                  nginx-deployment
Namespace:              default
CreationTimestamp:      Fri, 24 Dec 2021 22:24:10 +0800
Labels:                <none>
Annotations:            deployment.kubernetes.io/revision: 4
kubernetes.io/change-cause: kubectl create --l --record=true
Selector:              app=nginx
Replicas:              3 desired | 3 updated | 4 total | 3 available | 1 unavailable
StrategyType:          RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
Labels:  app=nginx
Containers:
nginx:
Image:        nginx:1.9.1
Port:        80/TCP
Host Port:    0/TCP
Environment:  <none>
Mounts:      <none>
Volumes:        <none>
你可以通过设置 .visonHistoryLimit 项来指定 deployment 最多保留多少 revison 历史记录。默认的会保留所有的revision;如果将该项设置为 0,Deployment 就不允许回退了。
只有 Deployment 的 rollout 被触发才会创建⼀个 revision!注意!当且仅当 Deployment 的 Pod template被更改,例如更新template 中的 label 和容器镜像时,才会触发⼀个rollout,从⽽为Deployment创建出⼀个新的 revision。
rollout命令的更多⽤法:
history(查看历史版本)
pause(暂停Deployment)
resume(恢复暂停的Deployment)
status(查看资源状态)
undo(回滚版本)
Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直⾄其成功结束。如果失败,则根据restartPolicy(只⽀
持OnFailure和Never,不⽀持Always)决定是否创建新的Pod再次重试任务。
Job负责批量处理短暂的⼀次性任务 (short lived one-off tasks),即仅执⾏⼀次的任务,它保证批处理任务的⼀个或多个Pod成功结束。
Kubernetes⽀持以下⼏种Job:
⾮并⾏Job:通常创建⼀个Pod直⾄其成功结束
固定结束次数的Job:设置.specpletions,创建多个Pod,直到.specpletions个Pod成功结束
带有⼯作队列的并⾏Job:设置.spec.Parallelism但不设置.specpletions,当所有Pod结束并且⾄少⼀个成功
时,Job就认为是成功
根据.specpletions和.spec.Parallelism的设置,可以将Job划分为以下⼏种pattern
JOB类型使⽤实例⾏为completions parallelism ⼀次性Job数据库迁移创建⼀个Pod直⾄其成功结束11
固定结束次数的Job处理⼯作队列的Pod 依次创建⼀个Pod运⾏直⾄completions个成功结
2+1
固定结束次数的并⾏Job 多个Pod同时处理⼯作队
依次创建多个Pod运⾏直⾄completions个成功结
2+2+
并⾏Job 多个Pod同时处理⼯作队
创建⼀个或多个Pod直⾄有⼀个成功结束12+
.job的使⽤
[root@master ~]# l
---
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
spec:
containers:
- name: myjob
image: busybox
command: ["echo",  "hello k8s job"]      restartPolicy: Never
[root@master ~]# kubectl apply -l job.batch/myjob created
[root@master ~]# kubectl get pods

本文发布于:2023-07-26 06:40:23,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/192694.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:状态   服务   控制器   处理   版本   创建   副本   任务
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图