技術漫談|iptables 與自定義ingress

Go語言 Nginx Linux AWK 睿雲智合Wise2C 睿雲智合Wise2C 2017-09-19

技術漫談|iptables 與自定義ingress

作者:周益

技術漫談|iptables 與自定義ingress

目標

k8s裡nodeport的所有主機都佔用相同的端口,而自定義ingress可以在指定的部分幾臺機器上開放端口。

iptables在自定義ingress的關係

說到iptables必然提到Netfilter,iptables是應用層的,其實質是一個定義規則的配置工具,而核心的數據包攔截和轉發是Netfiler。 Netfilter是linux操作系統核心層內部的一個數據包處理模塊。 根據ingress定製規則,控制iptables對外暴露端口,內部連接到 ingress-lb(nginx)上。

各服務之間的關係如下:

技術漫談|iptables 與自定義ingress

技術漫談|iptables 與自定義ingress

以下命令僅通過了centos7的工作環境。

技術漫談|iptables 與自定義ingress

獲得指定網絡地址的信息

ip route get 114.114.114.114

114.114.114.114 via 118.178.189.247 dev eth1 src 118.178.189.41

獲得外網網卡

ip route get 114.114.114.114 | grep dev | awk '{print $5}'

獲得外網IP

ip route get 114.114.114.114 | grep dev | awk '{print $7}'

獲得指定網卡的IP

如果k8s環境沒有公網網絡,以上命令無法獲得外網網卡和外網ip,只能手動指定外部網卡.。自動獲得外部ip

example: eth1

ifconfig eth1 | grep inet | awk '{print $2}'

技術漫談|iptables 與自定義ingress

端口轉發只是iptables其中的一個功能。 我們將通過代碼去控制iptables 達到我們想要的效果。

打開iptables轉發功能.

首先應該做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默認是0, 這樣允許iptalbes FORWARD。

查看自定義鏈表

iptables -t nat -S | grep -C 10 INGRESS

清空三個鏈,把自建的規則清空

技術漫談|iptables 與自定義ingress

k8s內部服務器HOST ingress-lb ip為10.244.1.25, 後端業務服務器由ingress-lb中nginx配置文件來對接。

技術漫談|iptables 與自定義ingress

技術漫談|iptables 與自定義ingress

技術漫談|iptables 與自定義ingress

agent對k8s api watch事件監聽, 一旦有了pod,endpoint,service相關的事件,對應進行iptables操作。

我們使用go語言 go-iptables對iptables進行了二次封裝,關鍵在於對ingress-lb的ip和需要開放的端口的操作。

封裝的主要功能:

  • 創建自定義的鏈(所有操作不影響原鏈表)

  • 查詢指定的ip已開放的端口

  • 向指定的ip添加開放端口

  • 刪除指定的ip開放了的端口

  • 刪除指定ip所有的端口

獲得當前主機的對外網卡和網卡

技術漫談|iptables 與自定義ingress

創建自定義的三個鏈

創建自定義的三個鏈

技術漫談|iptables 與自定義ingress

獲得當前開放了哪些端口

技術漫談|iptables 與自定義ingress

開放指定IP,對應的端口

技術漫談|iptables 與自定義ingress

刪除指定ip,開放了的端口

技術漫談|iptables 與自定義ingress

刪除指定ip所有的端口

技術漫談|iptables 與自定義ingress

iptables的功能強大,在linux有著很重要的地位。而在docker、k8s中,iptables的作用也十分重要.。本文描述通過go 調用封裝cmd命令行去操作iptables,得到需要的功能。

相關推薦

推薦中...