> 技术文档 > Linux云计算 |【第五阶段】CLOUD-DAY8

Linux云计算 |【第五阶段】CLOUD-DAY8


主要内容:

掌握DaemonSet控制器、污点策略(NoSchedule、Noexecute)、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP(服务名自动发现)、(Nodeport、Headless)、Ingress控制器

一、DaemonSet控制器

DaemonSet在每个机器都要启动运行Pod时,确保全部或一些Node上运行Pod副本当有Node节点加入集群时,也会为他新增Pod副本,当Node从集群移除时,这些Pod也会被回收;(有多少个Node节点,就在每个节点上运行Pod副本)

删除DaemonSet控制器时,将删除所有它创建的Pod副本;

典型应用:Ceph节点、监控节点、Filebeat日志收集等;

系统服务:Kube-proxy和Flannel就是这种类型;

DaemonSet与Deployment在编写配置文件时非常相似,区别是不需要配置replicas参数POD副本数,因为DaemonSet是每节点启动Pod副本;

  • 格式:kubectl -n kube-system get daemonsets.apps //查看DaemonSet控制器

补充:查询daemonsets.apps发现flannel和proxy的每个节点都创建了Pod副本,且没有二级控制器RS;(架构:daemonset-pod)

DaemonSet资源文件模板


编写DaemonSet资源文件示例:

[root@master ~]# vim mynginx.yaml--- //资源定义起始标志kind: DaemonSet //创建资源的类型(DaemontSet控制器,注意大小写)apiVersion: apps/v1 //控制器资源类型的版本metadata: //控制器资源的元数据 name: mynginx //控制器资源的名称(mynginx)spec://控制器资源的详细定义 selector://声明资源匹配选择器 matchLabels: //资源方式:匹配标签 myapp: nginx//为服务的后端选择标签(具体匹配的标签,与labels要一致) template://POD资源模板定义 metadata://POD资源的元数据 labels: //声明定义标签 myapp: nginx//标签名(与matchLabels要一致) spec: //容器的详细定义 containers: //容器定义 - name: nginxcluster //容器名称 image: 192.168.1.100:5000/myos:nginx //启动容器的镜像地址 stdin: false //标准输入,默认false tty: false //终端,默认false ports: //服务端口定义 - protocol: TCP //服务使用的协议 containerPort: 80 //容器监听的端口号 restartPolicy: Always //容器的死亡策略[root@master ~]# kubectl apply -f mynginx.yamldaemonset.apps/mynginx created[root@master ~]# kubectl get pod -o wide

# DaemonSet控制器自动为所有节点上运行Pod副本;

[root@master ~]# kubectl get daemonsets.appsNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGEmynginx 3 3 3 3 3  12m

# 测试效果

[root@master ~]# curl http://10.244.2.13this is nginx[root@master ~]# curl http://10.244.1.11this is nginx[root@master ~]# curl http://10.244.3.19this is nginx

思考:

在查询Pod资源时,发现Proxy和Flannel的Pod资源是有4个Pod副本;而执行编写的daemonset资源文件时,只有3个副本;DaemonSet调度器调度到除Master以外的所有节点,因希望Master节点除了一些系统服务以外,不会再有其它的POD副本,防止其它消耗高的POD抢占资源;而默认在Master上设置了污点策略,所以其它POD副本不会在Master上部署;

二、污点策略

1、污点标签

NoSchedule:不会被调度(容器创建时有效)

PreferNoSchedule:尽量不调度(容器创建时有效)

NoExecute:驱逐节点(容器创建、运行时都有效),针对不同控制器有不同效果;

1)查看污点标签

  • - 格式:kubectl describe nodes | grep -P \"^Taints\"
  • - 格式:kubectl describe node [node-name] //查看节点详细信息(Taints)

2)设置污点标签

- 格式:kubectl taint node =

删除污点标签

- 格式:kubectl taint node -


示例1:污点标签NoSchedule配置(创建容器时有效)

① 设置污点标签(在daemonset的资源文件上测试)

[root@master ~]# kubectl delete -f mynginx.yaml //删除资源,重新创建daemonset.apps \"mynginx\" deleted[root@master ~]# kubectl describe nodes | grep -P \"^Taints\"

[root@master ~]# kubectl taint node node-0001 k1=v1:NoSchedule //设置污点标签node/node-0001 tainted[root@master ~]# kubectl describe nodes | grep -P \"^Taints\"

[root@master ~]# kubectl apply -f mynginx.yamldaemonset.apps/mynginx created[root@master ~]# kubectl get pods //设置污点标签后,只有2节点有POD副本NAME READY STATUS RESTARTS AGEmynginx-6j8h4 1/1 Running 0 9smynginx-8g2wc 1/1 Running 0 9s

② 删除污点标签

[root@master ~]# kubectl taint node node-0001 k1-node/node-0001 untainted

[root@master ~]# kubectl get pods //移除污点标签后,3节点都有POD副本NAME READY STATUS RESTARTS AGEmynginx-6j8h4 1/1 Running 0