十、K8s 其他控制器(DS、RC、RS、STS)
实验环境:
按照图示部署好了K8s集群,一个Master,两个worker nodes。
DaemonSet(DS):
相比于deployment,daemonset不需要设置副本数,而是会自适应节点数,而是会自动在每个节点上创建一个pod。
应用场景:
- 运行集群存储 daemon,例如在每个 Node 上运行 glusterd、ceph;
- 在每个 Node 上运行日志收集 daemon,例如fluentd、logstash;
- 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd、Datadog 代理、New Relic 代理,或 Ganglia gmond。
创建daemonset:
可以根据deployment 的yaml文件来修改:
kubectl create deployment ds1 --image=nginx --dry-run=client -o yaml >ds1.yaml
修改其yaml文件:修改kind类型,删除掉replicas、strategy和status三个元素即可。同时可以添加terminationGracePeriodSeconds和imagePullPolicy。
[root@vms201 daemonset]# cat ds1.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:creationTimestamp: nulllabels:app: ds1name: ds1
spec:selector:matchLabels:app: ds1template:metadata:creationTimestamp: nulllabels:app: ds1spec:terminationGracePeriodSeconds: 0containers:- image: nginxname: nginximagePullPolicy: IfNotPresentresources: {}
创建ds,可以看到其分布在2个work nodes上:
[root@vms201 daemonset]# kubectl apply -f ds1.yaml
daemonset.apps/ds1 created
[root@vms201 daemonset]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds1-48x5f 1/1 Running 0 9s 10.244.58.212 vms202.rhce.cc <none> <none>
ds1-hn8q6 1/1 Running 0 9s 10.244.185.67 vms203.rhce.cc <none> <none>
如果控制ds仅在部分节点运行,可以通过如下方法实现:
首先给一个node打上标签:
[root@vms201 daemonset]# kubectl label nodes vms202.rhce.cc disktype=ssd
node/vms202.rhce.cc labeled
修改daemonset的yaml文件,增加nodeSelector,用标签的方式指定调度在哪个node上:
[root@vms201 daemonset]# kubectl edit daemonsets.apps ds1
daemonset.apps/ds1 editedapiVersion: apps/v1
kind: DaemonSet
metadata:creationTimestamp: nulllabels:app: ds1name: ds1
spec:selector:matchLabels:app: ds1template:metadata:creationTimestamp: nulllabels:app: ds1spec:terminationGracePeriodSeconds: 0nodeSelector:disktype: ssdcontainers:- image: nginxname: nginximagePullPolicy: IfNotPresentresources: {}
查看ds是否修改成功:
[root@vms201 daemonset]# kubectl get ds ds1
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds1 1 1 1 1 1 disktype=ssd 58s
k8s组件中由daesonset创建的有如下的pod:
[root@vms201 daemonset]# kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 3 3 3 3 3 kubernetes.io/os=linux 6d12h
kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 6d12h
二、ReplicationController(RC):
ReplicationController (RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代;而异常多出来的容器也会自动回收。
修改RC的yaml文件:
[root@vms201 daemonset]# cat rc1.yaml
apiVersion: v1
kind: ReplicationController
metadata:name: myrc
spec:replicas: 3selector:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:terminationGracePeriodSeconds: 0containers:- image: nginxname: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
创建RC并查看:
[root@vms201 daemonset]# kubectl apply -f rc1.yaml
replicationcontroller/myrc created[root@vms201 daemonset]# kubectl get rc myrc -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myrc 3 3 3 58s nginx nginx app=nginx
伸缩副本数:
[root@vms201 daemonset]# kubectl scale rc myrc --replicas=2
replicationcontroller/myrc scaled
[root@vms201 daemonset]# kubectl get rc
NAME DESIRED CURRENT READY AGE
myrc 2 2 2 4m38s
删除掉RC:
[root@vms201 daemonset]# kubectl delete -f rc1.yaml
replicationcontroller "myrc" deleted
三、ReplicaSet (RS)
在新版的Kubernetes中建议使用ReplicaSet (RS)来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,但ReplicaSet支持集合式selector。
虽然 ReplicaSets 可以独立使用,但如今它主要被Deployments 用作协调 Pod 的创建、删除和更新的机制。当使用 Deployment 时,你不必担心还要管理它们创建的 ReplicaSet,Deployment 会拥有并管理它们的ReplicaSet。所以说Deployment本质上是通过管理RS来管理pod的。
修改RS的yaml文件:
[root@vms201 daemonset]# cat rs1.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: myrslabels:app: guestbook
spec:replicas: 3selector:matchLabels:tier: frontendtemplate:metadata:labels:app: guestbooktier: frontendspec:terminationGracePeriodSeconds: 0containers:- name: nginximage: nginximagePullPolicy: IfNotPresent
创建并查看RS:
[root@vms201 daemonset]# kubectl apply -f rs1.yaml
replicaset.apps/myrs created
[root@vms201 daemonset]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myrs 3 3 3 88s nginx nginx tier=frontend
修改副本数:
[root@vms201 daemonset]# kubectl scale rs myrs --replicas=2
replicaset.apps/myrs scaled
[root@vms201 daemonset]# kubectl get rs -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
myrs 2 2 2 2m37s nginx nginx tier=frontend
删除RS:
[root@vms201 daemonset]# kubectl delete -f rs1.yaml
replicaset.apps "myrs" deleted
四、StatefulSet(STS):
概述:
StatefulSet(k8s v1.9 中的stable-GA)是一种用于管理有状态应用程序的 Kubernetes 资源。它管理一组 Pod 的部署和扩展,并为这些 Pod 的排序和唯一性提供保证。
StatefulSet 也是一个 Controller,但与 Deployments 不同,它不会创建 ReplicaSet,而是自己创建具有唯一命名约定的 Pod。例如,如果用户创建一个名称为counter的 StatefulSet ,它将创建一个名称为counter-0的 pod ,对于一个 statefulset 的多个副本,它们的名称将像counter-0、counter-1、counter-2 等一样递增。
有状态集的每个副本都有自己的状态,每个 Pod 都将创建自己的 PVC(持久卷声明)。因此,具有 3 个副本的 statefulset 将创建 3 个 pod,每个 pod 都有自己的 Volume,因此总共 3 个 PVC。
相比于Deployments,StatefulSet能做到每一个容器的有自己的存储卷(数据不同),但是无法做到负载分担。
什么时候考虑使用StatefulSet:
一些应用,只适用于内部,并不行对外提供服务,且每个pod需要有自己的存储,且个pod挂掉再重启,还需要连接之前的pv,不能连到别的pv上,考虑使用StatefulSet。
sts和deploy的区别:
详细请参考:
https://blog.csdn.net/nickDaDa/article/details/90401635
实验测试:
sts不能直接创建,可以在K8s官网上找到对应的模板,然后进行修改:
[root@vms201 sts]# cat sts1.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"selector:matchLabels:app: nginxreplicas: 1template:metadata:labels:app: nginxspec:terminationGracePeriodSeconds: 0containers:- name: nginximage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteMany" ]storageClassName: "mysc"resources:requests:storage: 500Mi
仅创建一个Nginx的pod。其中 volumeClaimTemplates,每设置一个副本都会创建一个pvc。这里pvc通过指定的sc生成pv。
动态卷供应相关内容,请参考:https://blog.csdn.net/tushanpeipei/article/details/118493324?spm=1001.2014.3001.5501
创建sts服务后查看:可以看到已经自己已经生成了PVC,连接到了SC上,最终挂载到了远端NFS存储上。
[root@vms201 sts]# kubectl apply -f sts1.yaml
statefulset.apps/web created
[root@vms201 sts]# kubectl get pod web-0
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 17s
[root@vms201 sts]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
www-web-0 Bound pvc-a6928573-5d1d-4895-b36f-943658d1c11f 500Mi RWX mysc 3h30m
扩展副本数后可以发现,命名为web-1,序号依次增加:
[root@vms201 sts]# kubectl scale statefulset web --replicas=2
statefulset.apps/web scaled
[root@vms201 sts]# kubectl get pods | grep web
web-0 1/1 Running 0 9m13s
web-1 1/1 Running 0 68s
可以在NFS数据卷中找到数据信息:可以看到两个pod的信息是分别存储的。
[root@nfs cc]# ls
sts-www-web-0-pvc-a6928573-5d1d-4895-b36f-943658d1c11f sts-www-web-1-pvc-310b70de-71a6-48fc-b8de-d769d572328e
修改pod的主页,以做区别:
[root@vms201 sts]# kubectl exec -it web-0 -- sh -c "echo 111 > /usr/share/nginx/html/index.html"
[root@vms201 sts]# kubectl exec -it web-1 -- sh -c "echo 222 > /usr/share/nginx/html/index.html"
然后将副本数清空后重新增加:
[root@vms201 sts]# kubectl scale statefulset web --replicas=0
statefulset.apps/web scaled
[root@vms201 sts]# kubectl scale statefulset web --replicas=2
statefulset.apps/web scaled
[root@vms201 sts]# kubectl get pods | grep web
web-0 1/1 Running 0 30s
web-1 1/1 Running 0 29s
可以看到名称没有改变,然后再去查看每个pod中的数据,可以发现依然和副本关闭前一致(存储不会错乱):
[root@vms201 sts]# kubectl exec -it web-0 -- sh -c "cat /usr/share/nginx/html/index.html"
111
[root@vms201 sts]# kubectl exec -it web-1 -- sh -c "cat /usr/share/nginx/html/index.html"
222
主要注意的是,重新创建的pod名称和存储的信息都和之前保持一致,但是IP地址不同。
headless service:
由于每个pod中保存的信息不同,如果使用svc负载的方式将流量负载到不同的pod中,会导致访问到的内容不同。而直接访问pod,由于同一个pod删除,重新创建后,IP地址不同,也是一个问题。所以这个时候就可以实验headless service(无头服务)来解决问题。
可以通过指定 Cluster IP(spec.clusterIP)的值为 “None” 来创建 Headless Service。对于STS的无头无法不能直接创建,我看可以在SVC的yaml文件中修改:
[root@vms201 sts]# cat headless.yaml
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
应用并查看服务信息,这里的CLUSTER-IP为None:
[root@vms201 sts]# kubectl apply -f headless.yaml
service/nginx created
[root@vms201 sts]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx ClusterIP None <none> 80/TCP 39s app=nginx
访问headless服务下的pod:访问格式: 容器名.服务名,这里也就是web-0.nginx和web-1.nginx。
[root@vms201 sts]# kubectl run -it testpod --image=yauritux/busybox-curl --rm --image-pull-policy=IfNotPresent -- sh
If you don't see a command prompt, try pressing enter.
/home # curl web-0.nginx
111
/home # curl web-1.nginx
222
参考资料:
《老段CKA课程》
https://medium.com/stakater/k8s-deployments-vs-statefulsets-vs-daemonsets-60582f0c62d4
十、K8s 其他控制器(DS、RC、RS、STS)相关推荐
- K8S控制器类型:RC/RS、Deployment、DaemonSet、Job和CronJob、StatefulSet、HPA
控制器类型 RC/RS 命令式编程就类似于面向过程 声明式编程就类似于面向对象 sql语句就是典型的声明式编程语言 Deployment Deployment是通过RS来创建和管理pod的 Daemo ...
- K8S(2)RC、RS和Deployment
文章目录 一.RC 与 RS - Replication Controller(RC) - ReplicaSet(RS) 二.Deployment - 创建Deployment - 更新Deploym ...
- k8s——pod控制器
k8s--pod控制器 Pod控制器介绍 Pod控制器及其功用 pod控制器有多种类型 Pod与控制器之间的关系 Pod控制器种类及yaml格式 Deployment StatefulSet Daem ...
- k8s中控制器使用详解
一.什么是控制器 控制器是管理pod的中间层,只需要告诉Pod控制器,想要创建多少个什么样的Pod,它会创建出满足条件的Pod : 控制器相当于一个状态机,用来控制Pod的具体状态和行为 : cont ...
- 计算机组成原理EMAR啥意思,计算机组成原理第十讲(组合逻辑控制器).ppt
计算机组成原理第十讲(组合逻辑控制器) 计算机组成原理 主讲:颜俊华 第十讲:组合逻辑控制器设计 时序系统 工作周期 取指周期FT 源周期ST 目的周期DT 执行周期ET 中断周期IT DMA周期DM ...
- 【XJTUSE 计算机组成与结构笔记】第十五章 控制器操作Control Unit Operation
文章目录 第十五章 控制器操作Control Unit Operation Key points 15.1 微操作 取指周期 间接周期 中断周期 执行周期 指令周期 15.2 处理器控制 控制信号 控 ...
- k8s之存储、SC、STS、DS篇(一些常见的存储方案)
为什么要做持久化存储? 在k8s中部署的应用都是以pod容器的形式运行的,假如我们部署MySQL.Redis等数据库,需要对这些数据库产生的数据做备份.因为Pod是有生命周期的,如果pod不挂载数据卷 ...
- k8s pod控制器使用以及详解
pod的创建方式 在k8s中,可以将pod的创建方式分为2类 自主式pod: 由k8s直接创建出来的pod,这种pod删除之后就没有了,也不会重建 kubectl run mynginx --imag ...
- k8s pod控制器详解(ReplicaSet、Deployment、Horizontal Pod Autoscaler)
一.Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删 ...
- Jmeter(四十二)_控制器下遍历一组参数
概述 在接口自动化的过程中,经常遇到需要遍历的参数组.jmeter在中,foreach控制器可以实现遍历参数,但是只能有一个入参.一旦遇到数组,foreach控制器表示我也无能为力... 为了解决这个 ...
最新文章
- 【转载】同步和互斥的POSIX支持(互斥锁,条件变量,自旋锁)
- 佛经上181条做人的道理
- python scikit_如何将Scikit学习Python库用于数据科学项目
- 服务器 消息 208,在MSSQL2000里边 对象名 'sys.servers' 无效 服务器: 消息 208,级别 16,状态 1,行 1...
- 1014. 最佳观光组合
- kafka自带的zk启动_KafKa 启动
- 高并发秒杀系统--秒杀高并发分析与解决方案
- Ubuntu14.04LTS TensorFlow安装手册
- 2021年40个最佳免费WordPress主题
- [Pyecharts 可视化] B站推荐视频分析
- log4cpp编译安装
- 二层交换机实现不同vlan通信
- 什么是企业邮箱客户端授权码,如何使用?
- 树莓派3初始化安装(Raspberry Pi III)
- 爬虫第二弹:千图网电商淘宝模板图片下载
- 姜烧猪肉+日式厚蛋烧+蚝油青笋
- 支持生僻字且自动识别utf-8编码的php汉字转拼音类,支持生僻字且自动识别utf-8编码的php汉字转拼音类_php技巧...
- java jtextarea.setfont,Java JTextArea用法
- Linux | 文件类型说明
- 第九回(二):任侠厨子轻解厄围 夜半蹴鞠为泄忿闷[林大帅作品集]
热门文章
- 深度学习优化算法入门:二、动量、RMSProp、Adam
- 【每日算法Day 86】面试经典题:把数字翻译成字符串
- 数据预处理—8.属性归约之主成分分析(理论及python实现)
- 数据结构——树的概述
- 3.6 Spark安装与体验
- python模块 - 序列化模块pickle
- VGG16—perceptual loss in keras感知损失【Keras】
- github上传代码_如何更新GitHub上的代码?
- 技校毕业计算机应用技术,技校计算机应用毕业生自我鉴定
- python数据分析模型选择_python学习-数据分析2(分类型数据处理+SVM建模)