为了测试集群,用nginx起一个Deployment,副本数为2, 通过NodePort暴露服务
nginx-deployment.yaml
################################
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:stable
name: nginx
nginx-service.yaml
##################################
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 80
创建Deployment和svc
kubectl create -f nginx-deployment.yaml
kubectl create -f nginx-service.yaml
查看资源是否已经创建完成
资源创建完成后用浏览器访问nodePort验证
发现通过node节点可以正常访问,但是通过master节点无法访问,排查问题思路如下
在master节点上 netstat -nlp | grep 80 查看kube-proxy 在监听 0.0.0.0 80端口
在master节点上 curl http://127.0.0.1 却没有响应
在master节点上 ping 10.244.1.9 (pod的ip)、ping 10.244.1.1 (cni 网关) 都不通,确定是各节点flannel网络不通造成的
在node节点上查看cni网段
得知去往 10.244.1.0/24网段的数据需要发往 192.168.18.11,去往 10.244.3.0/24网段的数据需要发往 192.168.18.10
于是在master上个添加静态路由
route add -net 10.244.1.0/24 gw 192.168.18.11
route add -net 10.244.3.0/24 gw 192.168.18.10
再次验证
服务已经能正常访问。
如果不从master上删除node,node的cni网段是不会改变的,可以在master上编写脚本,保持连接
#!/bin/bash
while true
do
ping -c 5 -q 10.244.3.1 > /dev/null
if [ $? -ne 0 ]; then
route add -net 10.244.3.0/24 gw 192.168.18.10
fi
ping -c 5 -q 10.244.1.1 > /dev/null
if [ $? -ne 0 ]; then
route add -net 10.244.1.0/24 gw 192.168.18.11
fi
sleep 30
done
内网服务器没有专业机房稳定,难免会有断电,断网的情况,可以给这些node打tag,将一些不重要的服务定向调度到这些node上。