环境是4台机器,master、node1、node2、harbor,pod状态正常,但是无法访问CLUSTER-IP,每台虚拟机网路都是Nat模式,平时可以互相ping通能够访问外网,但是master中无法访问CLUSTER-IP,在对应的节点上访问服务可以显示正常信息
CLUSTER-IP

pod状态

查看节点,发现之前是Ready,现在子节点有点不正常

查看svc情况,可以看到kube-proxy也起来了
kubectl get svc
netstat -anpt | grep :ip

访问

整合了一些自己尝试的网上解决的方法,在此记录下来
一、修改k8s的配置文件,将网络模式类型修改为Nodeport(这是基础,改了不一定会好,但一定要改),
编辑文件,找到spec.type,将类型修改为NodePort
kubectl edit svc nginx-deployment

再查看一下ipvs模式需要要添加ip_vs相关模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

确认网络类型
kubectl get svc

二、设置hairpin-mode参数
相关文档说明翻译:kubernetes
如果网络没有为“发夹模式”流量生成正确配置,通常当 kube-proxy 以 iptables 模式运行,并且 Pod 与桥接网络连接时,就会发生这种情况。Kubelet 公开了一个 hairpin-mode 标志,如果 pod 试图访问它们自己的 ServicevIP,就可以让 Service 的端点重新负载到他们自己身上。hairpin-mode 标志必须设置为 hairpin-veth 或者 promiscuous-bridge。

github中有也一个相关的讨论有兴趣的可以看一下:kubelet 未使用 CNI 插件设置发夹
多种结论基本都是指向修改hairpin-mode参数,应该由cni插件来根据这个值来做对应的操作,所以veth该文件内容设置 1(本人/sys/devices/virtual/net/docker0/brif/路径下没有文件所以无法设置)
for intf in /sys/devices/virtual/net/docker0/brif/*; do echo 1> $intf/hairpin_mod; done
上面是通过cni设置hairpin-mode参数,这里再通过flannel设置参数(本人系统文件本来就是这个配置,所以无效)
/etc/cni/net.d/10-flannel.conflist
{
"name": "cbr0",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
三、确认node子节点是否可用
子节点上运行指令,查看是否有如下报错。 报错原因是因为kubernetes-admin命令没有同步过来,所以解决办法需要把对应文件同步过来就好,将主节点的配置 /etc/kubernetes/admin.conf 复制到本机,再重新声明环境变量

在子节点操作,复制配置文件
scp root@主节点服务器地址:/etc/kubernetes/admin.conf /etc/kubernetes/
添加环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
申明环境变量
source ~/.bash_profile
重新查看配置
kubectl get svc

稍等一会之后基本就好了,有点莫名其妙
解决podip Destination Host Unreachable问题