💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
ReplicaSet 用于在 Kubernetes 集群上运行部署特定数量的 Pod,如果你希望在集群的每个 Node 上都运行某个 Pod,这个时候就需要使用到 DaemonSet 了,当有节点加入集群时,会为它们新增一个 Pod。当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。通常这种情况下这种 Pod 都是执行系统级别与基础结构相关的操作,比如网络路由、存储、日志或是监控等。 DaemonSet 的使用情况分为两种: * 在每个节点上运行一个 Pod * 在特定的节点上运行一个 Pod #### 在每个节点上运行一个 Pod 对于采用 kubeadm-dind 部署方式而言,后面创建 Pod 运行 MySQL 会不成功,会有相关报错如下所示:`ERROR: mysqld failed whilmysqld: error while loading shared libraries: libpthread.so.0: cannot stat shared object: Permission denied`,主要原因是在 dind 环境中 MySQL 的权限问题,执行如下命令可以暂时在开发环境中解决这个问题: ~~~bash sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld ~~~ 在`/home/shiyanlou`目录下新建`mysql-ds.yaml`,并向其中写入如下代码: ~~~yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: mysql-ds spec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: '123456' ~~~ 然后执行创建: ~~~bash $ docker pull mysql:5.7 $ kubectl create -f mysql-ds.yaml daemonset.apps/mysql-ds created ~~~ 观察 Pod 是否分布到了每个节点上: ~~~bash $ kubectl get nodes NAME STATUS ROLES AGE VERSION kube-master Ready master 8d v1.15.0 kube-node-1 Ready <none> 8d v1.15.0 kube-node-2 Ready <none> 8d v1.15.0 $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-ds-fmtcr 1/1 Running 0 5m50s 10.244.2.11 kube-node-1 <none> <none> mysql-ds-mkwn2 1/1 Running 0 5m50s 10.244.3.9 kube-node-2 <none> <none> nginx-gpu 1/1 Running 0 52m 10.244.2.5 kube-node-1 <none> <none> ~~~ #### 在特定的节点上运行一个 Pod 如果想要使用 DaemonSet 只在特定的节点上运行 Pod,只需要在模板中的 nodeSelector 属性中指明即可。 环境中有两个节点,分别名为 kube-node-1 和 kube-node-2,我们先将 kube-node-1 打上标签 disk1=ssd1: ~~~bash $ kubectl label node kube-node-1 disk1=ssd1 node/kube-node-1 labeled ~~~ 然后在`/home/shiyanlou`目录下新建`tomcat-ssd.yaml`,并向其中写入如下代码: ~~~yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: tomcat-ssd spec: selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: nodeSelector: disk1: ssd1 containers: - name: tomcat image: kubeguide/tomcat-app:v1 ~~~ 执行创建并观察新建的 ds 和 Pod: ~~~bash $ kubectl create -f tomcat-ssd.yaml daemonset.apps/tomcat-ssd created $ kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE mysql-ds 2 2 2 2 2 <none> 9m tomcat-ssd 1 1 1 1 1 disk1=ssd1 37s $ kubectl get pod NAME READY STATUS RESTARTS AGE mysql-ds-fmtcr 1/1 Running 6 10m mysql-ds-mkwn2 1/1 Running 6 10m nginx-gpu 1/1 Running 0 58m tomcat-ssd-sqswr 1/1 Running 0 1m ~~~ 那么如果 kube-node-1 这个节点上的标签打错了,我们将其修改为 disk1=hdd,使用 DaemonSet 创建的 Pod 还存在吗?让我们试试: ~~~bash $ kubectl label node kube-node-1 disk1=hdd --overwrite node/kube-node-1 labeled ~~~ 然后运行在节点上的 Pod: ~~~bash $ kubectel get pod NAME READY STATUS RESTARTS AGE mysql-ds-fmtcr 1/1 Running 9 27m mysql-ds-mkwn2 1/1 Running 9 27m nginx-gpu 1/1 Running 0 1h ~~~ 可以看到该 Pod 已经终止了。