配置DaemonSet升級(jí)模型以解決升級(jí)阻塞以及OTA升級(jí)問(wèn)題
在邊緣計(jì)算場(chǎng)景中,原生的DaemonSet升級(jí)模型無(wú)法滿(mǎn)足某些特定的需求,例如,由于云邊網(wǎng)絡(luò)中斷,節(jié)點(diǎn)NotReady而導(dǎo)致的DaemonSet滾動(dòng)升級(jí)被阻塞,或者您需要根據(jù)實(shí)際邊緣環(huán)境的狀態(tài)在邊緣節(jié)點(diǎn)上直接觸發(fā)應(yīng)用的升級(jí),而不由云端驅(qū)動(dòng)(例如新能源汽車(chē)的OTA升級(jí))。此時(shí),您可以通過(guò)配置擴(kuò)展的DaemonSet升級(jí)模型AdvancedRollingUpdate和OTA以解決云邊網(wǎng)絡(luò)中斷導(dǎo)致的升級(jí)阻塞以及OTA升級(jí)問(wèn)題。
前提條件
適用于v1.26.3-aliyun.1及以上版本的ACK Edge集群。
升級(jí)模型說(shuō)明
AdvancedRollingUpdate升級(jí)模型
該升級(jí)模型幫您解決云邊網(wǎng)絡(luò)斷鏈時(shí),由于節(jié)點(diǎn)狀態(tài)NotReady而導(dǎo)致的DaemonSet升級(jí)阻塞問(wèn)題。在升級(jí)過(guò)程中,它會(huì)忽略NotReady狀態(tài)的節(jié)點(diǎn),優(yōu)先完成狀態(tài)為Ready的節(jié)點(diǎn)上的Pod升級(jí)。同時(shí),當(dāng)節(jié)點(diǎn)狀態(tài)從NotReady轉(zhuǎn)變?yōu)?b>Ready時(shí),它會(huì)自動(dòng)完成該節(jié)點(diǎn)上DaemonSet Pod的升級(jí)。
OTA升級(jí)模型
該升級(jí)模型允許您直接在邊緣節(jié)點(diǎn)上通過(guò)調(diào)用REST API來(lái)檢查Pod是否可以更新,以及觸發(fā)Pod的升級(jí)操作。
配置說(shuō)明
apiVersion: apps/v1
kind: DaemonSet
metadata:
annotations:
apps.openyurt.io/update-strategy: AdvancedRollingUpdate
apps.openyurt.io/max-unavailable: 30%
spec:
updateStrategy:
type: OnDelete
參數(shù) | 說(shuō)明 |
apps.openyurt.io/update-strategy | 啟用擴(kuò)展升級(jí)模型,支持AdvancedRollingUpdate或OTA。 |
apps.openyurt.io/max-unavailable | 此配置僅在 |
DaemonSet.spec.updateStrategy.type | 必須設(shè)置為 |
使用方式
AdvancedRollingUpdate升級(jí)模型
以下示例代碼為AdvancedRollingUpdate升級(jí)示例,在示例中創(chuàng)建了一個(gè)名為nginx-daemonset
的DaemonSet,使用AdvancedRollingUpdate
升級(jí)模型,并且在滾動(dòng)升級(jí)過(guò)程中最多允許30%
的Pod不可用。則該AdvancedRollingUpdate升級(jí)使用示例如下。
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
annotations:
apps.openyurt.io/update-strategy: AdvancedRollingUpdate
apps.openyurt.io/max-unavailable: 30%
spec:
selector:
matchLabels:
app: nginx
updateStrategy:
type: OnDelete
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.4
EOF
OTA升級(jí)模型
OTA升級(jí)接口
邊緣節(jié)點(diǎn)上的edge-hub組件提供了兩個(gè)與OTA升級(jí)相關(guān)的REST APIs。
GET /pods
通過(guò)此接口可以獲取節(jié)點(diǎn)上的Pod信息。您可以通過(guò)
Pod.status.conditions
中的PodNeedUpgrade
來(lái)檢查Pod是否可以更新。POST /openyurt.io/v1/namespaces/{ns}/pods/{podname}/upgrade
通過(guò)此接口允許觸發(fā)特定的DaemonSet Pod的更新。路徑參數(shù)
{ns}
和{podname}
分別代表Pod的命名空間和名稱(chēng)。您可以根據(jù)實(shí)際需求對(duì)指定的Pod執(zhí)行升級(jí)操作。
OTA升級(jí)使用示例
創(chuàng)建一個(gè)名為
nginx-daemonset
的DaemonSet,使用OTA升級(jí)模型,當(dāng)DaemonSet的鏡像更新后,節(jié)點(diǎn)上的Pod并不會(huì)自動(dòng)更新,您需要在邊緣節(jié)點(diǎn)上通過(guò)REST API來(lái)檢查和觸發(fā)Pod的升級(jí)。cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: DaemonSet metadata: name: nginx-daemonset annotations: apps.openyurt.io/update-strategy: OTA spec: selector: matchLabels: app: nginx updateStrategy: type: OnDelete template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.19.4 EOF
OTA升級(jí)用例
登錄邊緣節(jié)點(diǎn),執(zhí)行以下命令,查看節(jié)點(diǎn)上的所有Pod是否有升級(jí)需求。
curl http://127.0.0.1:10267/pods
若輸出結(jié)果中
default/nginx-daemonset-bwzss pod.Status.Conditions
的`PodNeedUpgrade=true`
,表明對(duì)應(yīng)的Pod需要升級(jí)。執(zhí)行以下命令,對(duì)該P(yáng)od進(jìn)行升級(jí)。
curl -X POST http://127.0.0.1:10267/openyurt.io/v1/namespaces/default/pods/nginx-daemonset-bwzss/upgrade
執(zhí)行以下命令,更新DaemonSet配置。
Start updating pod default/nginx-daemonset-bwzss
相關(guān)文檔
如需確認(rèn)Pod運(yùn)行狀態(tài),請(qǐng)參見(jiàn)管理容器組(Pod)。