0%

k8s master节点nodePort方式不能访问服务

k8s集群三个节点,一个master node, 两个worker node。

我们可以看到prometheus以NodePort方式把服务暴露出来。

1
2
3
kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-k8s NodePort 10.105.212.163 <none> 9090:30090/TCP 45d

我们通过<worker-node-ip>:30090的方式,可以正确访问到页面,但通过<master-node-ip>:30090,却不能正常访问页面。

随即,我查看了calico网络插件的运行情况。

1
2
3
4
5
kubectl get po  -n kube-system
NAME READY STATUS RESTARTS AGE
calico-node-jt4fz 0/1 Running 4 45d
calico-node-mv4ht 1/1 Running 5 45d
calico-node-nqbkl 1/1 Running 5 45d

其中一个pod,并未通过健康检查。

查看一下这个pod的详情信息。

1
2
3
4
5
6
7
8
kubectl describe po calico-node-jt4fz -n kube-system
Name: calico-node-jt4fz
Namespace: kube-system
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Unhealthy 6m22s (x499 over 89m) kubelet, k8s-master (combined from similar events): Readiness probe failed: calico/node is not ready: BIRD is not ready: BGP not established with 172.16.64.232,172.16.64.2352020-02-12 12:36:36.591 [INFO][12943] health.go 156: Number of node(s) with BGP peering established = 0

错误的原因是:

Readiness probe failed: calico/node is not ready: BIRD is not ready: BGP not established with 172.16.64.232,172.16.64.2352020-02-12 12:36:36.591 [INFO][12943] health.go 156: Number of node(s) with BGP peering established = 0

解决方案:

调整calico网络插件的网卡发现机制,修改IP_AUTODETECTION_METHOD对应的value值。

官方提供的yaml文件中,ip识别策略(IPDETECTMETHOD)没有配置,即默认为first-found,这会导致一个网络异常的ip作为nodeIP被注册,从而影响node-to-node mesh。

我们可以修改成can-reach或者interface的策略,尝试连接某一个Ready的node的IP,以此选择出正确的IP。

calico.yaml文件中添加如下两行内容

1
2
- name: IP_AUTODETECTION_METHOD
value: "interface=ens.*" # ens 根据实际网卡开头配置

配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
# Cluster type to identify the deployment type
- name: CLUSTER_TYPE
value: "k8s,bgp"
# Specify interface
- name: IP_AUTODETECTION_METHOD
value: "interface=ens.*"
# Auto-detect the BGP IP address.
- name: IP
value: "autodetect"
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"

修改后重新应用一下calico.yaml文件。

1
kubectl apply -f calico.yaml

我们发现calico所有pod都已经成功启动了。

1
2
3
4
5
kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
calico-node-jtvh8 1/1 Running 0 15s
calico-node-k6m8t 1/1 Running 0 45s
calico-node-rb9qx 1/1 Running 0 29s

此时,通过<master-node-ip>:30090,即可以成功访问到页面了。