共用方式為


Bridge to Kubernetes 的運作方式

注意

Bridge to Kubernetes 將於 2025 年 4 月 30 日淘汰。 如需淘汰和開放原始碼替代方案的詳細資訊,請參閱 GitHub 問題

Bridge to Kubernetes 是一種反覆的開發工具,可用來撰寫以 Kubernetes 為目標的微服務應用程式。 適用於 Visual Studio 和 Visual Studio Code (VS Code) 的 Bridge to Kubernetes 擴充功能。

Bridge to Kubernetes 可讓您在開發電腦上執行和偵錯程式代碼。 該計算機仍會與其餘的應用程式或服務連線到 Kubernetes 叢集。 如果您有具有許多相互依存服務和資料庫的大型微服務架構,在開發計算機上復寫這些相依性可能會很困難。 針對每個程式代碼變更,建置程式代碼並將其部署至 Kubernetes 叢集可能會很慢、耗時且困難。

Bridge to Kubernetes 會建立開發電腦與叢集之間的連線。 這種方法可避免將程式代碼建置和部署至叢集。 您可以在與叢集相連的環境中測試及開發您的服務。 這種方法可讓您偵錯,而不需要建立更多 Docker 或 Kubernetes 組態。

Bridge to Kubernetes 將流量從你已連線的 Kubernetes 叢集重新導向至你的開發電腦。 Kubernetes 叢集中的本機程式代碼和服務可以像在相同的 Kubernetes 叢集中一樣進行通訊。

Bridge to Kubernetes 可讓您將 Kubernetes 叢集中的環境變數和掛接磁碟區復寫到您的開發電腦。 存取環境變數和掛接的磁碟區可讓您處理程序代碼,而不需要復寫這些相依性。

要求

注意

Kubernetes 橋接無法在 Docker for Desktop 的 Kubernetes 叢集中運作。 若要使用 Bridge to Kubernetes,您需要下列任一組態:

您可以使用 Bridge to Kubernetes 來建立 Kubernetes 叢集的連線。 此連線會將叢集中現有 Pod 的流量重新導向往返您的開發電腦。

注意

使用 Bridge to Kubernetes 時,系統會提示您輸入服務名稱以重新導向至您的開發計算機。 此選項是一種方便的方法來選定一個 Pod 以進行重新導向。 Kubernetes 叢集與開發電腦之間的所有重新導向都是針對 Pod 的。 如需詳細資訊,請參閱 提供服務的相關步驟

在 VS Code 中,橋接至 Kubernetes 只要您可以在本機執行,即可支援所有語言。 在 Visual Studio 中,Bridge to Kubernetes 支援 .NET Core。 Kubernetes 橋接器在 Visual Studio 中不支援 .NET Framework,因為它需要 Windows 節點的支援。

謹慎

Bridge to Kubernetes 僅適用於開發和測試案例。 它不適用於或支援搭配使用中的生產叢集或即時服務使用。

如需目前的功能和未來方案,請參閱 Bridge to Kubernetes 藍圖。

建立連線

當 Bridge to Kubernetes 建立叢集的連線時,它會採取下列動作:

  • 提示您配置服務以在叢集中替換某項目、在開發計算機上使用的程式代碼端口,以及針對程式代碼設置一次性啟動任務。
  • 將叢集中的 Pod 容器替換為遠端代理容器,該容器會將流量重新導向至您的開發電腦。
  • 在開發電腦上執行 kubectl 埠轉送,將流量從開發電腦轉送至叢集中執行的遠端代理程式。
  • 使用遠端代理程式從叢集收集環境資訊。 此環境資訊包括環境變數、可見服務、磁碟區掛接和秘密掛接。
  • 在 Visual Studio 中設定環境,讓開發電腦上的服務可以存取與叢集上執行相同的變數。
  • 更新 主機 檔案,將叢集上的服務對應至開發電腦上的本機IP位址。 這些 主機 檔案條目允許在開發電腦上執行的程式碼向叢集中運行的其他服務發出請求。 若要更新 主機 檔案,Bridge to Kubernetes 需要開發計算機上的系統管理員存取權。
  • 開始在開發電腦上執行程式代碼並進行偵錯。 如有必要,Bridge to Kubernetes 會停止目前使用這些埠的服務或進程,釋放開發計算機上的必要埠。

使用 Bridge to Kubernetes

在您建立叢集的連線之後,請在計算機上以原生方式執行並偵錯程序代碼,而不需要容器化。 程序代碼會與您的叢集互動。 遠端代理程式接收的任何網路流量會重新導向至連線期間指定的本機埠。 您的原生執行程序代碼可以接受並處理該流量。 叢集中的環境變數、磁碟區和機密可供在開發計算機上執行的程式碼使用。

Bridge to Kubernetes 會將 在主機檔案中新增 條目,並在開發人員的計算機上進行埠轉送。 您的程式代碼可以使用叢集的服務名稱,將網路流量傳送至叢集上執行的服務。 該流量會轉送至您叢集中正在執行的服務。 在您連線的整個過程中,您的開發電腦和叢集之間的流量會被路由傳送。

此外,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 進行隔離開發,並避免中斷叢集中的其他流量。

下列動畫顯示兩位在隔離中處理相同叢集的開發人員:

動畫顯示隔離,兩位開發人員使用相同的叢集。

當您啟用隔離運作時,除了連線到 Kubernetes 叢集之外,Bridge to 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,複製命名空間中找到的所有輸入,包括負載平衡器輸入。
  • 針對與重複輸入相關聯的每個服務建立 envoy Pod 與 GENERATED_NAME 子域。
  • 為您要隔離處理的服務建立另一個 Envoy Pod。 此設定可讓具有子域的要求傳送至您的開發電腦。
  • 設定每個 Envoy Pod 的路由規則,以處理具有子域之服務的路由。

下圖顯示 Kubernetes 叢集在 Bridge to Kubernetes 連線到您的叢集之前:

未使用 Kubernetes 橋接的叢集圖表。

下圖顯示以隔離模式啟用 Bridge to Kubernetes 的相同叢集。 在這裡,您可以看到用於支持隔離路由的複製服務和 Envoy pod。

已啟用 Bridge 至 Kubernetes 的叢集圖表。

當叢集收到具有 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,可能會有處理標頭傳播的方法。

當您從叢集中斷連線時,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 可能只有在該 Pod 中執行的單一容器,讓 Bridge to Kubernetes 成功連線。
  • 目前,Bridge to Kubernetes Pod 必須是Linux容器。 不支援 Windows 容器。
  • Bridge to Kubernetes 需要取得更高的許可權,才能在開發電腦上執行並編輯 hosts 檔案。
  • 橋接 Kubernetes 無法在已啟用 Azure Dev Spaces 的叢集上使用。

後續步驟

若要開始使用 Bridge to Kubernetes 將本機開發電腦連線至叢集,請參閱 使用 Bridge to Kubernetes(VS)使用 Bridge to Kubernetes(VS Code)