K8s生產環境下啟用防火牆



簡述
當初在安裝K8s集群時,為了安裝方便關閉了所有機器的防火牆,但是如果是生產環境,非常不安全,因此有了這篇文章。文章總結了在開啟防火牆狀態下,需要開放哪些端口,以及需要注意的點。

准備
服務器操作系統:Ubuntu 16.04
防火牆命令:ufw
集群:

服務器角色 名稱 ip
etcd etcd1、2、3 192.168.22.104、105、106
master master1、2 192.168.22.110、111
load balance lbMaster、lbBackup 192.168.22.102、103
node node1、2、3、4、5 192.168.22.107、108、109、141、142


設置
開放etcd集群所需端口2379(客戶端監聽)和2380(節點間內部通信)

ufw allow 2379
ufw allow 2380
1
2
開放Master節點6443端口,kube-apiserver組件使用,Kubernetes API端口

ufw allow 6443
1
開放Node節點

開放LB節點8443端口,為VIP(虛擬IP)監聽的服務端口,區別於默認的apiserver端口6443

ufw allow 8443
1
開啟以上節點后,訪問Dashboard進行測試,會出現以下問題:

Error: 'read tcp 172.20.1.0:56922->172.20.6.74:8443: read: connection timed out'
Trying to reach: 'https://172.20.6.74:8443/'
1
2
這是因為在安裝K8s集群過程中,使用網絡組件(這里是flannel)為集群中(Master和Node)的每個Pod虛擬了一個獨立的IP。Pod中的所有容器共享同一個IP,通過端口來區分,Pod之間可以相互訪問。上面的錯誤信息表示了各個服務器之間的虛擬IP段無法正常通信。

查看服務器路由信息

route -n
1
以下為Master1、2的路由信息

 

 

在Master1上,ping不通Master2的虛擬IP段:172.20.1.0,這說明防火牆可能對flannel組件生效有影響,需要了解flannel工作原理才能找到問題所在。

Flannel實質上是一種“覆蓋網絡(overlay network)”,將TCP數據包裝在另一種網絡包里面進行路由轉發和通信,目前已經支持UDP、VxLAN、AWS VPC和GCE路由等數據轉發方式。

默認的節點間數據通信方式是UDP轉發,源主機的flanneld服務將原本的數據內容UDP封裝后根據自己的路由表投遞給目的節點的flanneld服務,數據到達以后被解包,這意味着它們也是通過真實網絡的某個端口進行通信的,我們需要開放Flannel使用的特定端口。

開啟防火牆日志

ufw logging on
1
在Master1上,再次ping Master2的虛擬IP段:172.20.1.0,查看日志內容

tail -n 10 /var/log/ufw.log
1
日志

Jul 26 20:15:13 master02 kernel: [40620.949660] [UFW BLOCK] IN=ens160
OUT= MAC=00:50:56:ba:10:58:00:50:56:ba:55:f1:08:00 SRC=192.168.22.110 DST=192.168.22.111
LEN=134 TOS=0x00 PREC=0x00 TTL=64 ID=13122 PROTO=UDP SPT=57102 DPT=8472 LEN=114
1
2
3
DPT是數據包的目標端口,Master1向Master2的8472端口發送數據,也就是說我們需要再開放8472端口,注意要在所有Master和Node節點上執行。

ufw allow 8472
1
小結
經測試,開啟以下端口即可:

服務器角色 端口
etcd 2379、2380
Master 6443、8472
Node 8472
LB 8443


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM