Bridge to Kubernetes 的運作方式
注意
Microsoft計劃不再主動維護 Kubernetes 專案的 Bridge。 在接下來的幾個月里,我們將將項目轉換為封存狀態。 同時,專案仍可供使用和 下載。 在此期間,我們希望探索並建議社群專案,這些專案提供與 Bridge to Kubernetes 類似的優點,以供您日後使用。 如果您有問題,請在 GitHub 的問題面板上與我們連絡。
Bridge to Kubernetes 是一種反覆式開發工具,可用來製作以 Kubernetes 為目標的微服務應用程式。 Bridge to Kubernetes 延伸模組適用於 Visual Studio 和 Visual Studio Code (VS Code)。
Bridge to Kubernetes 可讓您在開發電腦上執行和偵錯程式碼。 該電腦仍會連線到包含其餘應用程式或服務的 Kubernetes 叢集。 如果您的大型微服務架構具有許多相互依存服務和資料庫,在開發電腦上複寫這些相依性可能會很困難。 針對每個程式碼變更組建程式碼,並將其部署至 Kubernetes 叢集可能會很緩慢、耗時且困難。
Bridge to Kubernetes 會在開發電腦與叢集之間建立連線。 這種方法可避免將程式碼組建和部署至叢集。 您可以在連線至叢集的環境中測試及開發服務。 這種方法可讓您直接偵錯,而不需要建立更多 Docker 或 Kubernetes 設定。
Bridge to Kubernetes 會重新導向已連線 Kubernetes 叢集與開發電腦之間的流量。 Kubernetes 叢集中的本機程式碼和服務的通訊方式與位於相同 Kubernetes 叢集中無異。
Bridge to Kubernetes 可讓您將 Kubernetes 叢集中的環境變數和裝載磁碟區複寫到您的開發電腦。 存取環境變數和裝載磁碟區可讓您直接處理程式碼,而不需要複寫這些相依性。
需求
注意
Bridge to Kubernetes 不適用於桌面版 Kubernetes 叢集的 Docker。 若要使用 Bridge to Kubernetes,您需要下列任一設定:
- 已安裝 Bridge to Kubernetes 延伸模組的 VS Code。
- 在 Windows 10 或更新版本上執行的 Visual Studio 2019 16.7 版或更新版本。 請確定已安裝 ASP.NET 和 Web 開發工作負載。 安裝 Bridge to Kubernetes 延伸模組。
您可以使用 Bridge to Kubernetes 來建立 Kubernetes 叢集的連線。 此連線會將叢集中現有 Pod 的流量重新導向至開發電腦。
注意
使用 Bridge to Kubernetes 時,系統會提示您輸入要重新導向至開發電腦的服務名稱。 此選項可輕鬆識別重新導向的 Pod。 Kubernetes 叢集與開發電腦之間的所有重新導向都是針對 Pod。 如需詳細資訊,請參閱讓服務可供使用。
在 VS Code 中,Bridge to Kubernetes 可支援所有在本機執行的語言。 在 Visual Studio 中,Bridge to Kubernetes 支援 .NET Core。 Bridge to Kubernetes 不支援 Visual Studio 中的 .NET Framework,因為該元件需要 Windows 節點支援。
警告
Bridge to Kubernetes 僅適用於開發和測試案例, 不適用於且不支援搭配使用中的生產環境叢集或即時服務使用。
如需目前的功能和未來計畫,請參閱 Bridge to Kubernetes 藍圖。
建立連線
Bridge to Kubernetes 建立叢集的連線時,將會採取下列動作:
- 提示您設定叢集上要取代的服務、程式碼在開發電腦上使用的連接埠,以及啟動程式碼的一次性動作。
- 將叢集上 Pod 中的容器取代為將流量重新導向至開發電腦的遠端代理程式容器。
- 在開發電腦上執行 kubectl 連接埠轉送,將流量從開發電腦轉送至叢集中執行的遠端代理程式。
- 使用遠端代理程式從叢集收集環境資訊。 此環境資訊包括環境變數、可見服務、磁碟區裝載和秘密裝載。
- 在 Visual Studio 中設定環境,讓開發電腦上的服務可以存取在叢集上執行時的相同變數。
- 更新 hosts 檔案,將叢集上的服務對應至開發電腦上的本機 IP 位址。 這些 hosts 檔案項目可讓開發電腦上執行的程式碼對叢集中執行的其他服務提出要求。 若要更新 hosts 檔案,Bridge to Kubernetes 需要開發電腦上的系統管理員存取權。
- 開始在開發電腦上執行程式碼並進行偵錯。 如有必要,Bridge to Kubernetes 會停止目前使用這些連接埠的服務或處理序,以便釋放開發電腦上的必要連接埠。
Azure Bridge to Kubernetes
建立叢集的連線之後,您可以在電腦上以原生方式執行並偵錯程式碼,不需要容器化。 程式碼會與您的叢集互動。 遠端代理程式接收的任何網路流量會重新導向至連線期間指定的本機連接埠。 您的原生執行程式碼可接受並處理該流量。 叢集中的環境變數、磁碟區和秘密可供開發電腦上執行的程式碼使用。
Bridge to Kubernetes 會將 hosts 檔案項目和連接埠轉送新增至開發人員電腦。 您的程式碼可以使用叢集的服務名稱,將網路流量傳送至叢集上執行的服務。 該流量會轉送至叢集中執行的服務。 在整個連線期間,您的開發電腦和叢集之間都會路由傳送流量。
此外,Bridge to Kubernetes 也支援透過 KubernetesLocalProcessConfig.yaml
檔案將可用的環境變數和裝載檔案複寫至開發電腦上叢集的 Pod。 您也可以使用此檔案來建立新的環境變數和磁碟區裝載。
注意
在叢集連線持續時間加上 15 分鐘的期間內,Bridge to Kubernetes 會執行名為 EndpointManager 的程式,並在本機電腦上具有系統管理員權限。
您可以使用多個服務平行偵錯。 請根據您要偵錯的服務啟動對應數量的 Visual Studio 執行個體。 請確定您的服務會在本機接聽不同的連接埠。 分別進行設定和偵錯。 此狀況不支援隔離。
其他設定
KubernetesLocalProcessConfig.yaml 檔案可讓您將可用的環境變數和裝載檔案複寫至叢集中的 Pod。 當您使用 Visual Studio 時,KubernetesLocalConfig.yaml 檔案必須位於服務專案檔的相同目錄中。 如需詳細資訊,請參閱設定 Bridge to Kubernetes。
使用路由功能進行隔離開發
根據預設,Bridge to Kubernetes 會將服務的所有流量重新導向至您的開發電腦。 您可以改用路由功能,只將子網域的要求重新導向至開發電腦。 這些路由功能可讓您使用 Bridge to Kubernetes 進行隔離開發,並避免中斷叢集的其他流量。
下列動畫展示兩位開發人員透過隔離處理同一個叢集:
啟用隔離作業時,Bridge to Kubernetes 會連線至 Kubernetes 叢集,另外還會執行下列動作:
- 確認 Kubernetes 叢集未啟用 Azure Dev Spaces。
- 在相同命名空間的叢集中複寫您選擇的服務,並新增 routing.visualstudio.io/route-from=SERVICE_NAME 標籤和 routing.visualstudio.io/route-on-header=kubernetes-route-as=GENERATED_NAME 註釋。
- 設定並啟動 Kubernetes 叢集上相同命名空間中的路由管理員。 在命名空間中設定路由時,路由管理員會使用標籤選取器來尋找 routing.visualstudio.io/route-from=SERVICE_NAME 標籤和 routing.visualstudio.io/route-on-header=kubernetes-route-as=GENERATED_NAME 註釋。
注意
Bridge to Kubernetes 會檢查您的 Kubernetes 叢集上是否已啟用 Azure Dev Spaces。 系統會提示您要先停用 Azure Dev Spaces,才能使用 Bridge to Kubernetes。
路由管理員會在啟動時執行下列動作:
- 複製在命名空間中找到的所有輸入,包括負載平衡器輸入,並使用 GENERATED_NAME 作為子網域。
- 針對 GENERATED_NAME 子網域複製輸入的每個關聯服務建立 Envoy Pod。
- 針對要隔離處理的服務建立另一個 Envoy Pod。 此設定可讓具有子網域的要求路由傳送至您的開發電腦。
- 設定每個 Envoy Pod 的路由規則,以處理該子網域服務的路由。
下圖顯示 Kubernetes 叢集在 Bridge to Kubernetes 連線到您叢集之前的狀態:
下圖顯示相同叢集在隔離模式啟用 Bridge to Kubernetes 的狀態。 從圖上可以看到支援路由的重複服務和 Envoy Pod 處於隔離狀態。
當叢集收到 GENERATED_NAME 子網域的要求時會將 kubernetes-route-as=GENERATED_NAME 標頭新增至要求。 Envoy Pod 會負責路由針對叢集中對應服務的要求。 針對隔離運作的服務要求,叢集會由遠端代理程式將要求重新導向至您的開發電腦。
當叢集收到非 GENERATED_NAME 子網域的要求時,便不會將標頭新增至要求。 Envoy Pod 會負責路由針對叢集中對應服務的要求。 對於正在取代的服務要求,Pod 會將其路由至原始服務,而不是遠端代理程式。
重要
叢集上的每個服務在提出其他要求時,都必須轉送 kubernetes-route-as=GENERATED_NAME 標頭。 例如,當 serviceA 收到要求時,它會先向 serviceB 提出要求,再傳回回應。 在此範例中,serviceA 必須將其要求中的 kubernetes-route-as=GENERATED_NAME 標頭轉送至 serviceB。 某些語言 (例如 ASP.NET) 可能有處理標頭傳播的方法。
當您從叢集中斷連線時,Bridge to Kubernetes 預設會移除所有 Envoy Pod 和重複的服務。
注意
路由管理員部署和服務仍會在命名空間中執行。 若要移除部署和服務,請針對您的命名空間執行下列命令。
kubectl delete deployment routingmanager-deployment -n NAMESPACE
kubectl delete service routingmanager-service -n NAMESPACE
診斷和記錄
使用 Bridge to Kubernetes 連線到叢集時,您的電腦會記錄診斷。 系統會將診斷記錄儲存在開發電腦的 TEMP 目錄中,並儲存在 Bridge to Kubernetes 資料夾中。
Kubernetes RBAC 授權
Kubernetes 提供透過角色型存取控制 (RBAC) 管理使用者和群組的權限。 如需詳細資訊,請參閱 Kubernetes 文件。 您可以建立 YAML 檔案,並使用 kubectl
將其套用至叢集以設定已啟用 RBAC 的叢集權限。
若要設定叢集的權限,請建立或修改 YAML 檔案,例如 permissions.yml。 針對 <namespace>
和需要存取的使用者和群組使用您的命名空間。
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: bridgetokubernetes-<namespace>
namespace: development
subjects:
- kind: User
name: jane.w6wn8.k8s.ginger.eu-central-1.aws.gigantic.io
apiGroup: rbac.authorization.k8s.io
- kind: Group
name: dev-admin
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
使用下列命令來套用權限:
kubectl -n <namespace> apply -f <yaml file name>
限制
Bridge to Kubernetes 有下列限制:
- Pod 中只能執行單一容器,Bridge to Kubernetes 才能成功連線至該 Pod。
- 目前,Bridge to Kubernetes Pod 必須是 Linux 容器, 不支援 Windows 容器。
- 為了編輯主機檔案,Bridge to Kubernetes 需要較高的權限,才能在開發電腦上執行。
- Bridge to Kubernetes 無法在已啟用 Azure Dev Spaces 的叢集上使用。
下一步
若要開始使用 Bridge to Kubernetes 將您的本機開發電腦連線至叢集,請參閱使用 Bridge to Kubernetes (VS) 或使用 Bridge to Kubernetes (VS Code)。