解決ExpressRoute下agentserviceapi.guestconfiguration.azure.com無法連線造成azcmagent連線失敗

解決ExpressRoute下agentserviceapi.guestconfiguration.azure.com無法連線造成azcmagent連線失敗

前篇(07)(08)提到,不論在 Windows 或 Linux 之下,我們最終都會碰到 AZCM0026: Network Error 錯誤,從錯誤訊息及測試得知 agentserviceapi.guestconfiguration.azure.com 這個端點無法正常連線。

PS C:\> & "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe" connect --service-principal-id "$ServicePrincipalId" --service-principal-secret "$ServicePrincipalClientSecret" --resource-group "$env:RESOURCE_GROUP" --tenant-id "$env:TENANT_ID" --location "$env:LOCATION" --subscription-id "$env:SUBSCRIPTION_ID" --cloud "$env:CLOUD" --correlation-id "$env:CORRELATION_ID";
INFO    Connecting machine to Azure... This might take a few minutes.
INFO    Testing connectivity to endpoints that are needed to connect to Azure... This might take a few minutes.
INFO    Exit Code:  AZCM0026: Network Error
INFO    For troubleshooting, see https://aka.ms/arc/azcmerror
FATAL   required endpoints unavailable: https://agentserviceapi.guestconfiguration.azure.com

將Azure ExpressRoute with Microsoft Peering環境下Linux VM加入Azure Arc管理清單

將Azure ExpressRoute with Microsoft Peering環境下Linux VM加入Azure Arc管理清單

接續 ExpressRoute with Microsoft Peering with Windows第一次 PoC 成功之後,這裡要繼續研究如何在 Azure ExpressRoute + Microsoft Peering 環境將 Linux VM 加入 Azure Arc 管理清單。一樣分析官方提供的 Shell 指令碼,發現麻煩的一件事,以我們 Linux 環境來說明。我們採用 Ubuntu 22.04,因此 Shell 指令碼協助設定 APT 的下載點,然後,透過 APT 來進行安裝 azcmagent 套件。

將Azure ExpressRoute with Microsoft Peering環境下的Windows VM加入Azure Arc管理清單

將Azure ExpressRoute with Microsoft Peering環境下的Windows VM加入Azure Arc管理清單

我們公司是混合雲架構,採用 Azure ExpressRoute 來進行「地與雲之間安全的連線」,這在此 Blog 提到多次。

ExpressRoute connection overview

從圖來看,Azure ExpressRoute 本身還有兩種選擇,採用 Microsoft Peering 與 Private Peering,差異細節不是這裡的重點,就先跳過。簡單以安全性來說,Microsoft Peering 安全性高於 Private Peering,因此我們選擇 Microsoft Peering 線路架構來實踐。你可以把 Microsoft Peering 想成一個完全黑箱,中間的線路沒有第三者碰得到,而且能存取內容也僅是微軟官方的雲服務(Microsoft 365、Azure Public Service等),A 存取 B 服務,僅此而已,沒了。

前面,我們花了很多功夫進行各類型的 Azure Arc 整合的 PoC。但進入到企業實際內部發現,原本來 PoC 無法實行。以「如何在Azure Arc加入多台地端VM伺服器」為例,它為 Windows 提供的 PowerShell ,我們在跑安裝指令碼的過程是會去下載外部資源。

如何將地端Kubernets叢集加入Azure Arc,以 Kubeadm 建立的Kubernetes叢集為例

如何將地端Kubernets叢集加入Azure Arc,以 Kubeadm 建立的Kubernetes叢集為例

前面我們利用 Kind 及 MicroK8s 來架設 Kubernetes 叢集,以驗證地端 Kubernetes 叢集與 Azure Arc 的整合,過程也還算順利。接下來,我在同一台 Surface Pro 主機上採用 Hyper-V 並利用Kubeadm 架設的 Kubernetes 叢集來進行再次驗證。當然,有這一篇的出現,代表過程有問題的出現。

$ kubectl get nodes -o wide
NAME     STATUS     ROLES           AGE    VERSION    INTERNAL-IP      EXTERNAL-IP   OS-IMAGE                                    KERNEL-VERSION      CONTAINER-RUNTIME
lnode    Ready      control-plane   111d   v1.26.5    192.168.8.150    <none>        Ubuntu 22.04.2 LTS                          5.15.0-88-generic   containerd://1.6.21
lnode2   Ready      <none>          2d5h   v1.26.11   192.168.8.153    <none>        Ubuntu 22.04.3 LTS                          5.15.0-88-generic   containerd://1.6.24

原生 Kubernetes 的設定步驟均和 MicroK8s 一樣。不過進行到 az connectedk8s connect 步驟時,我得到不一樣的結果:

如何將地端Kubernets叢集加入Azure Arc,以MicroK8s叢集為例

如何將地端Kubernets叢集加入Azure Arc,以MicroK8s叢集為例

首先當然是要準備好 MicroK8s 叢集

$ kubectl get nodes -o wide
NAME   STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
wk8s   Ready    <none>   14h   v1.28.3   192.168.8.184   <none>        Ubuntu 22.04.3 LTS   5.15.0-89-generic   containerd://1.6.15
mk8s   Ready    <none>   14h   v1.28.3   192.168.8.182   <none>        Ubuntu 22.04.3 LTS   5.15.0-89-generic   containerd://1.6.15