Bridge to Kubernetes 的運作方式

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

下列動畫展示兩位開發人員透過隔離處理同一個叢集:

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 註釋。

注意

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 連線到您叢集之前的狀態:

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 中只能執行單一容器,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)