在一些场景下,比如希望对节点进行性能监控、日志手机等,需要在每个节点上部署一个相关服务,我们可以通过亲和性相关功能或者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
...