簡述
當初在安裝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