K8S学习笔录 - DaemonSet: 在每个Node上都调度一个Pod

1,262 阅读2分钟

原文链接

在一些场景下,比如希望对节点进行性能监控、日志手机等,需要在每个节点上部署一个相关服务,我们可以通过亲和性相关功能或者DaemonSet来实现它

DaemonSet

type DaemonSet struct {
    metav1.TypeMeta `json:",inline"`

    metav1.ObjectMeta `json:"metadata,omitempty"`

    // DaemonSet的具体定义
    Spec DaemonSetSpec `json:"spec,omitempty"`

    // DaemonSet的当前状态,只读
    Status DaemonSetStatus `json:"status,omitempty"`
}

type DaemonSetSpec struct {
    // Label选择器,用于查找被这个DaemonSet管理的Pod
    // 必须与Template中配置Pod的Label一致
    Selector *metav1.LabelSelector `json:"selector"`

    // Pod的具体定义
    Template v1.PodTemplateSpec `json:"template"`

    // Pod更新的策略配置
    UpdateStrategy DaemonSetUpdateStrategy `json:"updateStrategy,omitempty"`

    // Pod就绪前的最小等待时间,默认为0,即一切准备好之后立即可用
    MinReadySeconds int32 `json:"minReadySeconds,omitempty"`

    // 保留的Pod的历史版本数量,默认是10
    RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"`
}

type DaemonSetUpdateStrategy struct {
    // DaemonSet中Pod的升级策略,包括RollingUpdate和OnDelete,默认是RollingUpdate
    Type DaemonSetUpdateStrategyType `json:"type,omitempty"`

    // 滚动升级配置
    RollingUpdate *RollingUpdateDaemonSet `json:"rollingUpdate,omitempty"`
}

type RollingUpdateDaemonSet struct {
    // 最大不可用数,可以是具体数字,可以是百分比,默认是1,不能是0
    // 配置之后,更新升级时会先停止掉指定数量的Pod,然后启动新的Pod,成功之后删除掉旧的Pod,继续更新剩余的其他Pod
    MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"`
}

简单示例

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ab
  labels:
    app: ab
spec:
  selector:
    matchLabels:
      app: ab
  template:
    metadata:
      labels:
        app: ab
    spec:
      containers:
      - name: ab
        image: jordi/ab
        args:
        - -n100
        - -c10
        - -k
        - -r
        - URL

这个配置使用了docker-apache-benchmark这个Docker,实现一个简单的压力测试的功能。

由于这个容器中在前台运行的命令就是ab,所以当命令执行完之后,容器就会自动结束,此时Pod也会报异常,然后被DaemonSet干掉重新创建一个新的出来。

实际上这种场景更偏向于定时任务,然而这里也能用吧,毕竟什么都不用配置就可以达到每台机器分配一个Pod的效果。

跑起来之后的情况如下

$ kubectl get ds/ab -o wide
NAME   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE   CONTAINERS   IMAGES     SELECTOR
ab     2         2         2       2            2           <none>          59s   ab           jordi/ab   app=ab

$ kubectl get pods -l app=ab -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
ab-5gsbr   1/1     Running   0          85s   172.40.0.2   tx     <none>           <none>
ab-g9rzd   1/1     Running   0          85s   172.32.0.3   ks     <none>           <none>

$ kubectl logs ds/ab
Found 2 pods, using pod/ab-5gsbr
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.mi0ffice.cn (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
...