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>