Kubernetes-DaemonSet控制器

Kubernetes-DaemonSet控制器

概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
每节点一个Pod实例:
DaemonSet确保在集群的每个节点上运行一个Pod的副本。当新的节点加入集群或者现有节点的标签发生变化时,DaemonSet会自动在新的节点上启动Pod实例,或者在标签变化的节点上重新调度Pod。

- 节点亲和性(Affinity):
你可以通过节点亲和性来定义DaemonSet在哪些节点上运行。这可以通过标签选择器来实现,确保DaemonSet只在满足特定标签条件的节点上运行。

- 自动调度和替换:
DaemonSet具有自动调度和替换的能力。当新节点加入集群时,DaemonSet会在新节点上启动Pod。如果一个节点被标记为不可调度,DaemonSet会尝试将其上的Pod重新调度到其他节点。

- Pod的生命周期和管理:
DaemonSet负责Pod的生命周期。如果节点上的Pod因为某种原因终止,DaemonSet将负责启动一个新的Pod实例,以保持在每个节点上运行一个Pod的要求。

- 滚动更新和版本管理:
类似于其他控制器,DaemonSet也支持滚动更新。你可以逐步将新版本的Pod引入到集群中,确保不会一次性中断所有节点上的服务。

DaemonSet是一种非常有用的控制器类型,特别适用于在整个Kubernetes集群中运行一些需要在每个节点上都有一个实例的服务。

参考文档

1
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/

使用DaemonSet控制器创建资源对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@kubernetes-master controller]# cat nginx-daemonset.yaml 
---
apiVersion: v1
kind: Namespace
metadata:
name: nginx-daemonset # 创建的命名空间
---
apiVersion: apps/v1
kind: DaemonSet # 创建的资源对象为daemonset控制器
metadata:
namespace: nginx-daemonset # 所在命名空间
name: nginx-daemonset # 控制器名
labels:
  app: nginx # 控制器标签
spec: #属性
selector:
  matchLabels:
    app: nginx # 控制器管理使用标签该标签的资源
template:
  metadata:
    labels:
      app: nginx # pod使用控制器标签
  spec:
    containers:
      - name: nginx # 容器名
        image: daocloud.io/library/nginx # 镜像
        ports:
          - name: nginx
            containerPort: 80 # 容器内使用端口
            hostPort: 8090 # host模式 可以通过宿主机加端口的方式访问该pod
            protocol: TCP
1
2
3
4
5
6
7
8
9
10
# 创建
[root@kubernetes-master controller]# kubectl apply -f nginx-daemonset.yaml
namespace/nginx-daemonset created
daemonset.apps/nginx-daemonset created

# 查看pod信息
[root@kubernetes-master controller]# kubectl get pod -n nginx-daemonset -o wide
NAME                   READY   STATUS   RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
nginx-daemonset-fv22r   1/1     Running   0         27s   10.10.20.225   kubernetes-node1   <none>           <none>
nginx-daemonset-mkjgn   1/1     Running   0         27s   10.10.20.67   kubernetes-node2   <none>           <none>
1
2
# 访问测试
node节点ip:hostPort端口

image-20231110140154620

image-20231110140332234

1
2
3
4
5
6
7
8
9
10
# 修改nginx信息
[root@kubernetes-master controller]# kubectl exec -it nginx-daemonset-fv22r -n nginx-daemonset bash
root@nginx-daemonset-fv22r:/# echo "This is node 10.10.10.22 " > /usr/share/nginx/html/index.html
root@nginx-daemonset-mkjgn:/# exit

[root@kubernetes-master controller]# kubectl exec -it nginx-daemonset-mkjgn -n nginx-daemonset bash
root@nginx-daemonset-mkjgn:/# echo "This is node 10.10.10.23 " > /usr/share/nginx/html/index.html
root@nginx-daemonset-mkjgn:/# exit

# 刷新查看

image-20231110140726380

image-20231110140737977

删除Pod

1
2
3
4
5
6
7
8
9
10
11
# 删除同意可以使用两张方式  yaml文件方式或者命令行方式 演示就只使用yaml方式了
[root@kubernetes-master controller]# kubectl delete -f nginx-daemonset.yaml  
namespace "nginx-daemonset" deleted
daemonset.apps "nginx-daemonset" deleted

# 命令行方式
[root@kubernetes-master controller]# kubectl delete daemonset nginx-daemonset -n nginx-daemonset

注:
- kubectl delete daemonset nginx-daemonset : 删除名为nginx-daemonset的daemonset控制器
- -n nginx-daemonset :指定命名空间