DaemonSet 更新策略
DaemonSet 有兩種更新策略:
-
OnDelete
: 使用OnDelete
更新策略時(shí),在更新 DaemonSet 模板后,只有當(dāng)你手動(dòng)刪除老的 DaemonSet pods 之后,新的 DaemonSet Pod 才會(huì)被自動(dòng)創(chuàng)建。跟 Kubernetes 1.6 以前的版本類似。 -
RollingUpdate
: 這是默認(rèn)的更新策略。使用RollingUpdate
更新策略時(shí),在更新 DaemonSet 模板后, 老的 DaemonSet Pod 將被終止,并且將以受控方式自動(dòng)創(chuàng)建新的 DaemonSet Pod。 更新期間,最多只能有 DaemonSet 的一個(gè) Pod 運(yùn)行于每個(gè)節(jié)點(diǎn)上。
執(zhí)行滾動(dòng)更新
要啟用 DaemonSet 的滾動(dòng)更新功能,必須設(shè)置 .spec.updateStrategy.type
為 RollingUpdate
。
你可能想設(shè)置 .spec.updateStrategy.rollingUpdate.maxUnavailable
(默認(rèn)為 1), .spec.minReadySeconds
(默認(rèn)為 0) 和 .spec.updateStrategy.rollingUpdate.maxSurge
(默認(rèn)為 0)。
創(chuàng)建帶有 RollingUpdate 更新策略的 DaemonSet
下面的 YAML 包含一個(gè) DaemonSet,其更新策略為 'RollingUpdate
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# 這些容忍度設(shè)置是為了讓該守護(hù)進(jìn)程集在控制平面節(jié)點(diǎn)上運(yùn)行
# 如果你不希望自己的控制平面節(jié)點(diǎn)運(yùn)行 Pod,可以刪除它們
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
檢查了 DaemonSet 清單中更新策略的設(shè)置之后,創(chuàng)建 DaemonSet:
kubectl create -f fluentd-daemonset.yaml
另一種方式是如果你希望使用 kubectl apply
來更新 DaemonSet 的話, 也可以使用 kubectl apply
來創(chuàng)建 DaemonSet:
kubectl apply -f fluentd-daemonset.yaml
檢查 DaemonSet 的滾動(dòng)更新策略
首先,檢查 DaemonSet 的更新策略,確保已經(jīng)將其設(shè)置為 RollingUpdate
:
kubectl get ds/fluentd-elasticsearch -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}' -n kube-system
如果還沒在系統(tǒng)中創(chuàng)建 DaemonSet,請(qǐng)使用以下命令檢查 DaemonSet 的清單:
kubectl apply -f fluentd-daemonset.yaml --dry-run=client -o go-template='{{.spec.updateStrategy.type}}{{"\n"}}'
兩個(gè)命令的輸出都應(yīng)該為:
RollingUpdate
如果輸出不是 RollingUpdate
,請(qǐng)返回并相應(yīng)地修改 DaemonSet 對(duì)象或者清單。
更新 DaemonSet 模板
對(duì) RollingUpdate
DaemonSet 的 .spec.template
的任何更新都將觸發(fā)滾動(dòng)更新。 這可以通過幾個(gè)不同的 kubectl
命令來完成。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
tolerations:
# 這些容忍度設(shè)置是為了讓該守護(hù)進(jìn)程集在控制平面節(jié)點(diǎn)上運(yùn)行
# 如果你不希望自己的控制平面節(jié)點(diǎn)運(yùn)行 Pod,可以刪除它們
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
聲明式命令
如果你使用配置文件來更新 DaemonSet,請(qǐng)使用 kubectl apply
:
kubectl apply -f fluentd-daemonset-update.yaml
指令式命令
如果你使用指令式命令來更新 DaemonSets,請(qǐng)使用 kubectl edit
:
kubectl edit ds/fluentd-elasticsearch -n kube-system
只更新容器鏡像
如果你只需要更新 DaemonSet 模板里的容器鏡像,比如 .spec.template.spec.containers[*].image
, 請(qǐng)使用 kubectl set image
:
kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 -n kube-system
監(jiān)視滾動(dòng)更新狀態(tài)
最后,觀察 DaemonSet 最新滾動(dòng)更新的進(jìn)度:
kubectl rollout status ds/fluentd-elasticsearch -n kube-system
當(dāng)滾動(dòng)更新完成時(shí),輸出結(jié)果如下:
daemonset "fluentd-elasticsearch" successfully rolled out
故障排查
DaemonSet 滾動(dòng)更新卡住
有時(shí),DaemonSet 滾動(dòng)更新可能卡住,以下是一些可能的原因:
一些節(jié)點(diǎn)可用資源耗盡
DaemonSet 滾動(dòng)更新可能會(huì)卡住,其 Pod 至少在某個(gè)節(jié)點(diǎn)上無法調(diào)度運(yùn)行。 當(dāng)節(jié)點(diǎn)上可用資源耗盡時(shí), 這是可能的。
發(fā)生這種情況時(shí),通過對(duì) kubectl get nodes
和下面命令行的輸出作比較, 找出沒有調(diào)度 DaemonSet Pod 的節(jié)點(diǎn):
kubectl get pods -l name=fluentd-elasticsearch -o wide -n kube-system
一旦找到這些節(jié)點(diǎn),從節(jié)點(diǎn)上刪除一些非 DaemonSet Pod,為新的 DaemonSet Pod 騰出空間。
PS: 當(dāng)所刪除的 Pod 不受任何控制器管理,也不是多副本的 Pod時(shí),上述操作將導(dǎo)致服務(wù)中斷。 同時(shí),上述操作也不會(huì)考慮 PodDisruptionBudget 所施加的約束。
不完整的滾動(dòng)更新
如果最近的 DaemonSet 模板更新被破壞了,比如,容器處于崩潰循環(huán)狀態(tài)或者容器鏡像不存在 (通常由于拼寫錯(cuò)誤),就會(huì)發(fā)生 DaemonSet 滾動(dòng)更新中斷。
要解決此問題,需再次更新 DaemonSet 模板。新的滾動(dòng)更新不會(huì)被以前的不健康的滾動(dòng)更新阻止。
時(shí)鐘偏差
如果在 DaemonSet 中指定了 .spec.minReadySeconds
,主控節(jié)點(diǎn)和工作節(jié)點(diǎn)之間的時(shí)鐘偏差會(huì)使 DaemonSet 無法檢測(cè)到正確的滾動(dòng)更新進(jìn)度。文章來源:http://www.zghlxwxcb.cn/news/detail-501422.html
清理
從名字空間中刪除 DaemonSet:文章來源地址http://www.zghlxwxcb.cn/news/detail-501422.html
kubectl delete ds fluentd-elasticsearch -n kube-system
到了這里,關(guān)于k8s控制器之DaemonSet--第五彈更新 DaemonSet的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!