一、環境:
k8s: ? v1.23.6
docker: ?????????20.10.14
問題和故障現象:devops主機集群主機節點到端口8082不通(網絡策略已經申請,并且網絡策略已經實施完畢),而且網絡實施人員再次確認,網絡策略配置沒有問題,端口卻依然不通。
解決簡介:
- 通過traceroute定位
- 通過route -n 查看路由表信息
- 查看VIP 子網掩碼位數
- 修改宿主機上的keepalived配置文件
- 進入k8s-keepalive容器內部,修改keepalive配置文件
- 重啟容器k8s-keepalive
二、問題排查
2.1、檢查端口不通
檢查xxx.xxx.25.226 ?到目標主機xxx.xxx..60.142 8082 端口不通,也不能ping通。
K8s 集群信息如下:
通過在目標主機上?tcpdump抓包:
tcpdump -i any -nn host xxx.xxx.25.226
也沒有抓到源主機 xxx.xxx.25.226的請求數據包
2.2 、網絡策略策略實施人員確認
網絡策略已經提交工單,并且網絡人員已經實施完畢,再次和網絡策略實施人員確認,他那邊網絡策略實施的沒有問題。
2.3、通過traceroute 定位分析
感覺有點怪異,沒有走網關 xxx.xxx.25.1
2.4、 通過rourt -n 查看本地路由表信息
通過路由表分析,到目標?xxx.xxx.60.142 8082 匹配上了路由表的第二條路由規則,沒有經過網關 xxx.xxx.25.1
2.5、 通過ip a 查看
上面紅色的IP xxx.xxx.25.226/24是宿主機的地址,下面綠色IP xxx.xxx.25.232/16的是k8s apiserver 高可用使用的VIP ,查看感覺這里的子網掩碼16有點特別奇怪,因為這個地址的存在,所以,路由表里面就有了上面的第二條路由規則的添加:
我們從本機到目標地址?xxx.xxx.60.142 8082 的 數據包就匹配上了這條規則,從本機直連,而不通過網關 xxx.xxx.25.1了,但因為我們本地xxx.xxx.25.226/24所在的網絡xxx.xxx.25.0/24 顯然和我們要訪問的目標主機xxx.xxx.60.142/24 所在的網絡xxx.xxx.60.0/24 不是同一網絡,必須要通過網關xxx.xxx.25.1才行,問題就在這里。
三、問題解決
3.1、 找到?xxx.xxx.25.232/16配置的應用
查看VIP ?xxx.xxx.60.142/16 是keepalived容器在使用,這個是apiserver 的高可用配置的VIP,通過3個節點上運行的k8s-keepalive容器實現。
查看容器映射到宿主機的配置信息:
[root@XX-XXpod2-c6-core-25-226 .kube]# cat ?/apps/k8s-ha/kconf/keepalived.conf ! Configuration File for keepalived global_defs { ???router_id LVS_1 } vrrp_script checkhaproxy { ????script "/opt/check.sh" ????interval 1 ????weight -30 } vrrp_instance VI_1 { ????state MASTER ????interface eth0 ????virtual_router_id 232 ????priority 100 ????unicast_src_ip xxx.xxx.25.226 ????unicast_peer { ????????????????????????????????????????xxx.xxx.25.227 ????????????????????????????????xxx.xxx.25.228 ????????????????????} ????advert_int 1 ????authentication { ????????auth_type PASS ????????auth_pass "!q12Q!waER43aS" ????} ????virtual_ipaddress { ????????xxx.xxx.25.232/16 ????} ????track_script ????{ ????????checkhaproxy ????} } |
通過查看,發現上面的VIP的子網掩碼寫成了16位了。
先備份3個master節點上的配置文件,把配置文件里面的VIP子網掩碼修改為24位。3個節點依次重啟k8s-keepaive容器后,通過ip a |grep xxx.xxx 查看,VIP子網掩碼依然為為16位.
3.2、?進一步進入到k8s-keepalive容器里面排查定位
在容器里面執行 ps -ef 命令 看下查看到 里面運行的keepalived進程用到的配置文件為:
/usr/local/etc/keepalived/keepalived.conf
查看容器里面的配置文件內容,查看配置文件里面VIP子網掩碼修改依然為16位,
bash-5.0# vi /usr/local/etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { ???router_id LVS_1 } vrrp_script checkhaproxy { ????script "/opt/check.sh" ????interval 1 ????weight -30 } vrrp_instance VI_1 { ????state MASTER ????interface eth0 ????virtual_router_id 232 ????priority 100 ????unicast_src_ip xxx.xxx.25.226 ????unicast_peer { ????????????????????????????????????????xxx.xxx.25.227 ????????????????????????????????xxx.xxx.25.228 ????????????????????} ????advert_int 1 ????authentication { ????????auth_type PASS ????????auth_pass "!q12Q!waER43aS" ????} ????virtual_ipaddress { ????????xxx.xxx.25.232/16 ????} ????track_script ????{ ????????checkhaproxy ????} } |
看來,修改映射到宿主機的配置文件后,沒有用,還需要修改容器里面的配置文件。
3.3 修改容器里面的配置文件后,重啟容器
修改完容器里面的配置文件后,重啟容器,再次在宿主機上通過 ip a |grep ?xxx.xxx
查看 VIP子網掩碼為24位了。
路由表也恢復正常了。?
四.總結
4.1 遇到類似問題,要學會使用常用命令工具分析,一步一步排查。
4.2 Keepalived容器在使用的時候,修改宿主機配置文件后,還要修改容器里面的配置文件。