Bridge to Kubernetes 的運作方式

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

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

橋接至 Kubernetes 會在開發電腦與叢集之間建立連線。 這種方法可避免必須建置程式碼並將其部署至叢集。 您可以在連線到叢集的內容中測試及開發服務。 此方法可讓您偵錯,而不需要建立更多 Docker 或 Kubernetes 組態。

橋接器至 Kubernetes 會將已連線 Kubernetes 叢集與開發電腦之間的流量重新導向。 Kubernetes 叢集中的本機程式碼和服務可以像在相同的 Kubernetes 叢集中一樣進行通訊。

橋接至 Kubernetes 可讓您將 Kubernetes 叢集中的環境變數和掛接磁片區複寫到開發電腦。 存取環境變數和掛接的磁片區可讓您在程式碼上工作,而不需要複寫這些相依性。

規格需求

若要使用 Bridge to Kubernetes,您需要下列其中一個設定:

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

注意

使用 Bridge to Kubernetes 時,系統會提示您輸入服務名稱,以重新導向至您的開發電腦。 此選項是識別重新導向 Pod 的便利方式。 Kubernetes 叢集與開發電腦之間的所有重新導向都是針對 Pod。 如需詳細資訊,請參閱 提供服務

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

警告

橋接至 Kubernetes 僅適用于開發和測試案例。 它不適合或支援搭配使用中的生產叢集或即時服務使用。

如需目前的功能和未來方案,請參閱 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 進行隔離開發,並避免中斷叢集中的其他流量。

下列動畫顯示兩位開發人員在隔離的相同叢集上工作:

Animation shows isolation, with two developers working with the same cluster.

當您啟用隔離運作時,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 批註。

注意

橋接至 Kubernetes 會檢查 Kubernetes 叢集上是否已啟用 Azure Dev Spaces。 它會提示您停用 Azure Dev Spaces,才能使用 Bridge to Kubernetes。

路由管理員會在啟動時執行下列動作:

  • 使用子域 的 GENERATED_NAME ,複製命名空間中找到的所有輸入,包括負載平衡器輸入。
  • 針對與重複輸入相關聯的每個服務,使用 GENERATED_NAME 子域建立 Envoy Pod。
  • 為您要隔離的服務建立另一個 Envoy Pod。 此設定可讓具有子域的要求路由傳送至您的開發電腦。
  • 設定每個 Envoy Pod 的路由規則,以處理具有子域之服務的路由。

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

Diagram of cluster without Bridge to Kubernetes.

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

Diagram of cluster with Bridge to Kubernetes enabled.

當叢集收到具有 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 可能只有在該 Pod 中執行的單一容器,以便 Bridge to Kubernetes 成功連線。
  • 目前,Bridge to Kubernetes Pod 必須是 Linux 容器。 不支援 Windows 容器。
  • 橋接至 Kubernetes 需要提高的許可權,才能在開發電腦上執行,才能編輯主機檔案。
  • 無法將 Bridge to Kubernetes 用於已啟用 Azure Dev Spaces 的叢集上。

後續步驟

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