如何提供domain-name給azure僅提供ip-address的服務

如何提供Domain Name給Azure僅提供IP Address的服務

我知道,這個題目很奇怪。原因來自於一場週未神奇的Debug之旅。

週末我們進行系統更新,其中包含了Kubernetes叢集。測試區很正常的更新完成,但正式區有個系統,在更新之後不正常,在 kubectl看來Pod、Service都很正常,但就是會產生連線錯誤。查了好幾個小時,終於發現是核心calico-apiserver有問題,根本跟原本的Pod與Service無關。因為是Calico的問題,造成內部網路的運作不正常,心想,正式區又是核心網路,怎麼會出事呢?

我心都涼了。

又經過一段時間的排查,我快吐血了,因為我們的Kubernetes叢集(更正確的說是containerd)會透過Proxy去拉Base Image,就在下午2:58的時間,我們架設在Azure ACI的Proxy莫名被重建,除了重建之外,連IP Address都被換了。

Azure ACI auto restart
  • IP Address被換了!
  • IP Address被換了!
  • IP Address被換了!

結果就是,正式區因為重啟之後拉不到Base Image,結果它的calico-apiserver壞了,時間點就是那麼剛好。(我要去買樂透!)

你會問,怎麼不用domain呢?目前Azure ACI就是一個只有IP Address沒有domain的服務(這問題在我,往下看就知道)

透過Azure CLI重建含domain name的Azure ACI

一開始,我是選擇從UI介面去建立Azure ACI服務,但UI的下一步下一步太方便也不好,以致於預設空白(或者說,預設能含空白還能下一步)的東西就沒設定到。也就是說,Azure ACI預設情境下是建立無domain name的Azure ACI服務。

我們改用Azure CLI來建立Azure ACI:

az container create --resource-group FELab --name kkproxy2 --image kk???.azurecr.io/myproxy:latest --registry-username kk??? --registry-password mypassword --dns-name-label kkproxy2 --ports 3128 --environment-variables TZ=UTC

這裡我會去Azure ACR去拉Image,因此需要有Azure ACR的帳密。而要指定domain name,只需要透過--dns-name-label去指定即可。一小段時間等資源建立之後,可以查UI,也可以透過Azure CLI指令查詢:

az container show --resource-group FELab --name kkproxy2 --query "{FQDN:ipAddress.fqdn,ProvisioningState:provisioningState}" --out table
FQDN                                 ProvisioningState
-----------------------------------  -------------------
kkproxy2.eastasia.azurecontainer.io  Succeeded

這個domain name與IP address是由Azure所管理的,當IP address有變時,它會自己去更新相對應的DNS Record。也就不怕服務被突然重建,然後IP address也被換掉的問題了。重建治百病,哈哈哈。

參考:

設定Azure DNS - A Record

如果不方便立即進行重建與切換,那麼可以透過在DNS加一筆A Record來解決。

無痛轉移代管或自管DNS至世界級的AZURE DNS

Azure DNS - Add A Record

我自己是使用Azure DNS,這沒有技術成分,大家自己設一下你們的DNS,這樣只解了50%的問題。雖然現在我們可以改由domain name來存取,但Azure ACI服務重建時,它換IP Address怎麼辦?你有domain name還是會掛呀,還是需要手動去更新DNS Record。這樣的方便性只有50%。因此,還是早早重建有domain name的服務吧。

小結

UI方便歸方便,但這種domain name與IP address的問題,真的只有被爆到你才會知道痛。真的要用到上線的服務,還是乖乖查一下CLI,把你需要的參數、資料整理清楚來建立服務比較好。透過CLI提供的選項通常比UI上完整,如果你問我,Azure ACI的UI要去那裡填才會有domain name。我會回答,到寫完這篇文章,我還不知道,我也不想查,因為它查起來用起來也不會比下--dns-name-label kkproxy2這樣一個參數還來得快。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。