Ubuntu Server透過Proxy安裝MicroK8s注意事項

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_proxyNO_PROXY通常會需要再加上自己內網的設定。
我一開始從Windows那裡移值了類似:"*.kkbruce.net,192.168.0.*,172.168.0.*"的設定加到no_proxyNO_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_proxyNO_PROXY通常會需要再加上自己內網的設定。
注意: 在個人設定會加上export,在/etc/environment裡不需要哦! 注意: 設定/etc/environment之後,原本~/.bashrc裡的組態可以移除。

這裡設定好,請重開機套用全域的環境變數。

sudo reboot

基本上,設定/etc/environment之後,一般指令只要有存取網路資源的動作,應該都會被導向Proxy去做存取。

docker proxy

如果你有安裝Docker,那麼要額外設定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_proxyNO_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.」的回應。

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

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下都能正常運作,我也很開心的說,讓我自己來。

終於出現了靈光一閃:

Ubuntu IPv4 Subnet

我在設定的畫面上,直覺輸入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.comb.domain.com都能正確被套用到no_proxy的組態。

NO_PROXYno_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設定複製來的,就是這點小差異,花費用超過二週的青春小鳥來解它。(哭哭)

1 則留言:

  1. 補充 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"

    回覆刪除

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