【云原生 | 从零开始学Kubernetes】二十四、kubernetes控制器Daemonset

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod。

kubernetes控制器Daemonset


DaemonSet 控制器:概念、原理解读


DaemonSet 概述


DaemonSet 工作原理:如何管理 Pod?


Daemonset 典型的应用场景


DaemonSet 与 Deployment 的区别


DaemonSet 资源清单文件编写技巧


DaemonSet 使用案例:部署日志收集组件 fluentd


Daemonset 管理 pod:滚动更新


DaemonSet 控制器:概念、原理解读


DaemonSet 概述


DaemonSet 控制器能够确保 k8s 集群所有的节点都运行一个相同的 pod 副本,当向 k8s 集群中增加 node 节点时,这个 node 节点也会自动创建一个 pod 副本,当 node 节点从集群移除,这些 pod 也会自动删除;删除 Daemonset 也会删除它们创建的 pod。


DaemonSet 工作原理:如何管理 Pod?


daemonset 的控制器会监听 kuberntes 的 daemonset 对象、pod 对象、node 对象,这些被监听的对象变动就会触发 syncLoop 循环让 kubernetes 集群朝着 daemonset 对象描述的状态进行演进。


Daemonset 典型的应用场景


在集群的每个节点上运行存储,比如:glusterd 或 ceph。


在每个节点上运行日志收集组件,比如:flunentd 、 logstash、filebeat 等。


在每个节点上运行监控组件,比如:Prometheus、 Node Exporter 、collectd 等。


都可以用daemonset去创建运行。


DaemonSet 与 Deployment 的区别


Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。


DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。


DaemonSet 资源清单文件编写技巧


#查看定义 Daemonset 资源需要的字段有哪些
[root@k8smaster ~]# kubectl explain ds 
KIND:     DaemonSet
VERSION:  apps/v1
DESCRIPTION:
     DaemonSet represents the configuration of a daemon set.
FIELDS: 
 apiVersion <string>    #当前资源使用的 api 版本,跟 VERSION: apps/v1 保持一致 
 kind <string>      #资源类型,跟 KIND: DaemonSet 保持一致 
 metadata <Object>    #元数据,定义 DaemonSet 名字的 
 spec <Object>      #定义容器的 
 status <Object>    #状态信息,不能改 
#查看 DaemonSet 的 spec 字段如何定义
[root@k8smaster ~]# kubectl explain ds.spec 
KIND:     DaemonSet
VERSION:  apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
     The desired behavior of this daemon set. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
     DaemonSetSpec is the specification of a daemon set.
FIELDS: 
 minReadySeconds <integer>      #当新的 pod 启动几秒种后,再 kill 掉旧的pod。 
 revisionHistoryLimit <integer>   #历史版本 
 selector <Object> -required-     #用于匹配 pod 的标签选择器 
 template <Object> -required-     #定义 Pod 的模板,基于这个模板定义的所有 pod 是一样的 
 updateStrategy <Object>      #daemonset 的升级策略 
#查看 DaemonSet 的 spec.template 字段如何定义
#对于 template 而言,其内部定义的就是 pod,pod 模板是一个独立的对象 
[root@k8smaster ~]# kubectl explain ds.spec.template 
kubectl explain ds.spec.template KIND:    DaemonSet
VERSION:  apps/v1
RESOURCE: template <Object>
FIELDS: 
 metadata <Object> 
 spec<Object>


DaemonSet 使用案例:部署日志收集组件 fluentd


#master node1 node2 都下载 fluentd
#编写一个 DaemonSet 资源清单 daemonset 也是通过标签选择器来选择模板创建pod
[root@k8smaster ~]# mkdir ds
[root@k8smaster ~]# cd ds
[root@k8smaster ~]# kubectl explain ds.spec.template.spec.tolerations
#找到容忍度 Taints 因为没有定义value 下面定义容忍度也不用写值,写一个排斥等级就行了
[root@k8smaster ds]# vim daemonset.yaml 
apiVersion: apps/v1
kind: DaemonSet
metadata: 
  labels:
    k8s-app: fluentd-logging
  name: fluentd-elasticsearch
  namespace: kube-system
spec:
  selector:
    matchLabels:
     name: fluentd-elasticsearch
  template:
    metadata:
     name: fluentd
     labels:
       name: fluentd-elasticsearch
    spec:
     tolerations:
     - key: node-role.kubernetes.io/master
       effect: NoSchedule
     containers:
     - name:  fluentd-elasticsearch
       image: fluentd
       resources:
         limits: 
           memory: 500Mi
         requests: 
           cpu: 100m
           memory: 200Mi
       volumeMounts:
       - name: varlog
         mountPath: /var/log
       - name: varlibdockercontainers
         mountPath: /var/lib/docker/containers
         readOnly: true
     terminationGracePeriodSeconds: 30
     volumes:
     - name: varlog
       hostPath:
          path: /var/log
     - name: varlibdockercontainers
       hostPath:
          path: /var/lib/docker/containers
[root@k8smaster ds]# kubectl apply -f daemonset.yaml 
daemonset.apps/fluentd-elasticsearch created
[root@k8smaster ds]# kubectl get ds -n kube-system 
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
fluentd-elasticsearch   3         3         3       3            0           <none>                   9s
kube-flannel-ds         3         3         3       3            3           <none>                   18d
kube-proxy              3         3         3       3            3           kubernetes.io/os=linux   18d
[root@k8smaster ds]# kubectl get pods -n kube-system -o wide -l name=fluentd-elasticsearch
NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE        NOMINATED NODE  
fluentd-elasticsearch-n5jj7   1/1     Running   0          59s   10.244.1.4   k8snode2    <none>           
fluentd-elasticsearch-qxgmc   1/1     Running   0          59s   10.244.0.2   k8smaster   <none>           
fluentd-elasticsearch-rhhv8   1/1     Running   0          59s   10.244.2.6   k8snode     <none>           
#通过上面可以看到在 k8s 的三个节点均创建了 fluentd 这个 pod 
#pod 的名字是由控制器的名字-随机数组成的 
#资源清单详细说明 
apiVersion: apps/v1    #DaemonSet 使用的 api 版本 
kind: DaemonSet     # 资源类型 
metadata: 
name: fluentd-elasticsearch  #资源的名字 
namespace: kube-system    #资源所在的名称空间 
labels: 
k8s-app: fluentd-logging    #资源具有的标签 
spec: 
selector:       #标签选择器 
matchLabels: 
name: fluentd-elasticsearch 
template: 
metadata: 
labels:       #基于这回模板定义的 pod 具有的标签 
name: fluentd-elasticsearch 
spec: 
tolerations:  #定义容忍度 
- key: node-role.kubernetes.io/master 
effect: NoSchedule      #只会影响新调度的pod
containers:  #定义容器 
- name: fluentd-elasticsearch 
image: xianchao/fluentd:v2.5.1 
resources:    #资源配额 
limits:   #最大资源
memory: 200Mi 
requests:   #最小资源
cpu: 100m 
memory: 200Mi 
volumeMounts: 
- name: varlog 
mountPath: /var/log    #把本地/var/log 目录挂载到容器 
- name: varlibdockercontainers 
mountPath: /var/lib/docker/containers   #把/var/lib/docker/containers/挂载到容器里 
readOnly: true      #挂载目录是只读权限 
terminationGracePeriodSeconds: 30 #优雅的关闭服务 
volumes: 
- name: varlog 
hostPath: 
path: /var/log      #基于本地目录创建一个卷 会去采集这个目录下的日志
- name: varlibdockercontainers 
hostPath: 
path: /var/lib/docker/containers #基于本地目录创建一个卷 同上


Daemonset 管理 pod:滚动更新


#DaemonSet 实现 pod 的滚动更新 
#查看 daemonset 的滚动更新策略 
[root@k8smaster ds]# kubectl explain ds.spec.updateStrategy 
KIND:     DaemonSet
VERSION:  apps/v1
RESOURCE: updateStrategy <Object>
DESCRIPTION:
     An update strategy to replace existing DaemonSet pods with new pods.
     DaemonSetUpdateStrategy is a struct used to control the update strategy for
     a DaemonSet.
FIELDS:
   rollingUpdate  <Object>
     Rolling update config params. Present only if type = "RollingUpdate".
   type <string>
     Type of daemon set update. Can be "RollingUpdate" or "OnDelete". Default is
     RollingUpdate.
#查看 rollingUpdate 支持的更新策略 
[root@k8smaster ds]# kubectl explain ds.spec.updateStrategy.rollingUpdate 
KIND:     DaemonSet
VERSION:  apps/v1
RESOURCE: rollingUpdate <Object>
DESCRIPTION:
     Rolling update config params. Present only if type = "RollingUpdate".
     Spec to control the desired behavior of daemon set rolling update.
FIELDS:
   maxUnavailable <string>
#上面表示 rollingUpdate 更新策略只支持 maxUnavailabe,先删除在更新;因为我们不支持一个节点运行两个 pod,因此需要先删除一个,在更新一个。 
#更新镜像版本,可以按照如下方法: 
[root@k8smaster ds]# kubectl set image daemonsets fluentd-elasticsearch fluentd-elasticsearch=nginx -n kube-system
daemonset.apps/fluentd-elasticsearch image updated
#这个镜像启动 pod 会有问题,主要是演示 daemonset 如何在命令行更新 pod 平时不用 都是改yaml
[root@k8smaster ds]# kubectl set image daemonsets fluentd-elasticsearch fluentd-elasticsearch=fluentd -n kube-system
daemonset.apps/fluentd-elasticsearch image updated
#改回来
[root@k8smaster ds]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
fluentd-elasticsearch-874qw         1/1     Running   0          23s
fluentd-elasticsearch-lmvjq         1/1     Running   0          26s
fluentd-elasticsearch-qxgmc         1/1     Running   0          8m29s
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
16天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
88 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
2月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
74 1
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
14天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
11天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
52 12
下一篇
开通oss服务