K8S资源控制器
作者:互联网
什么是控制器
kubernetes中建立了很多的controller(控制器),这相当于一个控制机,来管理pod的状态和行为。
控制器的类型
- ReplicationController和ReplicaSet
- Deployment 无状态负载
- DaemonSet 守护进程集
- StateFulSet 有状态负载
- Job/cronJob 普通任务/计划任务
- Horizontal Pod Autoscaling 自动扩展
ReplicationController和ReplicaSet
ReplicationController(RC)是用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会创建新的pod来代替,如果异常多出来的容器也会回收;
在新版本的kubernetes中建议使用ReplicaSet来代替ReplicationController,ReplicaSet 跟ReplicationController没有本质的不同,只是ReplicaSet支持集合式的selector(通过标签来选择);而ReplicationController不支持。
Deployment
Deployment为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便管理应用,典型的场景包括:
- 定义deployment来创建pod和replicaset
- 扩容和缩容
- 部署无状态应用,只关心数量,不论角色等,称无状态
- 具有上线部署、副本设定、滚动升级、回滚等功能
- 提供声明式更新,例如只更新一个新的image
例: 部署一个nginx应用
创建一个rs.ymal的文件,定义deployment来创建pod和replicaset
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 ~
[root@master ~]# kubectl apply -f rs.yaml #创建一个pod deployment.apps/nginx-deployment created [root@master ~]# kubectl get pods # 查看pod信息 NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-d9p6h 1/1 Running 0 27m nginx-deployment-7848d4b86f-bnvdg 0/1 ContainerCreating 0 13s nginx-deployment-7848d4b86f-xwn6c 0/1 ContainerCreating 0 13s nginx-deployment-7848d4b86f-zf4bh 1/1 Running 0 13s [root@master ~]# vim rs.yaml [root@master ~]# kubectl get pods --show-labels #查看pod的标签 NAME READY STATUS RESTARTS AGE LABELS nginx-6799fc88d8-d9p6h 1/1 Running 0 30m app=nginx,pod-template-hash=6799fc88d8 nginx-deployment-7848d4b86f-bnvdg 1/1 Running 0 3m42s app=nginx,pod-template-hash=7848d4b86f nginx-deployment-7848d4b86f-xwn6c 1/1 Running 0 3m42s app=nginx,pod-template-hash=7848d4b86f nginx-deployment-7848d4b86f-zf4bh 1/1 Running 0 3m42s app=nginx,pod-template-hash=7848d4b86f [root@master ~]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 56d nginx-deployment 3/3 3 3 6m53s [root@master ~]# kubectl get rs #查看pod的rs信息 NAME DESIRED CURRENT READY AGE nginx-6799fc88d8 1 1 1 35m nginx-deployment-7848d4b86f 3 3 3 8m40s [root@master ~]# kubectl get pods -o wide #查看pod的详细信息 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-6799fc88d8-d9p6h 1/1 Running 0 39m 10.101.11.5 node2 <none> <none> nginx-deployment-7848d4b86f-bnvdg 1/1 Running 0 11m 10.101.149.5 node1 <none> <none> nginx-deployment-7848d4b86f-xwn6c 1/1 Running 0 11m 10.101.149.4 node1 <none> <none> nginx-deployment-7848d4b86f-zf4bh 1/1 Running 0 11m 10.101.11.6 node2 <none> <none>
扩容或者缩容,比如我们把pod数目扩容到10个
[root@master ~]# kubectl scale deployment nginx-deployment --replicas 10 deployment.apps/nginx-deployment scaled [root@master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-6799fc88d8-d9p6h 1/1 Running 0 50m nginx-deployment-7848d4b86f-bnvdg 1/1 Running 0 22m nginx-deployment-7848d4b86f-fjhld 1/1 Running 0 92s nginx-deployment-7848d4b86f-nld5c 1/1 Running 0 92s nginx-deployment-7848d4b86f-nmxlf 1/1 Running 0 92s nginx-deployment-7848d4b86f-vmjgl 1/1 Running 0 92s nginx-deployment-7848d4b86f-wbfbq 1/1 Running 0 92s nginx-deployment-7848d4b86f-x86hq 1/1 Running 0 92s nginx-deployment-7848d4b86f-xngl5 1/1 Running 0 92s nginx-deployment-7848d4b86f-xwn6c 1/1 Running 0 22m nginx-deployment-7848d4b86f-zf4bh 1/1 Running 0 22m
更新镜像
kubectl set image deployment/nginx-deployment (需要更新的镜像deployment) nginx=nginx:1.9.1 (新版本镜像名称)
回滚
kubectl rollout undo deployment/nginx-deployment
Deployment更新策略
Deployment可以保证在升级时只有一定数量的pod是down的,默认的,他会确保至少比期望的pod数量少一个是up状态
DaemonSet
Daemonset确保全部(或者一些)Node上运行一个pod的副本。 当有Node加入集群时,也会为它新增一个pod。当有Node从集群中删除时,这些pod也会被回收。删除Daemonset时会删除它创建的所有pod。
使用Daemonset的一些典型用法:
- 运行集群存储daemon,例如在每个Node上运行ceph、glusterd
- 在每个Node上运行日志收集daemon,例如logstash、fluentd
- 在每个Node上运行监控daemon,例如Prometheus Node Exporter
job
job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或者多个pod成功结束
特殊说明:
- spec.template格式同pod一样
- restartpolicy仅支持never或 onfailure
- 单个pod时,默认pod成功运行job即 结束
cronjob
cronjob管理基于时间的job,即:
在给定时间点运行一次
周期性的在给定时间点运行
典型用法是:
在给定的时间点运行job
创建周期性的运行job,比如发送邮件,数据库备份等等。
StateFulSet
StateFulSet作为controller为pod提供唯一的标识,它可以保证部署和scale的顺序。
StateFulSet是为了解决有状态服务的问题(对应的deployment和Replicaset是为无状态服务而设计),应用场景包括:
- 稳定的持久化存储,即pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
- 稳定的网络标识,即pod重新调度后其PodName和HostName不变,基于headless service(即没有cluster IP 的service)来实现
- 有序部署,有序扩展,即pod是有顺序的,在部署或者扩展时要依据定义的顺序依次进行(即从0到N-1,在下一个pod运行之前所有之前的pod都是running或者ready状态),基于init container来实现。
- 有序收缩,有序删除
Horizontal Pod Autoscaling
应用的资源使用率通常有高峰和低谷的时候,如何肖峰填谷,提高集群的整体资源使用率,让service中的pod数量自动调整呢? 这就需要Horizontal Pod Autoscaling ,顾名思义,使pod水平缩放。
标签:kubectl,控制器,7848d4b86f,nginx,Running,deployment,pod,K8S,资源 来源: https://www.cnblogs.com/xiaozhi1223/p/16395749.html