天天看點

使用阿裡雲容器服務Kubernetes通過init Container形式變更Pod的iptables

  本文主要涉及兩個鏡像:第一個是包含iptables規則變更腳本的鏡像,名稱為ali-test.test.com/app/proxy_iptables版本為 release_v0.0.1_develop,另一個是簡單應用hello-world的鏡像,名稱為ali-test.test.com/app/tutum/hello-world,版本為release_v0.0.1。其中ali-test.test.com為私有鏡像倉庫位址,app為項目名稱,第一個鏡像作為init container形式啟動。

  第一個鏡像proxy_iptables:release_v0.0.1_develop,包含了對iptables的變更腳本,抽取腳本中部分指令,如下所示:

#請求轉發到proxy_port定義的端口
echo "begin pull iptables rules"
proxy_port=$1
echo "proxy port = $proxy_port"
iptables -t nat -N PROXY_REDIRECT
iptables -t nat -A PROXY_REDIRECT -p tcp -j REDIRECT --to-port "${proxy_port}"
......           

  下面開始通過阿裡雲控制台使用容器服務-kubernetes。控制台入口為:應用--選擇“無狀态”--選擇一個叢集開始操作(阿裡雲賬戶需要有操作權限)。步驟如下:

(1)首先建立命名空間或者使用已有命名空間

(2)點選“使用鏡像建立”,填寫應用名稱、副本數量,勾選時區同步,如圖一所示:

使用阿裡雲容器服務Kubernetes通過init Container形式變更Pod的iptables

圖一

(3)點選“下一步”,進行容器配置,配置鏡像名稱ali-test.test.com/app/proxy_iptables,鏡像tag為release_v0.0.1_develop,所屬資源根據使用填寫。對于此應用,需要勾選Init Container。因為此鏡像僅包含了腳本,其它配置可以不用填寫,如圖二所示:

使用阿裡雲容器服務Kubernetes通過init Container形式變更Pod的iptables

圖二

(4) 點選“添加容器”,以相同的形式,部署hello-world應用,不勾選“Init Container”,如圖三所示。接着下一步,直至建立完成。

使用阿裡雲容器服務Kubernetes通過init Container形式變更Pod的iptables

圖三

(5) 檢視proxy_iptables容器日志,會發現容器在執行iptables指令時異常:Permission denied,如圖四所示:

使用阿裡雲容器服務Kubernetes通過init Container形式變更Pod的iptables

圖四

解決方式如下:

打開應用的yaml檔案,在initContainer容器配置中添加:

securityContext:
     privileged: true
           

如圖五所示:

使用阿裡雲容器服務Kubernetes通過init Container形式變更Pod的iptables

圖五

更新後,檢視容器日志,iptables指令可正常執行,hello-world應用啟動正常。

(6)登入hello-world應用容器,檢視iptables變更,指令如下:

檢視運作的容器資訊,并擷取container ID:

docker ps |grep lyl
           

檢視容器PID:

docker top $container_id
           

檢視iptables變更:

nsenter -t $PID   -n iptables  -t nat -S
           

通過檢視容器日志,可以看到iptables腳本變更正常執行。

至此,部署完成,Pod及container正常啟動運作。

其它說明:

k8s pod内部容器是共享網絡空間的,通過指令檢視iptables的規則,同一個pod内的多個container規則是相同的。

繼續閱讀