Controller

DaemonSet Controller 源码分析

October 21, 2020
Kubernetes
DaemonSet, Controller

DaemonSet 简介 # 我们知道,Deployment 是用来部署一定数量的 Pod。但是,当你希望 Pod 在集群中的每个节点上运行,并且每个节点上都需要一个 Pod 实例时,Deployment 就无法满足需求。 这类需求包括 Pod 执行系统级别与基础结构相关的操作,比如:希望在每个节点上运行日志收集器和资源监控组件。另一个典型的例子,就是 Kubernetes 自己的 kube-proxy 进程,它需要在所有节点上都运行,才能使得 Service 正常工作。 如此,DaemonSet 应运而生。它能确保集群中每个节点或者是满足某些特性的一组节点都运行一个 Pod 副本。当有新节点加入时,也会立即为它部署一个 Pod;当有节点从集群中删除时,Pod 也会被回收。删除 DaemonSet,也会删除所有关联的 Pod。 应用场景 # 在每个节点上运行集群存守护进程 在每个节点上运行日志收集守护进程 在每个节点上运行监控守护进程 一种简单的用法是为每种类型的守护进程在所有的节点上都启动一个 DaemonSet。 一个稍微复杂的用法是为同一种守护进程部署多个 DaemonSet;每个具有不同的标志,并且对不同硬件类型具有不同的内存、CPU 等要求。 基本功能 # 创建 删除 级联删除:kubectl delete ds/nginx-ds 非级联删除:kubectl delete ds/nginx-ds --cascade=false 更新 RollingUpdate OnDelete 回滚 示例 # apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd-elasticsearch namespace: kube-system labels: k8s-app: fluentd-logging spec: selector: matchLabels: name: fluentd-elasticsearch template: metadata: labels: name: fluentd-elasticsearch spec: tolerations: # this toleration is to have the daemonset runnable on master nodes # remove it if your masters can't run pods - key: node-role. ...

无状态应用滚动更新

October 12, 2020
Kubernetes
Deployment, Controller

概念 # 滚动更新,通常出现在软件或者是系统中。滚动更新与传统更新的不同之处在于: 滚动更新不但提供了更新服务,而且通常还提供了滚动进度查询,滚动历史记录, 以及最重要的回滚等能力。通俗地说,就是具有系统或是软件的主动降级的能力。 Deployment 滚动更新 # Deployment 更新方式有 2 种: RollingUpdate Recreate 其中,滚动更新是最常见的,阅读代码 pkg/controller/deployment/deployment_controller.go:648, 可以看到 2 种方式分别对应的业务逻辑: func (dc *DeploymentController) syncDeployment(key string) error { ... switch d.Spec.Strategy.Type { case apps.RecreateDeploymentStrategyType: return dc.rolloutRecreate(d, rsList, podMap) case apps.RollingUpdateDeploymentStrategyType: return dc.rolloutRolling(d, rsList) } ... } 根据 d.Spec.Strategy.Type,若更新策略为 RollingUpdate, 则执行 dc.rolloutRecreate() 方法,具体逻辑如下: func (dc *DeploymentController) rolloutRolling(d *apps.Deployment, rsList []*apps.ReplicaSet) error { // 1、获取所有的 rs,若没有 newRS 则创建 newRS, oldRSs, err := dc.getAllReplicaSetsAndSyncRevision(d, rsList, true) if err ! ...