互动赠书 | 云上云下K8s多集群如何实现集群管理和安全治理的一致体验?
作者|郝樹偉(流生)
以 Kubernetes 為代表的云原生技術不僅屏蔽了各個云廠商和數據中心在基礎設施上的差異性,還使得應用可以在不同的云上使用標準化的方式描述和部署運行。在此基礎之上,我們才可以低成本管理處于任何地理位置的 Kubernetes 集群。本文將主要為您介紹如何實現對公共云 ACK 集群和數據中心自建 Kubernetes 集群一致體驗的集群管理和安全治理。
ACK 注冊集群安全架構
要實現對公共云 ACK 集群和數據中心自建 Kubernetes 集群一致體驗的集群管理和安全治理,就必須先將其統一到同一控制平面,ACK 注冊集群允許處于任何地理位置的自建 Kubernetes 集群通過公網或私網(云上云下網絡打通)連接端點接入阿里云容器服務管理系統。下面是 ACK 注冊集群的架構示意圖:
在 ACK 注冊集群架構示意圖中,主要包括以下幾個組成部分:
-
ACK 容器服務控制臺。
-
ACK 注冊集群 Agent 組件:Agent 組件以 Deployment 的形式部署在自建 Kubernetes 集群中(或者其他云廠商的容器集群中),用于接收 ACK 注冊集群 Stub 組件(使用 ACK 容器服務控制臺或 ACK 注冊集群 kubeconfig)下發的請求,并將其轉發給目標集群的 Kubernetes API Server,同時接收 Kubernetes API Server的響應并將其發送回 Stub 組件。
-
ACK 注冊集群 Stub 組件:Stub組件部署的容器服務管控側,每一個注冊集群都對應一個 Stub 組件,用于代理轉發 ACK 容器服務控制臺或 ACK 注冊集群 kubeconfig 訪問集群產生的請求,轉發到 Agent 組件并接收來自 Agent 組件的響應,最終返回響應到用戶端。
-
Kubernetes API Server:目標自建 Kubernetes 集群或其他云廠商容器集群的 Kubernetes API Server。
單向注冊雙向通信
前面我們提到,ACK 注冊集群可以接入處于任何地理位置的自建 Kubernetes 集群,數據中心內自建的 Kubernetes 集群有一個特點就是通常情況下,這些自建集群處于一個受限的私有網絡環境下,只能集群出公網訪問外部環境。ACK 注冊集群為了解決這個問題,將 Stub/Agent 組件設計為 Agent 主動單向注冊到 Stub 組件,Agent 連接 Stub 時,會帶上預先生成的 token 和證書等信息進行驗證,整個通信鏈路采用 TLS 協議確保數據加密。
非“托管式”安全接入機制
通過 ACK 注冊集群將自建 Kubernetes 集群接入到阿里云容器服務管控系統,用戶最大的安全擔憂就是自有集群訪問權限的管理和控制,我們通過以下幾點來保證用戶對自有集群的絕對安全控制。
- ACK 管控側不存儲用戶自有集群的任何秘鑰信息。用戶自建 Kubernetes 集群擁有自己的一套證書體系,如果 ACK 注冊集群使用用戶自建 Kubernetes 集群的 kubeconfig 對其進行訪問,那么勢必會造成用戶集群訪問權限的不可控。實際上,無論是從安全角度考慮,還是從管控側一致性體驗的角度考慮,都要求我們通過 ACK 注冊集群來屏蔽管控側與用戶自建集群證書體系的差異性。那么具體的解法就是管控側會使用 ACK 統一頒發的證書體系訪問注冊集群 Stub 組件,在 Stub 和 Agent 組件完成請求認證后,經由 Agent 以身份扮演的方式向目標 API Server作 7 層代理轉發,最終在 API Server 完成請求的 RBAC 鑒權和審計,如下圖所示。
-
集群訪問權限的管控收斂到 Agent 組件。Agent 組件部署在用戶自建集群中,ACK 管控側通過 Stub/Agent 鏈路訪問用戶自建集群的權限收斂在 Agent 組件側,這樣可以保證用戶對自有集群訪問權限的全權控制。
-
Agent 組件“非侵入式”部署。Agent 組件以 Deployment 的形式部署在自建 Kubernetes 集群中,不對自建集群做任何更改和操作,后續會將 Agent 組件的源碼開源出來。
-
支持開啟安全審計。用戶可以在注冊集群中開啟安全審計功能,任何對集群的操作都可以進行查詢和審計。
一致體驗的集群管理
假設當前用戶 A 已經在公共云創建了一個 ACK 集群,在數據中心內創建了一個自建 Kubernetes 集群,那么如何使用一致的體驗來管理這兩個處于不同云環境的 Kubernetes 集群呢?很簡單,創建一個 ACK 注冊集群并接入自建集群即可。
創建 ACK 注冊集群
我們只需在 ACK 容器服務控制臺創建注冊集群頁面選擇離自建 Kubernetes 集群地理位置最近的區域并配置 VPC 網絡和安全組,3 分鐘即可完成注冊集群的創建,如下圖所示。
集群詳情頁面可以看到連接信息中分別有一個用于公網接入和私網接入自建 Kubernetes 集群的集群導入代理配置,如下圖所示:
接入自建 Kubernetes 集群
在自建 Kubernetes 集群中部署上述集群導入代理配置:
$ kubectl apply -f agent.yamlagent 組件運行正常后,我們就可以在 ACK 容器服務控制臺查看集群列表,如下圖所示,名為 ack 的集群為 ACK 托管版集群,Kubernete 版本為 1.20.4-aliyun.1,名為 idc-k8s 的集群為 ACK 注冊集群,接入的是用戶自建的 Kubernetes 集群,Kubernetes版本為 1.19.4。
使用注冊集群 idc-k8s 即可管理自建 Kubernetes 集群,集群概覽信息和節點列表信息如下圖所示。
接下來,用戶就可以通過 ACK 容器服務控制臺,使用一致體驗來對云上云下集群進行集群管理、節點管理、應用管理和運維等操作。
一致體驗的安全治理
在使用不同云平臺上的 Kubernetes 集群時,不同云平臺的安全治理能力和安全策略配置及管理方式也都不盡相同,這種參差不齊的安全治理能力會導致運維團隊在定義用戶角色、訪問權限的時候都每個云平臺的安全管理機制都十分熟悉,如果管理和安全訪問控制能力不足,則非常容易出現角色違規、訪問管理風險等問題。
例如,在一個各種項目都在使用 Kubernetes 容器集群,且容器集群屬于不同的云平臺的場景下,管理員需要能夠將所有用戶和他們的活動都引導到對應的容器集群,這樣才能知道誰在什么時候做了什么,你可能會遇到有多個賬戶需要分別設置不同的訪問層級,或者有越來越多的人加入、離開、變換團隊和項目的情況,如何管理這些用戶的權限會變得越來越復雜。
ACK 注冊集群從以下幾個方面為自建 Kubernetes 集群提供安全治理能力一致性體驗。
使用阿里云主子賬號認證體系和 Kubernetes RBAC 鑒權體系管理集群訪問控制
假設當前企業內有 2 個不同工作職責的用戶,分別是開發人員 testuser01,測試人員 testuser02,那么管理員就可以為開發和測試人員創建子賬號 testuser01 和 testuser02,接下來根據開發測試人員工作職責的不同,分配 ack 集群和 idc-k8s 集群的以下權限:
-
開發人員 testuser01,授予 ack 集群所有命名空間的讀寫權限,授予 idc-k8s 集群test 命名空間的讀寫權限。
-
測試人員testuser02,只授予idc-k8s集群test命名空間的讀寫權限。
使用主賬號為開發人員 testuser01 和測試人員 testuser02 授權,在ACK容器服務控制臺授權管理中選擇對應的 testuser01 和 testuser02 子賬號,授權配置分別如下圖所示:
按照向導完成 testuser01 和 testuser02 的授權后,使用子賬號 testuser01 登錄容器服務控制臺可以測試 testuser01 對 ack 集群所有命名空間擁有讀寫權限,只對 idc-k8s 集群test命名空間擁有讀寫權限。
使用子賬號 testuser02 登錄容器服務控制臺可以測試 testuser02 看不到 ack 集群,且只對 idc-k8s 集群 test 命名空間擁有讀寫權限。
集群審計
在 Kubernetes 集群中,API Server 的審計日志可以幫助集群管理人員記錄或追溯不同用戶的日常操作,是集群安全運維中重要的環節。在注冊集群中可以使用集群審計功能幫助用戶可視化追溯不同用戶的日常操作。
下面是自建 Kubernetes 集群的日志審計示例。
配置巡檢
配置巡檢功能可以用來掃描集群中 Workload 配置的安全隱患,提供巡檢詳情和報告,對結果進行分析解讀,幫助用戶實時了解當前狀態下運行應用的配置是否有安全隱患。
下面是自建 Kubernetes 集群的巡檢詳情示例。
作者簡介
郝樹偉(流生),阿里云容器服務技術專家,云原生分布式云團隊核心成員,專注于云原生多集群的統一管理和調度、混合集群、應用交付和遷移等云原生技術的研究。
點擊下方鏈接,查看相關視頻解讀~
https://www.bilibili.com/video/BV1WU4y1c7x7/
總結
以上是生活随笔為你收集整理的互动赠书 | 云上云下K8s多集群如何实现集群管理和安全治理的一致体验?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thoughtworks 正式成为阿里云
- 下一篇: 云栖回顾|首届阿里云云原生生态合作伙伴大