Kubernetes Daemonset 笔记
DeemonSet
DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。 当有节点加入集群时, 也会为他们新增一个 Pod 。 当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
典型用法
- 在每个节点上运行集群守护进程
- 在每个节点上运行日志收集守护进程
- 在每个节点上运行监控守护进程
创建一个 Daemonset 示例
daemonset.yaml 文件
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources:
limits:
memory: 200Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
创建
[root@master01 daemoset]# kubectl create -f daemonset.yaml
daemonset.apps/nginx created
[root@master01 daemoset]# kubectl get ds -owide
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
nginx 5 5 5 5 5 <none> 101s nginx nginx:1.15.2 app=nginx
# 查看ds信息,所有节点都有一个
[root@master01 daemoset]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 1 4d22h 172.18.71.25 master03 <none> <none>
nginx-4lskr 1/1 Running 0 18s 172.18.71.27 master03 <none> <none>
nginx-7r7sq 1/1 Running 0 11s 172.20.59.215 master02 <none> <none>
nginx-cn86m 1/1 Running 0 35s 172.29.55.24 node01 <none> <none>
nginx-cwf6t 1/1 Running 0 24s 172.31.112.154 master01 <none> <none>
nginx-hkwpw 1/1 Running 0 3s 172.21.231.153 node02 <none> <none>
查看创建的 daemonset
[root@master01 daemoset]# kubectl get ds -oyaml
apiVersion: v1
items:
- apiVersion: apps/v1
kind: DaemonSet
metadata:
annotations:
deprecated.daemonset.template.generation: "1"
creationTimestamp: "2022-11-07T13:35:18Z"
generation: 1
labels:
app: nginx
managedFields:
- apiVersion: apps/v1
fieldsType: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.: {}
f:deprecated.daemonset.template.generation: {}
f:labels:
.: {}
f:app: {}
f:spec:
f:revisionHistoryLimit: {}
f:selector: {}
f:template:
f:metadata:
f:labels:
.: {}
f:app: {}
f:spec:
f:containers:
k:{"name":"nginx"}:
.: {}
f:image: {}
f:imagePullPolicy: {}
f:name: {}
f:resources:
.: {}
f:limits:
.: {}
f:memory: {}
f:terminationMessagePath: {}
f:terminationMessagePolicy: {}
f:dnsPolicy: {}
f:restartPolicy: {}
f:schedulerName: {}
f:securityContext: {}
f:terminationGracePeriodSeconds: {}
f:updateStrategy:
f:rollingUpdate:
.: {}
f:maxUnavailable: {}
f:type: {}
manager: kubectl-create
operation: Update
time: "2022-11-07T13:35:18Z"
- apiVersion: apps/v1
fieldsType: FieldsV1
fieldsV1:
f:status:
f:currentNumberScheduled: {}
f:desiredNumberScheduled: {}
f:numberAvailable: {}
f:numberReady: {}
f:observedGeneration: {}
f:updatedNumberScheduled: {}
manager: kube-controller-manager
operation: Update
time: "2022-11-07T13:35:53Z"
name: nginx
namespace: default
resourceVersion: "106533"
uid: 91cc650b-d7f1-4746-b478-d4fce91bc675
spec:
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.2
imagePullPolicy: IfNotPresent
name: nginx
resources:
limits:
memory: 200Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
maxUnavailable: 1
type: RollingUpdate
status:
currentNumberScheduled: 5
desiredNumberScheduled: 5
numberAvailable: 5
numberMisscheduled: 0
numberReady: 5
observedGeneration: 1
updatedNumberScheduled: 5
kind: List
metadata:
resourceVersion: ""
selfLink: ""
Daemonset 要求
- DaemonSet 需要 apiVersion、kind 和 metadata 字段
- DaemonSet 对象的名称必须是一个合法的 DNS 子域名
- DaemonSet 也需要 .spec
Pod 模板
- .spec 中唯一必需的字段是 .spec.template
- .spec.template 是一个 Pod 模板, 因为它是嵌套的,因而不具有 apiVersion 或 kind 字段之外,与 Pod 具有相同的 schema
- 除了 Pod 必需字段外,在 DaemonSet 中的 Pod 模板必须指定合理的标签(查看 Pod 选择算符)
- 在 DaemonSet 中的 Pod 模板必须具有一个值为 Always 的 RestartPolicy。 当该值未指定时,默认是 Always
Pod 选择算符
- .spec.selector 字段表示 Pod 选择算符,它与 Job 的 .spec.selector 的作用是相同的。
- 必须指定与 .spec.template 的标签匹配的 Pod 选择算符
- 一旦创建了 DaemonSet,它的 .spec.selector 就不能修改。 修改 Pod 选择算符可能导致 Pod 意外悬浮,并且这对用户来说是费解的
spec.selector 是一个对象,如下两个字段组成
- matchLabels
- matchExpressions
允许构建更加复杂的选择器,可以通过指定 key、value 列表以及将 key 和 value 列表关联起来的 Operator。
当上述两个字段都指定时,结果会按逻辑与(AND)操作处理
.spec.selector 必须与 .spec.template.metadata.labels 相匹配。 如果配置中这两个字段不匹配,则会被 API 拒绝。
更新与回滚
1. 命令式更新
kubectl edit ds nginx
2. 更新镜像
kubectl set image ds <daemonset-name> <container-name>=<container-new-image> --record=true
kubectl set image ds nginx nginx=nginx:1.16.1 --record=true
3. 查看更新状态
kubectl rollout status ds <daemonset-name>
4. 列出所有修订版本
kubectl rollout history daemonset <daemonset-name>
[root@master01 daemoset]# kubectl rollout history daemonset nginx
daemonset.apps/nginx
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl set image ds nginx nginx=nginx:1.16.1 --record=true
5. 回滚到指定revision
kubectl rollout undo daemonset <daemonset-name> --to-revision=<revision>