作者 | 悟鵬
來源 | 阿里巴巴雲原生公眾號
《Kubernetes 穩定性保障手冊》系列文章:
- Kubernetes 穩定性保障手冊 -- 極簡版
- Kubernetes 穩定性保障手冊 -- 日誌專題
- Kubernetes 穩定性保障手冊 -- 可觀測性專題
- Kubernetes 穩定性保障手冊 -- 洞察+預案(本文)
綜述
穩定性保障是個複雜的話題,需要有效、可迭代、可持續保障集群的穩定性,系統性的方法或許可以解決該問題。
為了形成系統性的方法,可以梳理出穩定性保障複雜性的源頭,制定數據模型來對其進行描述,然後在數據模型的基礎上對集群的穩定性保障進行數字化和可視化,以數據模型為內核來持續迭代對穩定性保障的理解、實踐以及經驗的固化。
穩定性複雜性源頭
穩定性保障的複雜性源頭,一般會有如下維度:
- 系統組件數量和交互關係:隨著時間持續變化
- 系統組件和交互的動態行為特徵:不易推導和觀察
- 系統資源類型和數量:隨著時間持續變化
- 系統資源的動態行為特徵:不易推導和觀察
- 集群的穩定性保障動作:不易規範和安全執行
總結下來,即:
- 如何有效、全面洞察集群
- 如何通過預案安全執行穩定性保障動作
數據模型
可以通過 4 張圖和 3 張表對洞察和預案進行數據模型的抽象:
4 張圖
- 架構關係圖:描述集群組件及其交互關係
- 架構運行圖:描述集群組件及交互的動態特徵
- 資源構成圖:描述集群資源的構成
- 資源運行圖:描述集群資源的動態使用特徵
3 張表
- 事件列表:描述集群產生的需要關注的事件
- 操作列表:描述集群中可以執行的管理操作
- 預案列表:描述集群中事件和操作的關聯關係
如下:
洞察
集群的功能由集群架構提供,功能組件基於集群資源運行,故對於集群穩定性的洞察,核心在於把握集群架構和集群資源的特徵。
1. 架構關係圖
集群架構通常可以通過圖來表徵,其中節點表徵組件,邊表徵交互關係,通過圖結構可以直觀把握集群的架構,形如下圖:
可通過形如下的數據結構描述:
{
"nodes": [
{
"_id": "0ce0e913f6e5516846c654dbd81db6ecab1f684e",
"name": "kube-apiserver",
"description": "XXX VPC 內",
"type": "managed component",
"dependencies": {}
},
{
"_id": "f0740d8bb67520857061a9b71d4a9e4fc50bfe3d",
"name": "etcd",
"description": "XXX VPC 內",
"type": "managed component | storage",
"dependencies": {}
},
{
"_id": "05952a825e91cb50a81cbaf23c6941d5c3bb2c89",
"name": "eni-operator",
"description": "XXX VPC 內,管理 ENI",
"type": "component",
"dependencies": {
"serviceaccount": "enioperator",
"clusterrole": "enioperator",
"clusterrolebinding": "enioperator",
"configmaps": ["eniconfig"],
"secrets": ["enioperator"]
}
},
{
"_id": "42699513a7561e89a5f99881d7b05653a1625c51",
"name": "Network Service",
"description": "提供 VPC/VSwitch 等雲網絡資源的管理服務",
"type": "cloud service"
}
],
"edges": [
{
"_id": "38bce9ca8a0cec6d8586d96298bd63b0523fc946",
"source": "eni-operator", "target": "kube-apiserver",
"description": "管理 ENI 請求"
},
{
"_id": "93f3c21247165f0be3a969fc80f72bc1a402e9f5",
"source": "eni-operator", "target": "Network Service",
"description": "訪問阿里雲 ECS OpenAPI,管理 VPC/VSwitch 等網絡資源"
}
]
}
2. 架構運行圖
集群運行過程中,組件及交互關係可以通過外部觀測數據推測內部狀態,如 log/metrics/trace。與集群架構圖結合,可以在靜態架構的基礎上疊加動態的洞察數據,更直觀把握集群的健康狀態,如下圖:
其中的數字表徵洞察數據,可以是「異常數量」「請求流量」等。除了通過數字進行洞察,還可以使用「顏色表徵健康狀態」「線條粗細表徵流量大小」等。
可通過形如下的數據結構描述:
{
"nodes": [
{
"_id": "ea4538dc0625d06b0dc93579998e04288656050f",
"name": "mutatehook",
"deploy": {
"type": "K8s:Deployment",
"namespace": "kube-system",
"replicas": 3
},
"insight": [
{
"source": {
"vendor": "cloud:aliyun:sls",
"log_project": "xxx",
"log_store": "mutatehook",
"log_url": "https://sls.console.aliyun.com/lognext/project/xxx"
},
"signal": {
"exception": {
"fuzzy": "fail OR Fail OR error OR Error"
}
}
}
]
}
],
"edges": [
{
"_id": "38bce9ca8a0cec6d8586d96298bd63b0523fc946",
"source": "eni-operator", "target": "kube-apiserver",
"insight":[
{
"source": {
"vendor": "cloud:aliyun:sls",
"log_project": "xxx",
"log_store": "xxx",
"log_url": "https://sls.console.aliyun.com/lognext/project/xxx"
},
"signal": {
"exception": {
"unauthorized": "Unauthorized",
"throttling": "'Throttling' OR 'throttling'"
}
}
}
]
}
]
}
3. 資源構成圖
資源管理是個複雜的話題,通過分析集群中資源的構成關係,也可以嘗試通過圖結構來表徵集群的資源構成,節點表徵資源,邊表徵資源的從屬或綁定關係。
可通過形如下的數據結構描述:
{
"kinds": ["vpc", "vswitch", "securitygroup", "ecs", "clb", "rds", "nat", "eip"],
"tags": {
"cluster/product": "xxx",
"cluster/id": "2736f42d4e882ad6825d6364545a3f1cb5136859",
"cluster/name": "xxx",
"cluster/env": "staging"
},
"nodes": [
{
"kind": "vpc",
"nodes": [
{
"_id": "c505f21871bac7385c1387988cf226310af0831e",
"id": "vpc-xxx",
"description": "",
"ipv4": "xxx",
"tags": {
"resource/creator": "product",
"resource/role": ""
},
"url": "https://vpc.console.aliyun.com/vpc/xxx"
}
]
},
{
"kind": "ecs",
"nodes": [
{
"_id": "47c4fe5cc2585a49f07798a0b8b69cda7f8d4a23",
"id": "xxx",
"az": "xxx",
"interfaces": {
"primary": {
"ip": "xxx",
"eni": "xxx",
"mac": "xxx"
}
},
"instance-type-family": "xxx",
"instance-type": "xxx",
"tags": {
"resource/creator": "product",
"resource/role": "worker",
"node/container-runtime": "xxx",
"node/user-networking": "xxx",
"node/system-networking": "xxx"
},
"status": "",
"condition": "",
"url": "https://ecs.console.aliyun.com/#/server/xxx"
}
]
}
],
"edges": [
{
"_id": "a754c748b2723a25c017421dd0969d00df3c000b",
"source": "vsw-xxx", "target": "vpc-xxx",
"description": ""
},
{
"_id": "c34b164eba2897cfb2b574a576672d8aa441d709",
"source": "eip-xxx", "target": "ngw-xxx",
"description": ""
}
]
}
4. 資源運行圖
資源使用過程中,也可以對資源及資源間的關係通過外部觀測數據推測內部狀態,如 log/metrics/event。與資源構成圖結合,可以在靜態資源的基礎上疊加動態的洞察數據,直觀把握集群資源的使用狀態。
可通過形如下的數據結構描述:
{
"nodes": [
{
"_id": "35103ac62d4ef0a314e2a5128f44c684205bea2f",
"id": "vpc",
"insight": [
{
"source": {
"vendor": "cloud:aliyun:vpc",
"type": "OpenAPI"
},
"signal": {
"vpc/exist": "DescribeVpcs",
"vswitch/count": "DescribeVSwitches"
}
},
{
"source": {
"vendor": "cloud:aliyun:ecs",
"type": "OpenAPI"
},
"signal": {
"ecs/count": "DescribeInstances",
"securitygroup/count": "DescribeSecurityGroups"
}
}
]
},
{
"_id": "6450e07dc67027f76f29fbfcb841e57200855196",
"id": "ecs",
"insight": [
{
"source": {
"vendor": "cloud:aliyun:ecs",
"type": "OpenAPI"
},
"signal": {
"ecs/exist": "DescribeInstances",
"ecs/count": "DescribeInstances",
"ecs/usage": "DescribeInstanceMonitorData"
}
},
{
"source": {
"vendor": "cloud:aliyun:ecs",
"type": "auto"
},
"signal": {
"ecs/state_change": ""
}
}
]
}
],
"edges": [
{
"_id": "caa1e395c713f47766ca7bcfc20419c0be0f0803",
"source": "i-xxx", "target": "sg-xxx",
"insight": [
{
"source": {
"vendor": "cloud:aliyun:ecs",
"type": "OpenAPI"
},
"signal": {
"exist": "DescribeInstances"
}
}
]
},
{
"_id": "537dc478d95714792b3694674d6164f72b361bb0",
"source": "eip-xxx", "target": "ngw-xxx",
"insight": [
{
"source": {
"vendor": "cloud:aliyun:vpc",
"type": "OpenAPI"
},
"signal": {
"exist": "DescribeEipAddresses"
}
}
]
}
]
}
預案
集群出現異常是不可避免的,需要在出現異常時安全、有效處理。
異常可以通過事件來表徵,安全、有效的操作是經過評審、演練過的操作,將異常與操作結合,由異常觸發操作,形成經過評審、演練的預案,可以安全有效處理集群異常。
1. 事件列表
集群運行過程中會產生需要關注的事件,事件自身的格式可基於社區 CloudEvents標準來使用:_https://github.com/cloudevents/spec/blob/v1.0.1/spec.md_。
可通過形如下的數據結構描述:
{
"events": [
{
"_id": "a1ab5b61857be35a5c5b203dd84b49248161c823",
"description": "restart workload manually",
"event": {
"id": "restart-workload",
"source": "xxx",
"specversion": "1.0",
"type": "com.aliyun.trigger.manual",
"datacontenttype": "application/json",
"data": "{\"NAMESPACE\": \"\", \"NAME\": \"\", \"TYPE\": \"\"}"
}
}
]
}
2. 操作列表
為了降低誤操作的可能性,同時避免異常發生時執行未經審核、驗證的操作,需要定義集群中可以進行的操作列表。
可通過形如下的數據結構描述:
{
"actions": [
{
"_id": "47abc5cd9d64018ebf96dc5b2d6a4fbd35a3cb6d",
"name": "Action Restart Workload",
"exec": "restart-workload",
"env": [
"NAMESPACE",
"NAME",
"TYPE"
]
}
]
}
3. 預案列表
在事件列表和操作列表基礎上,可以將事件和操作關聯起來,以事件驅動的方式處理異常,即預案。
可通過形如下的數據結構描述:
{
"plans": [
{
"_id": "29a091c48d8992991ed69e8694b017a11abe3eec",
"name": "Plan Restart Workload",
"description": "重啟 workload",
"event": "a1ab5b61857be35a5c5b203dd84b49248161c823",
"actions": ["47abc5cd9d64018ebf96dc5b2d6a4fbd35a3cb6d"]
}
]
}
全局可視化穩定性保障
基於上述4 張圖和3 張表的數據模型,形成對集群穩定性保障的洞察+預案的內核,可以衍生出一種全局可視化的穩定性保障服務。
這樣的服務具有如下關鍵點:
- 全局視角
- 數字化
- 可視化
這種服務基於兩種原理實現:
- 人們對圖像的處理效率遠高於文字
- 全局視角可以提供「端到端理解系統」「精準定位問題」「安全處理問題」的能力
以日常生活中的交通圖為例:
通過交通圖,可以快速瞭解到一個區域的道路分佈和關鍵節點,約定俗成的紅黃綠顏色可以直觀表達道路的擁堵狀況。在更豐富的交通圖上,還會觀察到諸如修路、封路等重要事件。
這樣,基於可視化的方式,就可以迅速理解一個區域的交通和地理情況。
底層的數據模型是基礎,應用可視化的手段,使得數據的價值更易被髮揮。
一種實現
1)部署形態
- Region 化部署
- 面向 Region 內單集群或多集群提供服務
2)使用體感
根據穩定性保障的最佳實踐,將穩定性保障分為如下幾個欄目:
-
運行鏈路圖:
- 該欄目是日常穩定性保障高頻使用的區域,通過可視化的能力,直觀感知異常的發生、異常範圍和影響程度、白屏化+可視化方式處理異常
-
部署架構圖
- 該欄目用於理解集群的部署架構,感知和處理部署維度的問題
- 容量管理 (包括節點管理、容量規劃等) 在此欄目進行
-
業務流程圖
- 該欄目沉澱業務的功能流程圖,一方面協助業務控制功能複雜度,一方面協助業務理解業務功能現狀,共同助力業務迭代
- 業務相關的數據分析可放在該欄目
-
數據分析:該欄目服務兩方面的數據需求
-
業務需求
- 查看類:集群規模等 SLI 信息、集群穩定性等 SLO 信息
- 查詢類:根據特徵查詢統計信息 (如根據 label 查詢資源申請等)
-
穩定性保障需求
- 查看類:集群水位等 SLI 信息,集群穩定性保障效果等 SLO 信息
- 查詢類:根據特徵查詢統計信息 (如根據 label 查詢關聯的所有資源信息、資源洩露信息等)
-
-
可觀測性管理
-
該欄目用管理可觀測性相關事宜,包括:
- 觀測數據生成
- 觀測數據採集
- 觀測數據處理
- 觀測數據消費
-
-
可控性管理
-
該欄目用於管理與控制相關的操作,包括:
- 發佈管理
- 災備管理
- 預案管理
- 資源管理
- 混沌工程
- 安全管理
- 定期體檢
-
系統正常運行期間:
- 通過「數據分析」欄目,確認集群在「可觀測性」「可控性」方面的覆蓋面和精確性
- 在「可觀測性管理」欄目,進行可觀測維度的管理,包括 數據源/監控/告警補齊、治理等
-
在「可控性管理」欄目:
- 根據觀測數據發現的問題,進行預案配置、issue 管理等
- 根據混沌工程或演練發現的問題,進行預案配置等
- 在「運行鏈路圖」「部署架構圖」中,通過可視化方式,將已經配置的監控、告警、預案與組件或鏈路結合
系統異常及恢復期間,在「運行鏈路圖」中:
- 通過集群運行鏈路圖或告警,感知異常的發生
- 自動或手動觸發問題跟蹤
- 通過集群運行鏈路圖中組件及交互的顏色,感知異常的組件、異常的鏈路和嚴重程度
- 點擊集群運行鏈路圖中組件的異常數字,獲取關聯的異常詳情,或跳轉到日誌、tracing 系統等進行手動查詢
- 根據異常詳情或平臺提示,確定待執行的預案和關聯的組件
- 在集群運行鏈路圖中執行預案 (阻斷問題或恢復服務)
- 通過集群運行鏈路圖中組件及交互的顏色,確認預案執行效果
- 自動或手動結束問題跟蹤
問題跟蹤過程中記錄的主要內容有:
- issue
- 異常發生的時刻
- 異常處理期間執行的動作
- 運行鏈路圖 snapshot
- 異常恢復的時刻
數據模型及競爭力分析
數據模型是穩定性保障最佳實踐進行迭代、分享和應用的媒介,通用的洞察和預案可以形成標準化的服務,個性化的洞察和預案可通過固定的結構來描述,然後使用通用的控制器來落地。
以數據模型形成洞察+預案的穩定性保障服務,技術核心為:
-
洞察模型
-
關鍵問題:
- 如何洞察集群穩定性?
- 如何洞察業務迭代效率?
-
-
數據模型
-
關鍵問題:
- 如何定義有效、可擴展的數據描述?
-
在技術核心的基礎上,可以圍繞如下的競爭力進行迭代:
-
洞察
- 全局化
- 數字化
- 可視化
-
效率
- 最短操作路徑
- 最小使用成本
-
先進性
- 流程化最佳實踐
小結
通過 Spec 規範 7 種數據模型,我們可以基於結構化的描述來表徵洞察+預案。以此為核心,不斷迭代對穩定性保障的實踐和理解,加速業務迭代。再擴展一步,也有可能基於該模型在發展方向反哺業務。
如果大家感興趣,歡迎在留言區進行交流。