主要内容:
掌握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.yaml
daemonset.apps/mynginx created
[root@master ~]# kubectl get pod -o wide
# DaemonSet控制器自动为所有节点上运行Pod副本;
[root@master ~]# kubectl get daemonsets.apps
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
mynginx 3 3 3 3 3 <none> 12m
# 测试效果
[root@master ~]# curl http://10.244.2.13
this is nginx
[root@master ~]# curl http://10.244.1.11
this is nginx
[root@master ~]# curl http://10.244.3.19
this 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.yaml
daemonset.apps/mynginx created
[root@master ~]# kubectl get pods //设置污点标签后,只有2节点有POD副本
NAME READY STATUS RESTARTS AGE
mynginx-6j8h4 1/1 Running 0 9s
mynginx-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 AGE
mynginx-6j8h4 1/1 Running 0 68s
mynginx-8g2wc 1/1 Running 0 68s
mynginx-z4k4k 1/1 Running 0 39s
解释:为node-0001节点设置NoSchedule污点标签后,在创建容器时,不会对该节点调度创建Pod副本;移除NoSchedule污点标签后,会自动重新调度分配Pod副本;
示例2:污点标签NoExecute配置(创建、运行容器时都有效)
针对不同的控制器配置污点标签NoExecute会有不同效果
[root@master ~]# kubectl get pod //当前运行的Pod容器(DaemonSet控制器)
NAME READY STATUS RESTARTS AGE