Ubuntu Server透過Proxy安裝MicroK8s注意事項
離開Linux多年,最近一些Container(容器)需求,需要回到Linux的世界(看一下Windows Container,讓我嘆口氣!)。伺服器方面,由於想玩MicroK8s,因此選擇Ubuntu Server,由於是全新安裝,直接選最新22.04 TLS版本來使用。網路部分,我們會透過一台Azure架設的Proxy來當對外的端點。Proxy部分可以參考另一篇「整合EXPRESSROUTE以YARP架設內網MCR代理伺服器」的架構。但與透過YARP存取指定的MCR不同,由於在Ubuntu上需要安裝或更新不特定來源的套件,例如,Ubuntu APT、snapd、…,因此YARP比較不合適。我們另外使用Azure Container Instances採用了ubuntu/squid映像檔快速架設出一台通用存取的Proxy。
ACI目前並沒有像App Service能設定【網路】→【存取限制】的地方。雖然URL有加一小段亂碼在裡面,但還是整個對外部公開的狀態,因此最好瞭解一下squid裡怎麼去做一些存取限制。
ACI squid Proxy最好在一開始安裝Ubuntu Server時就提供,格式:http://[domain]:[port]/
。以ACI而言,會是:http://a.b.c.azurecontainer.io:3128
。
Port 3128是squid預設存取埠。
注意:雖然設定上會區分HTTP與HTTPS,但我們在設定Azure Proxy端點時,請統一指定http://
。
注意,請勿指定IP。因為我們發現,ACI隨時會被重啟,重啟之後IP會不同。
在安裝好Ubuntu Server之後,還有一些設定Proxy的細節,請往下看。重點在於,我們順利安裝好MicroK8s之後,利用micrik8s status
查詢狀態,永遠都得到「microk8s is not running.」的回應。就這樣,花了超過二週的時間,終於找到問題點並打完這隻大魔王(自己的無知)。
APT Proxy
如果一開始沒設到APT Proxy也沒關係,登入系統後再補設定即可。
sudo nano /etc/apt/apt.conf.d/90curtin-aptproxy
寫入以下設定值:
Acquire::http::Proxy "http://[domain]:[port]/";
Acquire::https::Proxy "http://[domain]:[port]/";
存檔之後,測試一下APT Proxy,有正常存取代表Proxy沒問題。
sudo apt-get update
sudo apt-get update && sudo apt upgrade
User Proxy
APT Proxy只限APT使用,但我們某些指令也需要存取網路資源時,例如:curl
也需要指定Proxy才能正常存取。
curl -x a.b.c.azurecontainer.io:3128 -L ifconfig.me
透過-x
能指定透過Proxy來存取網路資源。但每次都要輸入那長長的URL實在很呆。在個人的~/.bashrc
設定預設使用的Proxy組態。
nano ~/.bashrc
寫入以下設定值:
export HTTP_PROXY="http://{domain}:port/"
export HTTPS_PROXY="http://{domain}:port/"
export NO_PROXY="localhost,127.0.0.1,::1"
export http_proxy="http://{domain}:port/"
export https_proxy="http://{domain}:port/"
export no_proxy="localhost,127.0.0.1,::1"
重新載入使用者組態,並且不加-x
測試:
# reload
source ~/.bashrc
# test proxy without -x
curl -L ifconfig.me
注意:
no_proxy
、NO_PROXY
通常會需要再加上自己內網的設定。
我一開始從Windows那裡移值了類似:"*.kkbruce.net,192.168.0.*,172.168.0.*"
的設定加到no_proxy
、NO_PROXY
。
All User Proxy
上面是每個User要自己設定~/.bashrc
,如果是開放給全部User,那麼可以由管理者統一設定。
sudo nano /etc/environment
寫入以下內容:
HTTP_PROXY="http://{domain}:port/"
HTTPS_PROXY="http://{domain}:port/"
NO_PROXY="localhost,127.0.0.1,::1"
http_proxy="http://{domain}:port/"
https_proxy="http://{domain}:port/"
no_proxy="localhost,127.0.0.1,::1"
注意:
no_proxy
、NO_PROXY
通常會需要再加上自己內網的設定。
注意: 在個人設定會加上export
,在/etc/environment
裡不需要哦! 注意: 設定/etc/environment
之後,原本~/.bashrc
裡的組態可以移除。
這裡設定好,請重開機套用全域的環境變數。
sudo reboot
基本上,設定/etc/environment
之後,一般指令只要有存取網路資源的動作,應該都會被導向Proxy去做存取。
docker proxy
如果你有安裝Docker,那麼要額外設定Proxy。
參考:
- https://docs.docker.com/network/proxy/
- https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
建議用systemd
方式組態:
建立組態檔:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
寫入以下設定:
[Service]
Environment="HTTP_PROXY=http://{domain}:port/"
Environment="HTTPS_PROXY=http://{domain}:port/"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
注意:
no_proxy
、NO_PROXY
通常會需要再加上自己內網的設定。
重啟docker
服務:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker
Install MicroK8s with Proxy
在安裝MicroK8s的過程蠻無腦的,就按照文件貼上指令就完成了。
sudo snap install microk8s --classic --channel=1.25
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube
su - $USER
microk8s status --wait-ready
snapd proxy
如果一開始不是採用/etc/environment
的組態,而是採用~/.bashrc
的組態,那麼這裡第一行的指令sudo snap install microk8s
在內網應該就會失敗。類似APT,我們就需要為snapd設定proxy:
sudo snap set system proxy.http="http://{domain}:port"
sudo snap set system proxy.https="http://{domain}:port"
設定完重新執行安裝MicroK8s指令應該就通了。
也就是說,一開始採用
/etc/environment
設定,就不用設定此處的snapd Proxy。
Upgrade from 1.24
有碰到過,安裝1.25有問題。後來改安裝1.24然後進行升級動作成功的案例。
sudo snap install microk8s --classic --channel=1.24
sudo snap refresh microk8s --channel=1.25/stable
microk8s is not running.
故事開始。
上面花了好多時間把Proxy架設起來,並一一設定到Ubuntu裡面(目前看起來,除了APT與docker需額外設定外,目前看起來都吃到得/etc/environment
的設定)。也透過snapd把MicroK8s安裝起來。我們前後建立7台Ubuntu Server VM,只有PoC的第一台VM在下microk8s status --wait-ready
時能得到「microk8s is running.」,其他6台其實會是無限等待,等不到回應。移除--wait-ready
就能看到一開始說的「microk8s is not running.」的回應。
第一個問題,如圖所示,服務其實都是running狀態,但那個「WARNING: The memory cgroup is not enabled.」實在很奇怪,因為依照畫面上提供的https://microk8s.io/docs/install-alternatives#heading--arm資料來言,那是針對Raspberry Pi,我們是VM,我一直在cgroup問題上轉圈圈,因為文件上的修改對VM無效,這裡花不少時間找如何修改的方法。
後來再想想,是不是ACI squid Proxy問題,我自己Hyper-V架了6台Ubuntu Server,測試未透過與透過ACI squid Proxy去安裝MicroK8s,結果都是正常。這讓我有點看不透了。
後來同事另外提供一個指令sudo snap logs -f microk8s
除了cgroup問題之外,又出現一個新的pull failed問題。想說,cgroup處理不好,那先處理網路問題好了。
其間,有找到一篇GithubMicrok8s not starting behind corporate proxy的討論,以及一篇Installing behind a proxy的文件。不過顯然心急找答案,我沒把裡面的東西看懂,讓我花了好多時間用排錯法找問題。
處理過程中一直有個疑問在心中,為何PoC的那一台正常,後續建立的6台全部不正常。在自己筆電不論是(未)透過Proxy都是正常。後來去找Network的同事幫忙,看是不是在VMWare上面有什麼設定上的差異,結果,在VMWare也看不出PoC VM與其他台VM有何差異。實在沒招了,我請Network砍掉VM,我想從零開始,因為那幾台已經被我改到我不知道改了什麼東西了。而Network同事做出一個大膽的決定,開Console讓我自己裝。這幾週我安裝不下20-30遍,而且在Hyper-V下都能正常運作,我也很開心的說,讓我自己來。
終於出現了靈光一閃:
我在設定的畫面上,直覺輸入255.255.255.0
,但它會顯示有錯,經過查詢後才知道,它支援192.160.1.0/24
這種格式。這讓我發現不對勁。
看看前面我的設定(我加上內網):
export no_proxy="localhost,127.0.0.1,::1,*.kkbruce.net,192.168.0.*,172.168.0.*"
再仔細看看,我上面找到的文件範例:
NO_PROXY=10.0.0.0/8,192.168.0.0/16,127.0.0.1,172.16.0.0/16
no_proxy=10.0.0.0/8,192.168.0.0/16,127.0.0.1,172.16.0.0/16
顯然,我原本從Windows複製過來的no_proxy
組態很可以有問題,但沒有任何錯誤跟你說。
除了IP組態要修正外,也注意一下domain的設定方式,這裡也建議改為.domain.com
的方式(前面不要加*號),這樣就能吃到所有的sub-domain,也就是a.domain.com
、b.domain.com
都能正確被套用到no_proxy
的組態。
將NO_PROXY
、no_proxy
的改用/24
之後,神奇的事就發生了。原本「microk8s is not running.」狀態在幾分鐘過後就會轉成「microk8s is running.」,所有的錯誤都不見了。
Why?
細想,我得到這樣的結論:「MicroK8s安裝完成之後,會在本機起動一些服務,而no_proxy
錯誤讓本機的連線一直被導到ACI squid Proxy去,造成MicroK8s啟動一直有問題。但MicroK8s不知道是no_proxy
造成的。」也就是,雖然我們設定了no_proxy
,但錯誤的設定讓no_proxy
失效,沒有no_proxy
等於所有的連線請求都被導向Proxy Server去。就算MicroK8s沒問題,後續開始部屬應用程式還是會出事。
最後蠻開心的,雖然問題卡了好久(不開心),但一開始就卡住,總比後續開始部屬應用程式時出事的好。而PoC VM之所以正常是因為,no_proxy
的內網設定是PoC之後才加上去的,而加上的設定是從Windows設定複製來的,就是這點小差異,花費用超過二週的青春小鳥來解它。(哭哭)
補充 containerd 的 Proxy
回覆刪除/etc/systemd/system/containerd.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://yourproxy:3128/"
Environment="HTTPS_PROXY=http://yourproxy:3128/"
Environment="NO_PROXY=localhost,127.0.0.1,::1,172.21.0.0/16,172.19.0.0/16,172.16.0.0/16,192.168.21.0/24,10.96.0.0/12,10.96.0.0/12,192.168.0.0/16,.svc,.cluster.local"