Kubernetes使用flannel做跨主机通讯的注意要点

我们知道docker的两个主机之间容器是不能直接通讯的

Kubernetes也没有自带解决这个问题,


我们部署Kubernetes的时候大多使用flannel或者calico插件带来的解决方案,

这里我不对这两个解决方案做对比,这是你在选择前应该自己去了解的.


这里主要讲个人在使用flannel做网络解决方案时候遇到的一些问题和注意事项,希望为有类似问题的人提供一定的思路.

我使用flannel的host-gw模式,通俗的讲是用flannel自动创建一些主机的路由策略来完成容器之间通讯.

具体细节你需要去看Kubernetes权威指南的网络原理章节

这是写入etcd中的数据配置,关键就是这个host-gw.

    ${BIN_DIR}/etcdctl \
      --endpoints=${ETCD_ENDPOINTS} \
      --ca-file=${KUBEROOT}/ssl/ca.pem \
      --cert-file=${KUBEROOT}/ssl/kubernetes.pem \
      --key-file=${KUBEROOT}/ssl/kubernetes-key.pem \

      mk ${FLANNEL_ETCD_PREFIX}/config "{\"Network\":\"${CLUSTER_CIDR}\",\"SubnetLen\":24,\"Backend\":{\"Type\":\"host-gw\"}}" >/dev/null 2>&1


第二个注意要点是docker要引用flannel生成的网络配置,下面是docker的systemd配置

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
After=network.target docker-storage-setup.service
Wants=docker-storage-setup.service


[Service]
Type=notify
Environment=-${KUBEROOT}/docker.conf
EnvironmentFile=-/run/flannel/docker
ExecStart=${BIN_DIR}/dockerd --log-level=error --log-opt max-size=50m --log-opt max-file=3 --data-root=${KUBEROOT}/docker \
          --selinux-enabled ${DOCKER_OPTS} \
          $DOCKER_STORAGE_OPTIONS \
          $DOCKER_NETWORK_OPTIONS
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process


[Install]
WantedBy=multi-user.target

查看该文件可发现变量定义和使用的关系
cat /run/flannel/docker
DOCKER_OPT_BIP="--bip=172.30.89.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1500"

DOCKER_NETWORK_OPTIONS=" --bip=172.30.89.1/24 --ip-masq=true --mtu=1500"


使用flannel生成的变量DOCKER_NETWORK_OPTIONS网络docker0网卡数据的匹配,然后flannel生成对应的路由策略完成网络打通

#ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno16780032: mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:50:56:b4:79:2b brd ff:ff:ff:ff:ff:ff
    inet 10.239.51.140/27 brd 10.239.51.159 scope global eno16780032
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:feb4:792b/64 scope link 
       valid_lft forever preferred_lft forever
4: docker0: mtu 1500 qdisc noqueue state DOWN 
    link/ether 02:42:d3:33:2d:d2 brd ff:ff:ff:ff:ff:ff
    inet 172.30.89.1/24 brd 172.30.89.255 scope global docker0

       valid_lft forever preferred_lft forever


这是路由策略,本机的docker容器转发到自己,其他的转发到对应主机的ip

#ip route show
default via 10.239.51.129 dev eno16780032  proto static  metric 100 
10.239.51.128/27 dev eno16780032  proto kernel  scope link  src 10.239.51.140  metric 100 
172.30.2.0/24 via 10.239.51.143 dev eno16780032 
172.30.5.0/24 via 10.239.51.149 dev eno16780032 
172.30.13.0/24 via 10.239.51.139 dev eno16780032 
172.30.24.0/24 via 10.239.51.144 dev eno16780032 
172.30.48.0/24 via 10.239.51.145 dev eno16780032 
172.30.57.0/24 via 10.239.51.138 dev eno16780032 
172.30.67.0/24 via 10.239.51.141 dev eno16780032 
172.30.73.0/24 via 10.239.51.147 dev eno16780032 
172.30.81.0/24 via 10.239.51.146 dev eno16780032 
172.30.89.0/24 dev docker0  proto kernel  scope link  src 172.30.89.1 
172.30.95.0/24 via 10.239.51.142 dev eno16780032 
172.30.103.0/24 via 10.239.51.148 dev eno16780032 

 
  

第三个要点是要清除iptables规则..这个是最新遇到的坑,什么检查都对,但是ping就是不通,使用如下命令执行删除防火墙规则,注意不是关闭防火墙就万事大吉哦,我以前也这么想的,不清除防火墙规则关闭是没用的,因为Kubernetes依赖iptables所以是不会被关闭的

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n

你可能感兴趣的:(Kubernetes)