Anthos clusters on Azure 小記
OS: container with openSUSE Leap 15.4
Todo
升級 3 大平台工具 container
嘗試使用 terraform
今天來測試 Anthos cluster on Azure
首先參考官方文件
確認滿足相關準備工作
==== Google Cloud CLI ====
檢查 CLI 版本是否有高於 402
我的 CLI 環境是在容器內, 請見 https://sakananote2.blogspot.com/2022/10/gcloud-4060-aws-cli-285-ansible-21112.html
# gcloud version
Google Cloud SDK 412.0.0
bq 2.0.83
bundled-python3-unix 3.9.12
core 2022.12.09
gcloud-crc32c 1.0.0
gke-gcloud-auth-plugin 0.4.0
gsutil 5.17
kubectl 1.23.14
安裝 kubectl
# gcloud components install kubectl
驗證是否安裝 kubectl
# kubectl version
確認有相關身份驗證
這邊可以使用以下指令確認有沒有身份認証
# gcloud auth list
如果沒有的話, 請執行以下指令進行驗證
# gcloud auth login
啟用相關 API
啟用之前可以先到專案觀察相關 API
登入 GCP console
點選 選單 -- > APIs & Services
觀察 Enabled APIs 的數量
觀察相關 Library
點選 選單 -- > APIs & Services -- > Library
嘗試搜尋 gke 這個關鍵字
接下來使用官方提供的指令進行啟用 API
# gcloud services enable gkemulticloud.googleapis.com --project YOUR_PROJECT
# gcloud services enable gkeconnect.googleapis.com --project YOUR_PROJECT
# gcloud services enable connectgateway.googleapis.com --project YOUR_PROJECT
# gcloud services enable cloudresourcemanager.googleapis.com --project YOUR_PROJECT
# gcloud services enable anthos.googleapis.com --project YOUR_PROJECT
# gcloud services enable logging.googleapis.com --project YOUR_PROJECT
# gcloud services enable monitoring.googleapis.com --project YOUR_PROJECT
如果沒有啟用過該 API, 應該會出現 Operation "operations/acat.p2-9064xxxx3606-9313xxxx-2bff-407a-a807-7e6b672bxxxx" finished successfully.
請將 YOUR_PROJECT 換成自己的專案
啟用之後就會發現 Enabled APIs 的數量增加了
==== Azure CLI ====
因為現在容器那邊的 az cli 有些問題, 這個部份我是用我實體機器的 az cli, 可以參考我之前的文章安裝 Azure cli
確認有安裝 Azure CLI
> az version
{
"azure-cli": "2.38.0",
"azure-cli-core": "2.38.0",
"azure-cli-telemetry": "1.0.6",
"extensions": {
"resource-graph": "1.0.0"
}
}
如果要升級 az 指令的話可以使用 az upgrade 指令升級
透過 # az account show 確認是否有身份驗證
如果還沒有身份驗證, 使用下列指令登入
# az login
==== 配置 Azure 虛擬網路 / 創建 Azure 資源組 ====
準備工作的 創建 Azure 資源組 ( Resource Group ) 與 創建虛擬網路 可以一起執行
建立新的 Resource Group
> az group create --name "anthos_test_2023" --location "japaneast"
這邊的 location 名稱是 azure 的位置
另外也要參考官方提到的支持的 Regions https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/reference/supported-regions , 以 Azure japaneast 來說對應是 Google 的 asia-northeast2
這次碰到 Azure 一個很貼心的地方, 就是我的 token 雖然在有效期間內, 但是因為在 90 天這個 token 沒有被使用, 所以就先停用, 要先透過 az login --scope https://management.core.windows.net//.default 的方式來重新啟用驗證, 這樣安全性增加不少
建立新的虛擬網路
> az network vnet create \
--name "anthostest-vnet" \
--location "japaneast" \
--resource-group "anthos_test_2023" \
--address-prefixes 10.0.0.0/16 \
--subnet-name default
虛擬網路的名稱可以自訂, 這邊以 anthostest-vnet 為例
location 與 resource group 請與上面相同
子網路名稱可以自訂, IP 地址的前綴也可以自訂, 這邊以 10.0.0.0/16 為例, 會建立 anthostest-vnet 的虛擬網路 位址空間 10.0.0.0/16, 子網路為 default, 位址空間為 10.0.0.0/24
網路的前綴, 建議也參考 Google 另外一份文件, 建立 Cluster 選擇 CIDR 的說明
https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/how-to/create-cluster
後續 Pod 網路與 Service 不能重疊, 官方建議可以使用 RFC 6958 的 100.64.0.0/10 範圍, 或是自訂的範圍
> az network public-ip create \
--name "anthos-nat-gw-ip" \
--location "japaneast" \
--resource-group "anthos_test_2023" \
--allocation-method Static \
--sku Standard
> az network nat gateway create \
--name "anthos-nat-gw" \
--location "japaneast" \
--resource-group "anthos_test_2023" \
--public-ip-addresses "anthos-nat-gw-ip" \
--idle-timeout 10
> az network vnet subnet update \
--name default \
--vnet-name "anthostest-vnet" \
--resource-group "anthos_test_2023" \
--nat-gateway "anthos-nat-gw"
Notes
沒有使用 Azure NAT Gateway, Health Check 會失敗
==== 建立 Azure Active Directory 服務帳號 ====
建立應用程式註冊
> az ad app create --display-name anthos-test-20230126
這邊的名稱, 個人喜歡加上建立日期, 名稱可以自訂
建立完成之後可以到 Azure AAD 的 應用程式註冊 觀察
或是使用指令方式觀察
> az ad app list --output table
Console 上面的 應用程式(用戶端)識別碼, 或是 az 指令輸出的 AppId 就是文件上面的 APPLICATION_ID
也可以用指令撈出來
az ad app list --all \
--query "[?displayName=='anthos-test-20230126'].appId" \
--output tsv
displayName 請換成自己的 :)
建立服務主帳號
> az ad sp create --id "YOUR_APPLICATION_ID"
請使用之前建立出來的 AppId 來填入
可以使用 az ad sp list 配合 --all 以及 --display-name 來確認是否建立成功
> az ad sp list --output table --all --display-name ant
DisplayName Id AppId CreatedDateTime
-------------------- ------------------------------------ ------------------------------------ --------------------
anthos-test-20230126 d8b67939-xxxx-4d49-xxxx-7d0f2e63xxxx 0656xxxx-f3f5-xxxx-8c13-f71ed3cxxxx7 2022-10-23T06:42:47Z
或是觀察 Console
應用程式註冊內, 剛剛建立的 anthos-test-20230126 內容, 本機目錄受控的應用程式是否有對應? 如果沒有, 會顯示建立服務主體
==== 建立 Azure 角色分配 ====
要進行 Azure 角色分配 ( Role ), 需要下列資訊
APPLICATION_ID
就是剛剛應用程式的 appId
> az ad app list --output table 來觀察
或 > az ad app list --all --query "[?displayName=='anthos-test-20230126'].appId" --output tsv
SERVICE_PRINCIPAL_ID
剛剛建立的服務主帳號 id
這個部份官方文件應該有誤, 他的 query 方式是 "[?displayName=='APPLICATION_NAME'].{objectId:objectId}" , 事實上透過 > az ad sp list --all --query "[?displayName=='anthos-test-20230126']" 來看整個資料的輸出, 該欄位應該是 id , 而非 objectId
> az ad sp list --all --query "[?displayName=='anthos-test-20230126'].{objectId:id}" --output tsv 或是觀察 console 上面, 應用程式註冊內, 剛剛建立的 anthos-test-20230126 內容的本機目錄中的受控的應用程式 (SP) 裡面的 物件識別碼
SUBSCRIPTION_ID
訂閱的 ID
> az account show --query "id" --output tsv
這邊是以在訂閱這邊設定角色為例, 之前在測試 Azure Grafana 的時候, 也有相關指令可以參考
建立 3 個 role, Contributor、User Access Administrator 和 Key Vault Administrator 角色
其實只是需要 SERVICE_PRINCIPAL_ID 與 SUBSCRIPTION_ID :p
建立指令如下
> az role assignment create \
--role "Contributor" \
--assignee "SERVICE_PRINCIPAL_ID" \
--scope "/subscriptions/SUBSCRIPTION_ID"
> az role assignment create \
--role "User Access Administrator" \
--assignee "SERVICE_PRINCIPAL_ID" \
--scope "/subscriptions/SUBSCRIPTION_ID"
> az role assignment create \
--role "Key Vault Administrator" \
--assignee "SERVICE_PRINCIPAL_ID" \
--scope "/subscriptions/SUBSCRIPTION_ID"
請替換成自己的 SERVICE_PRINCIPAL_ID 與 SUBSCRIPTION_ID
建立完成, 可以到 Console 上面
到該訂用帳戶 -- > 存取控制 ( IAM ) -- > 角色指派 上面去觀察是否有該 SP
參與者 ( Contributor )
Key Vault 系統管理員 ( Key Vault Administrator)
使用者存取系統管理員 ( User Access Administrator )
==== 建立 客戶端證書 ====
要建立 Azure Client 需要下列資訊
SUBSCRIPTION_ID
訂閱的 ID
> az account show --query "id" --output tsv
APPLICATION_ID
就是剛剛應用程式的 appId
> az ad app list --output table 來觀察
或 > az ad app list --all --query "[?displayName=='anthos-test-20230126'].appId" --output tsv
TENANT_ID
我自己是喜歡直接使用 > az account show 去觀察 tenantId
官方文件是用 az account list --query "[?id=='${SUBSCRIPTION_ID}'].{tenantId:tenantId}" --output tsv
請替換成自己的 SUBSCRIPTION_ID
建立 AzureClient
# gcloud container azure clients create anthos-azure-japaneast --location=asia-northeast2 --tenant-id="YOUR_TENANT_ID" --application-id="YOUR_APPLICATION_ID" --project YOUR_PROJECT
location 的部份沒有 asia-east1, 參考支持的區域 https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/reference/supported-regions
請替換自己的 TENANT_ID 與 APPLICATION_ID
如果 project ID 已經有預設就不一定要加上去
觀察是否有建立
# gcloud container azure clients list --location asia-northeast2 --project YOUR_PROJECT
如果要刪除可以用以下指令
gcloud container azure clients delete anthos-azure-japaneast --location=asia-northeast2 --project YOUR_PROJECT
接下來要將憑證上傳到 Azure AD 剛剛註冊的應用程式
因為是憑證的關係, 所以真的會利用變數來傳入了 :)
> CERT=$(gcloud container azure clients get-public-cert --location=asia-northeast2 anthos-azure-japaneast --project YOUR_PROJECT )
location 請替換你的 Google 區域
client 名稱請換成自己的名稱
如果 project ID 已經有預設就不一定要加上去
觀察輸出
> echo $CERT
> az ad app credential reset --id "YOUR_APPLICATION_ID" --cert "${CERT}" --append
上傳完成, 可以到 Azure Console 該應用程式的 憑證及祕密的 憑證觀察
==== 建立 SSH 金鑰對 ====
使用 ssh-keygen 指令建立金鑰
> ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/anthos-multicloud-key -N ""
會在家目錄底下建立 anthos-multicloud-key 與 anthos-multicloud-key.pub
金鑰要不要加上 passphrase 保護看自己
==== 建立 Cluster ====
建立 cluster 參考
https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/deploy-app
https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/how-to/create-cluster#cidr_ranges
查詢 Resource Group ID
> az group show --output tsv --query id --resource-group anthos_test_2023
設定變數
> CLUSTER_RESOURCE_GROUP_ID=$(az group show --output tsv --query id --resource-group anthos_test_2023)
確認資訊
> echo $CLUSTER_RESOURCE_GROUP_ID
設定變數
> VNET_ID=$(az network vnet show --output tsv --resource-group anthos_test_2023 --query id --name anthostest-vnet)
確認資訊
> echo $VNET_ID
> SUBNET_ID=$(az network vnet subnet show --query id --output tsv \
--resource-group anthos_test_2023 \
--vnet-name anthostest-vnet \
--name default)
確認資訊
> echo $SUBNET_ID
設定變數
> AZURE_REGION=japaneast
確認資訊
> echo $AZURE_REGION
設定變數
> FLEET_PROJECT_ID=YOU_PROJECT
請換成自己 Project 的 ID
> CLIENT_NAME=anthos-azure-japaneast
> SSH_PUBLIC_KEY=$(cat ~/.ssh/anthos-multicloud-key.pub)
請對應到實際 public key 的位置
gcloud container azure clusters create azure-cluster-0 \
--location asia-northeast2 \
--cluster-version 1.24.5-gke.200 \
--azure-region japaneast \
--fleet-project YOU_PROJECT \
--client anthos-azure-japaneast \
--resource-group-id $CLUSTER_RESOURCE_GROUP_ID \
--vnet-id $VNET_ID \
--subnet-id $SUBNET_ID \
--pod-address-cidr-blocks 10.2.0.0/18 \
--service-address-cidr-blocks 10.1.0.0/24 \
--ssh-public-key "$SSH_PUBLIC_KEY" \
--vm-size Standard_B2ms \
--tags "google:gkemulticloud:cluster=azure-cluster-0" --project YOU_PROJECT
fleet-project 請對應到自己的 project ID
建議可以先用 > az vm list-skus -l japaneast -r virtualMachines -o table 確認有該機器可用, 不然可能會遇到資源不足 error
沒有使用 NAT Gateway 換了 pod 與 service address CIDR 還是失敗, 但是訊息變成 Operation failed, 卡在 Health Check
之前有規範 Pod 使用 100.65.0.0/16 , Service 使用 100.66.0.0/16 失敗, 之後再來測試
列出 Cluster 資訊
> gcloud container azure clusters list --location asia-northeast2 --project YOU_PROJECT
如果要刪除 Cluster 可以用下列指令
> gcloud container azure clusters delete azure-cluster-0 --location asia-northeast2 --project YOU_PROJECT
azure-cluster-0 請對應到要刪除的 cluster 名稱
可以到 GCP Anthos 的 Cluster 觀察資訊
建立 Node Pool ( 使用 VMSS )
> gcloud container azure node-pools create pool-0 \
--cluster azure-cluster-0 \
--location asia-northeast2 \
--node-version 1.24.5-gke.200 \
--vm-size Standard_B2s \
--max-pods-per-node 110 \
--min-nodes 1 \
--max-nodes 5 \
--ssh-public-key "$SSH_PUBLIC_KEY" \
--subnet-id $SUBNET_ID \
--tags "google:gkemulticloud:cluster=azure-cluster-0" --project YOU_PROJECT
VM size / min-node / max-node 請依照需求更改
請將 project ID 換成自己的
觀察 Azure VMSS 建立完成
GCP 上面的 Anthos Cluster 狀態改為 login
觀察相關資訊
gcloud container azure node-pools list --location asia-northeast2 --cluster azure-cluster-0 --project YOU_PROJECT
gcloud container azure node-pools describe pool-0 \
--cluster azure-cluster-0 \
--location asia-northeast2 --project YOU_PROJECT
點選 azure-cluster-0 Status 的圖示
點選 LOG IN
選取登入的方式
點選 Use your Google identity to log-in
點選 LOGIN
這個時候就發現 Status 就正常了
同時這個 Cluster 也會出現在 GKE 的 Cluster 列表內
接下來就是取得 authentication credentials
> gcloud container azure clusters get-credentials azure-cluster-0 --location asia-northeast2 --project YOU_PROJECT
相關的 credentials 會被整合到目前的 ~/.kube/config
下個簡單的指令來驗證
> kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-fnahzzytjbfa-np-tjd6ttygv5da-vmss000000 Ready <none> 18d v1.24.5-gke.200
建立一個 deployment 測試
> kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
> kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
hello-server 1/1 1 1 71s
將剛剛的 deployment export 出去
> kubectl expose deployment hello-server --type LoadBalancer --port 80 --target-port 8080
service/hello-server exposed
確認資訊
> kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-server LoadBalancer 10.1.0.54 YOUR_PUBLIC_IP 80:30898/TCP 95s
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 18d
開啟瀏覽器測試 http://YOUR_PUBLIC_IP
可以在 GCP console 上面觀察 Service
我們剛剛 export 出去的 Service Type 是 LoadBalancer, 所以其實連結的是 Azure 那邊的負載平衡器, 如果在 GCP 這邊是看不到的
而是對應到 Azure 的 負載平衡器
又朝 Kubernetes 更進一步
~ enjoy it
補充: 刪除相關資源
> gcloud container azure node-pools delete pool-0 --cluster azure-cluster-0 --location asia-northeast2 --project YOU_PROJECT
> gcloud container azure clusters delete azure-cluster-0 --location asia-northeast2 --project YOU_PROJECT
官方文件只有上面這兩個步驟, 但是實際觀察 Resource Group 其實還有以下兩個資源, 也要手動刪除
Public IP
NAT Gateway
刪除順序要反過來
> az network vnet subnet update \
--name default \
--vnet-name "anthostest-vnet" \
--resource-group "anthos_test_2023" \
--nat-gateway ""
參考官方文件, --nat-gateway 為 null 就是停用
> az network nat gateway delete \
--name "anthos-nat-gw" \
--resource-group "anthos_test_2023"
> az network public-ip delete \
--name "anthos-nat-gw-ip" \
--resource-group "anthos_test_2023"
這樣才算是清除乾淨 :)
Reference
Microfusion - Feng 協力
https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/deploy-app
https://cloud.google.com/anthos/clusters/docs/multi-cloud/azure/how-to/prerequisites
https://sakananote2.blogspot.com/2022/10/gcloud-4060-aws-cli-285-ansible-21112.html
https://sakananote2.blogspot.com/2022/09/azure-cli-service-principal-grafana.html
Todo
Azure NAT Gateway 與 cluster control planes 對應關係還要研究
Authorize Cloud Logging / Cloud Monitoring 還要研究
沒有留言:
張貼留言