一.系统环境

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器 操作系统版本 CPU架构 进程 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

二.前言

使用DaemonSet 的前提是已经有一套可以正常运行的Kubernetes集群,关于Kubernetes(k8s)集群的安装部署,可以查看博客《Centos7 安装部署Kubernetes(k8s)集群》https://www.cnblogs.com/renshengdezheli/p/16686769.html。

三.DaemonSet 概览

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。

DaemonSet 的使用场景:

  • 在每个节点上运行集群守护进程
  • 在每个节点上运行日志收集守护进程
  • 在每个节点上运行监控守护进程

一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志, 并且对不同硬件类型具有不同的内存、CPU 要求。

当我们在Kubernetes(k8s)集群部署软件的时候,经常就会用到DaemonSet

deployment控制器一般需要指定副本数,如果配置了daemonset(简称ds),则不需要设置副本数,ds会自适应节点数,会自动在每个节点上创建出来一个pod。关于deployment控制器的详细内容,请查看博客《Kubernetes(k8s)控制器(一):deployment》。

四.创建DaemonSet

4.1 创建daemonset 让其在k8s集群所有worker节点运行pod

创建存放daemonset yaml文件的目录和namespace

[root@k8scloude1 ~]# mkdir daemonset

[root@k8scloude1 ~]# cd daemonset/

[root@k8scloude1 daemonset]# pwd
/root/daemonset [root@k8scloude1 daemonset]# kubectl create ns daemonset
namespace/daemonset created

切换命名空间

[root@k8scloude1 daemonset]# kubens daemonset
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "daemonset". [root@k8scloude1 daemonset]# kubectl get pod
No resources found in daemonset namespace.

daemonset不能通过命令来创建,我们可以通过deployment的yaml文件来修改为daemonset。

生成deployment的yaml文件

[root@k8scloude1 daemonset]# kubectl create deployment ds --image=nginx --dry-run=client -o yaml >ds.yaml

[root@k8scloude1 daemonset]# cat ds.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: ds
name: ds
spec:
replicas: 1
selector:
matchLabels:
app: ds
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: ds
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}

把deployment的yaml文件修改为daemonset的yaml文件的方法

  1. kind类型需要更改;
  2. daemonset不需要副本数,所以replicas不需要;
  3. strategy一般设置的是滚动更新的策略,daemonset也不需要;
  4. status不需要。

下面进行修改生成daemonset的配置文件:

[root@k8scloude1 daemonset]# vim ds.yaml 

[root@k8scloude1 daemonset]# cat ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
creationTimestamp: null
labels:
app: ds
name: ds
spec:
selector:
matchLabels:
app: ds
template:
metadata:
creationTimestamp: null
labels:
app: ds
spec:
terminationGracePeriodSeconds: 0
containers:
- image: nginx
name: nginx
#修改镜像下载策略:IfNotPresent表示本地有镜像就不下载
imagePullPolicy: IfNotPresent
resources: {}

创建daemonset

[root@k8scloude1 daemonset]# kubectl apply -f ds.yaml
daemonset.apps/ds created

查看daemonset,发现有2个pod

[root@k8scloude1 daemonset]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds 2 2 2 2 2 <none> 20s [root@k8scloude1 daemonset]# kubectl get ds -o wide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
ds 2 2 2 2 2 <none> 24s nginx nginx app=ds

查看pod,daemonset在每个节点上都创建了一个pod,但是没有在master节点创建pod,因为master节点上有污点。

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-hvn89 1/1 Running 0 47s 10.244.251.222 k8scloude3 <none> <none>
ds-qfq58 1/1 Running 0 47s 10.244.112.160 k8scloude2 <none> <none>

删除daemonset,pod随之被删除

[root@k8scloude1 daemonset]# kubectl delete ds ds
daemonset.apps "ds" deleted [root@k8scloude1 daemonset]# kubectl get pod -o wide
No resources found in daemonset namespace.

4.2 创建daemonset让其仅在某些节点上运行 Pod

查看node节点的标签,--show-labels表示显示标签

[root@k8scloude1 daemonset]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8scloude1 Ready control-plane,master 17d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scloude1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8scloude2 Ready <none> 17d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scloude2,kubernetes.io/os=linux,taint=T
k8scloude3 Ready <none> 17d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8scloude3,kubernetes.io/os=linux

满足标签为kubernetes.io/hostname=k8scloude3的只有k8scloude3节点

[root@k8scloude1 daemonset]# kubectl get node -l kubernetes.io/hostname=k8scloude3
NAME STATUS ROLES AGE VERSION
k8scloude3 Ready <none> 17d v1.21.0

配置daemonset,通过标签选择器,设置pod只在kubernetes.io/hostname=k8scloude3的节点运行

[root@k8scloude1 daemonset]# vim ds.yaml 

#设置pod只在kubernetes.io/hostname=k8scloude3的节点运行
[root@k8scloude1 daemonset]# cat ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
creationTimestamp: null
labels:
app: ds
name: ds
spec:
selector:
matchLabels:
app: ds
template:
metadata:
creationTimestamp: null
labels:
app: ds
spec:
terminationGracePeriodSeconds: 0
#nodeSelector设置pod只在kubernetes.io/hostname=k8scloude3的节点运行
nodeSelector:
kubernetes.io/hostname: k8scloude3
containers:
- image: nginx
name: nginx
imagePullPolicy: IfNotPresent
resources: {}

创建daemonset

[root@k8scloude1 daemonset]# kubectl apply -f ds.yaml
daemonset.apps/ds configured [root@k8scloude1 daemonset]# kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ds 1 1 1 1 1 kubernetes.io/hostname=k8scloude3 2m59s

pod只运行在k8scloude3节点

[root@k8scloude1 daemonset]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ds-2l5hr 1/1 Running 0 24s 10.244.251.230 k8scloude3 <none> <none>

删除daemonset

[root@k8scloude1 daemonset]# kubectl delete ds ds
daemonset.apps "ds" deleted [root@k8scloude1 daemonset]# kubectl get ds
No resources found in daemonset namespace.

查看kube-system命名空间下的daemonset有哪些

[root@k8scloude1 daemonset]# kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 3 3 3 3 3 kubernetes.io/os=linux 17d
kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 17d

可以查看kube-proxy 的Daemonset配置文件

[root@k8scloude1 daemonset]# kubectl get ds kube-proxy -n kube-system -o yaml > kube-proxy.yaml

[root@k8scloude1 daemonset]# vim kube-proxy.yaml

Kubernetes(k8s)控制器(二):DaemonSet的更多相关文章

  1. Kubernetes K8S之资源控制器Daemonset详解

    Kubernetes的资源控制器Daemonset详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C/ ...

  2. Kubernetes K8S之资源控制器RC、RS、Deployment详解

    Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...

  3. Kubernetes K8S之资源控制器StatefulSets详解

    Kubernetes的资源控制器StatefulSet详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  4. Kubernetes K8S之资源控制器Job和CronJob详解

    Kubernetes的资源控制器Job和CronJob详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2 ...

  5. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

  6. Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14

    目录 一.模块概览 二.系统环境 三.安装istio 3.1 使用 Istioctl 安装 3.2 使用 Istio Operator 安装 3.3 生产部署情况如何? 3.4 平台安装指南 四.Ge ...

  7. Kubernetes(k8s) docker集群搭建

    原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇   •Kubernetes介绍 1.背 ...

  8. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  9. k8s控制器资源(五)

    Pod pod在之前说过,pod是kubernetes集群中是最小的调度单元,pod中可以运行多个容器,而node又可以包含多个pod,关系如下图: 在对pod的用法进行说明之前,有必要先对docke ...

  10. Centos7 安装部署Kubernetes(k8s)集群

    目录 一.系统环境 二.前言 三.Kubernetes 3.1 概述 3.2 Kubernetes 组件 3.2.1 控制平面组件 3.2.2 Node组件 四.安装部署Kubernetes集群 4. ...

随机推荐

  1. DevOps|乱谈开源社区、开源项目与企业内部开源

    之前的一篇文章<从特拉斯辞职风波到研发效能中的荒唐事>中关于企业内源的内容在研发效能群内引起了大家的热烈讨论.有的小伙伴不同意,有的小伙伴非常不同意,我觉得这都是非常正常的反馈,话不说不透 ...

  2. Windows操作系统搭建Lsky Pro

    写在前面 本文主要介绍在Windows下部署兰空图床,以及安装过程, 非Windows系统可以参考本文章的安装流程,结合自己系统版本进行部署 图床用处 图床在日常的用处非常广泛,尤其对于经常写博客的人 ...

  3. 一张VR图像帧的生命周期

    "VR 应用程序每帧渲染两张图像,一张用于左眼,一张用于右眼."人们通常这样来解释 VR 渲染,虽然没有错,但可能过于简单化了.对于 Quest 开发人员来说,了解全貌是有益的,这 ...

  4. esp-01和esp-01s烧录固件和程序

    准备工具 USB-TTL 杜邦线若干 esp-01s烧录固件 我烧录的固件是 micropython, 使用的软件是 uPyCraft esp-01s烧录固件接线方法: esp-01s usb-ttl ...

  5. error while loading shared libraries: libSM.so.6: cannot open shared object file: No such file or di

    前言 运行 ida软件报错, 但是我的系统中存在 libSM.so.6 解决办法 首先查看系统中的 libsm.so.6 ldconfig -p |grep -i libsm.so.6 输出: lib ...

  6. .net如何优雅的使用EFCore

    EFCore是微软官方的一款ORM框架,主要是用于实体和数据库对象之间的操作.功能非常强大,在老版本的时候叫做EF,后来.net core问世,EFCore也随之问世. 本文我们将用一个控制台项目Ho ...

  7. fiddler提示"The system proxy was changed,click to reenable fiddler capture"的解决方法

    之前用fiddler 一直都是正常的,但是过了几个月再次使用的时候没几秒钟就提示:The system proxy was changed,click to reenable fiddler capt ...

  8. 【SQL】窗口函数:求数据组内累计值和累计百分比

    〇.概述 1.所需资料 窗口函数实现组内百分比.累计值.累计百分比:https://blog.csdn.net/weixin_39751959/article/details/88828922 2.背 ...

  9. Python 大数据量文本文件高效解析方案代码实现

    大数据量文本文件高效解析方案代码实现 测试环境 Python 3.6.2 Win 10 内存 8G,CPU I5 1.6 GHz 背景描述 这个作品来源于一个日志解析工具的开发,这个开发过程中遇到的一 ...

  10. JVM常用调优参数

    目录 JVM内存模型及常用参数 参数解释 垃圾收集器 Serial收集器(-XX:+UseSerialGC -XX:+UseSerialOldGC) Parallel Scavenge收集器(-XX: ...