一、DaemonSet 控制器
DaemonSet控制器能够确保k8s集群所有的节点都运行一个相同的pod副本,当向k8s集群中增加node节点时,这个node节点也会自动创建一个pod副本,当node节点从集群移除,这些pod也会自动删除;删除Daemonset也会删除它们创建的pod,
使用DaemonSet控制器创建的pod,它会确保k8s集群中每一个节点都会有由DaemonSet控制器创建的且完全一样的pod,包括控制节点也会创建同样的pod出来。
1.1 DaemonSet 控制器与deploymen的区别
deployment控制器管理的pod,在不与控制节点定义容忍度的情况下,默认pod副本只能调度到工作节点上,如一个控制节点一个工作节点的情况下,那么所有的pod都将会调度到工作节点。与deploymen控制器不同的DaemonSet控制器则每个node节点只能运行一个pod副本。
可以通过如下命令进行查看字段信息: kubectl explain daemonset (daemonset可简写为ds) 如下图所示:
二、DaemonSet 编写yaml文件
需要在控制节点及工作节点准备一个fluentd镜像,可以使用docker pull fluentd进行下载或者通过别的方式获得。
在test命名空间创建一个由DaemonSet控制器管理的pod
#创建命名空间
[root@k8s-master ~]# kubectl create ns test
namespace/test created
#编写yaml文件
[root@k8s-master ~]# vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset #定义控制器名称
namespace: test #定义命名空间,将控制器在该命名空间创建
labels: #定于控制器标签
app: daemon
spec:
selector: #定义标签选择器
matchLabels: #定义匹配模板的标签,与模板的标签要一致
pod01: pod02
template: #定义pod模板
metadata:
labels: #定义模板标签
pod01: pod02
spec:
tolerations: #定义node容忍度(定义控制节点的),默认控制节点自带污点,工作节点不带污点,因为使用该控制器创建pod会在控制节点上也创建相同的pod,所以需要定义容忍度。
- key: node-role.kubernetes.io/control-plane #填写控制节点的当前污点,写':'冒号前的那一段(通过该命令查看:kubectl describe node +控制节点名称 | grep -i taints)
effect: NoSchedule #填写当前控制节点的排斥等级,写:冒号后的那一段(查看方法如上一致)
containers: #定义容器的运行信息
- name: my-fluentd
image: fluentd
imagePullPolicy: IfNotPresent
resources: #定义容器配额信息
requests: #定义pod在node节点创建时的请求最小资源配额
cpu: 100m
memory: 300Mi
limits: #定义pod在node节点创建后的最大使用资源配额
cpu: 100m
memory: 300Mi
volumeMounts: #定义容器内的卷挂载
- name: my-volumes001 #定义挂载哪一个存储卷(要与下方定义的存储卷的名称进行匹配)
mountPath: /test001 #将匹配到的存储卷挂载到容器的该路径下
- name: my-volumes002
mountPath: /test002
volumes: #定义存储卷
- name: my-volumes001 #定义第一个卷
hostPath: #定义宿主机的该路径为存储卷挂载到容器内
path: /var/log
- name: my-volumes002 #定义第二个卷
hostPath:
path: /var/log/containers
#创建
[root@k8s-master ~]# kubectl apply -f daemonset.yaml
daemonset.apps/daemonset created
[root@k8s-master ~]# kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
daemonset-2p9dx 1/1 Running 0 9s
daemonset-2rm4x 1/1 Running 0 10s
daemonset-9zccg 1/1 Running 0 9s
#验证集群内三个node节点均创建了相同的pod
[root@k8s-master ~]# kubectl get pods -n test -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-2p9dx 1/1 Running 0 17s 10.244.194.68 k8s-worker1 <none> <none>
daemonset-2rm4x 1/1 Running 0 18s 10.244.235.195 k8s-master <none> <none>
daemonset-9zccg 1/1 Running 0 17s 10.244.126.6 k8s-worker2 <none> <none>
三、DaemonSet实现pod的滚动更新
daemonset的滚动更新可以通过如下命令进行查看相关字段信息:
kubectl explain ds.spec.updateStrategy
因为daemonset控制器管理的pod在node节点上只能创建一个,所以更新的话,它会自动的先删除在创建。
#更新pod需要更换镜像,修改配置文件镜像为httpd并指定端口进行访问测试更新是否成功,修改内容如下所示
[root@k8s-master ~]# cat daemonset.yaml | grep -A 5 containers:
containers: #定义容器的运行信息
- name: my-fluentd
image: httpd
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent
#创建更新
[root@k8s-master ~]# kubectl apply -f daemonset.yaml
daemonset.apps/daemonset configured
#创建更新时动态查看pod状态信息
[root@k8s-master ~]# kubectl get pods -n test -w
NAME READY STATUS RESTARTS AGE
daemonset-2p9dx 1/1 Running 0 19m
daemonset-2rm4x 1/1 Running 0 19m
daemonset-9zccg 1/1 Running 0 19m //三个pod更新前的状态都是running
daemonset-2rm4x 1/1 Terminating 0 19m //开始更新,删除第一个节点上的pod
daemonset-2rm4x 1/1 Terminating 0 19m
daemonset-2rm4x 0/1 Terminating 0 19m
daemonset-2rm4x 0/1 Terminating 0 19m
daemonset-2rm4x 0/1 Terminating 0 19m
daemonset-ln6vl 0/1 Pending 0 0s
daemonset-ln6vl 0/1 Pending 0 0s
daemonset-ln6vl 0/1 ContainerCreating 0 0s //删除后进行创建
daemonset-ln6vl 0/1 ContainerCreating 0 0s
daemonset-ln6vl 1/1 Running 0 2s //创建完成 running
daemonset-2p9dx 1/1 Terminating 0 19m //开始删除第二个节点的pod 如下以此类推直至三个都完成更新
daemonset-2p9dx 1/1 Terminating 0 19m
daemonset-2p9dx 0/1 Terminating 0 19m
daemonset-2p9dx 0/1 Terminating 0 19m
daemonset-2p9dx 0/1 Terminating 0 19m
daemonset-s6nlh 0/1 Pending 0 0s
daemonset-s6nlh 0/1 Pending 0 0s
daemonset-s6nlh 0/1 ContainerCreating 0 0s
daemonset-s6nlh 0/1 ContainerCreating 0 1s
daemonset-s6nlh 1/1 Running 0 2s
daemonset-9zccg 1/1 Terminating 0 19m
daemonset-9zccg 1/1 Terminating 0 20m
daemonset-9zccg 0/1 Terminating 0 20m
daemonset-9zccg 0/1 Terminating 0 20m
daemonset-9zccg 0/1 Terminating 0 20m
daemonset-4s2lx 0/1 Pending 0 0s
daemonset-4s2lx 0/1 Pending 0 0s
daemonset-4s2lx 0/1 ContainerCreating 0 0s
daemonset-4s2lx 0/1 ContainerCreating 0 1s
daemonset-4s2lx 1/1 Running 0 2s
#完成后查看当前pod状态
[root@k8s-master ~]# kubectl get pods -n test -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
daemonset-4s2lx 1/1 Running 0 17s 10.244.126.7 k8s-worker2 <none> <none>
daemonset-ln6vl 1/1 Running 0 26s 10.244.235.196 k8s-master <none> <none>
daemonset-s6nlh 1/1 Running 0 22s 10.244.194.69 k8s-worker1 <none> <none>
#验证是否更新完成,访问显示httpd的主页更新完成
[root@k8s-master ~]# curl 10.244.194.69:80
<html><body><h1>It works!</h1></body></html>