天天看點

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

作者 | 悟鵬

來源 |

阿裡巴巴雲原生公衆号

《Kubernetes 穩定性保障手冊》系列文章:

綜述​

穩定性保障是個複雜的話題,需要有效、可疊代、可持續保障叢集的穩定性,系統性的方法或許可以解決該問題。

為了形成系統性的方法,可以梳理出穩定性保障複雜性的源頭,制定資料模型來對其進行描述,然後在資料模型的基礎上對叢集的穩定性保障進行數字化和可視化,以資料模型為核心來持續疊代對穩定性保障的了解、實踐以及經驗的固化。

穩定性複雜性源頭

穩定性保障的複雜性源頭,一般會有如下次元:

  • 系統元件數量和互動關系:随着時間持續變化
  • 系統元件和互動的動态行為特征:不易推導和觀察
  • 系統資源類型和數量:随着時間持續變化
  • 系統資源的動态行為特征:不易推導和觀察
  • 叢集的穩定性保障動作:不易規範和安全執行

總結下來,即:

  • 如何有效、全面洞察叢集
  • 如何通過預案安全執行穩定性保障動作

資料模型

可以通過 4 張圖和 3 張表對洞察和預案進行資料模型的抽象:

4 張圖

  • 架構關系圖:描述叢集元件及其互動關系
  • 架構運作圖:描述叢集元件及互動的動态特征
  • 資源構成圖:描述叢集資源的構成
  • 資源運作圖:描述叢集資源的動态使用特征

3 張表

  • 事件清單:描述叢集産生的需要關注的事件
  • 操作清單:描述叢集中可以執行的管理操作
  • 預案清單:描述叢集中事件和操作的關聯關系

如下:

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

洞察

叢集的功能由叢集架構提供,功能元件基于叢集資源運作,故對于叢集穩定性的洞察,核心在于把握叢集架構和叢集資源的特征。

1. 架構關系圖

叢集架構通常可以通過圖來表征,其中節點表征元件,邊表征互動關系,通過圖結構可以直覺把握叢集的架構,形如下圖:

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

可通過形如下的資料結構描述:

{
    "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。與叢集架構圖結合,可以在靜态架構的基礎上疊加動态的洞察資料,更直覺把握叢集的健康狀态,如下圖:

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

其中的數字表征洞察資料,可以是「異常數量」「請求流量」等。除了通過數字進行洞察,還可以使用「顔色表征健康狀态」「線條粗細表征流量大小」等。

{
    "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 張表的資料模型,形成對叢集穩定性保障的洞察+預案的核心,可以衍生出一種全局可視化的穩定性保障服務。

這樣的服務具有如下關鍵點:

  • 全局視角
  • 數字化
  • 可視化

這種服務基于兩種原理實作:

  • 人們對圖像的處理效率遠高于文字
  • 全局視角可以提供「端到端了解系統」「精準定位問題」「安全處理問題」的能力

以日常生活中的交通圖為例:

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

通過交通圖,可以快速了解到一個區域的道路分布和關鍵節點,約定俗成的紅黃綠顔色可以直覺表達道路的擁堵狀況。在更豐富的交通圖上,還會觀察到諸如修路、封路等重要事件。

這樣,基于可視化的方式,就可以迅速了解一個區域的交通和地理情況。

底層的資料模型是基礎,應用可視化的手段,使得資料的價值更易被發揮。

一種實作

Kubernetes 穩定性保障手冊:洞察+預案綜述​穩定性複雜性源頭資料模型洞察預案全局可視化穩定性保障資料模型及競争力分析小結

1)部署形态

  • Region 化部署
  • 面向 Region 内單叢集或多叢集提供服務

2)使用體感

根據穩定性保障的最佳實踐,将穩定性保障分為如下幾個欄目:

  • 運作鍊路圖:
    • 該欄目是日常穩定性保障高頻使用的區域,通過可視化的能力,直覺感覺異常的發生、異常範圍和影響程度、白屏化+可視化方式處理異常
  • 部署架構圖
    • 該欄目用于了解叢集的部署架構,感覺和處理部署次元的問題
    • 容量管理 (包括節點管理、容量規劃等) 在此欄目進行
  • 業務流程圖
    • 該欄目沉澱業務的功能流程圖,一方面協助業務控制功能複雜度,一方面協助業務了解業務功能現狀,共同助力業務疊代
    • 業務相關的資料分析可放在該欄目
  • 資料分析:該欄目服務兩方面的資料需求
    • 業務需求
      • 檢視類:叢集規模等 SLI 資訊、叢集穩定性等 SLO 資訊
      • 查詢類:根據特征查詢統計資訊 (如根據 label 查詢資源申請等)
    • 穩定性保障需求
      • 檢視類:叢集水位等 SLI 資訊,叢集穩定性保障效果等 SLO 資訊
      • 查詢類:根據特征查詢統計資訊 (如根據 label 查詢關聯的所有資源資訊、資源洩露資訊等)
  • 可觀測性管理
    • 該欄目用管理可觀測性相關事宜,包括:
      • 觀測資料生成
      • 觀測資料采集
      • 觀測資料處理
      • 觀測資料消費
  • 可控性管理
    • 該欄目用于管理與控制相關的操作,包括:
      • 釋出管理
      • 災備管理
      • 預案管理
      • 資源管理
      • 混沌工程
      • 安全管理
      • 定期體檢

系統正常運作期間:

  • 通過「資料分析」欄目,确認叢集在「可觀測性」「可控性」方面的覆寫面和精确性
  • 在「可觀測性管理」欄目,進行可觀測次元的管理,包括 資料源/監控/告警補齊、治理等
  • 在「可控性管理」欄目:
    • 根據觀測資料發現的問題,進行預案配置、issue 管理等
    • 根據混沌工程或演練發現的問題,進行預案配置等
  • 在「運作鍊路圖」「部署架構圖」中,通過可視化方式,将已經配置的監控、告警、預案與元件或鍊路結合

系統異常及恢複期間,在「運作鍊路圖」中:

  • 通過叢集運作鍊路圖或告警,感覺異常的發生
  • 自動或手動觸發問題跟蹤
  • 通過叢集運作鍊路圖中元件及互動的顔色,感覺異常的元件、異常的鍊路和嚴重程度
  • 點選叢集運作鍊路圖中元件的異常數字,擷取關聯的異常詳情,或跳轉到日志、tracing 系統等進行手動查詢
  • 根據異常詳情或平台提示,确定待執行的預案和關聯的元件
  • 在叢集運作鍊路圖中執行預案 (阻斷問題或恢複服務)
  • 通過叢集運作鍊路圖中元件及互動的顔色,确認預案執行效果
  • 自動或手動結束問題跟蹤

問題跟蹤過程中記錄的主要内容有:

  • issue
  • 異常發生的時刻
  • 異常處理期間執行的動作
  • 運作鍊路圖 snapshot
  • 異常恢複的時刻

資料模型及競争力分析

資料模型是穩定性保障最佳實踐進行疊代、分享和應用的媒介,通用的洞察和預案可以形成标準化的服務,個性化的洞察和預案可通過固定的結構來描述,然後使用通用的控制器來落地。

以資料模型形成洞察+預案的穩定性保障服務,技術核心為:

  • 洞察模型
    • 關鍵問題:
      • 如何洞察叢集穩定性?
      • 如何洞察業務疊代效率?
      • 如何定義有效、可擴充的資料描述?

在技術核心的基礎上,可以圍繞如下的競争力進行疊代:

    • 全局化
  • 效率
    • 最短操作路徑
    • 最小使用成本
  • 先進性
    • 流程化最佳實踐

小結

通過 Spec 規範 7 種資料模型,我們可以基于結構化的描述來表征洞察+預案。以此為核心,不斷疊代對穩定性保障的實踐和了解,加速業務疊代。再擴充一步,也有可能基于該模型在發展方向反哺業務。

如果大家感興趣,歡迎在留言區進行交流。

繼續閱讀