一、Kubernetes网络模型
(1)设计原则
每个Pod都拥有一个独立的IP地址
假定所有Pod都在一个可以直接连通的、扁平的网络空间中
(2)Kubernetes对集群网络的要求
> 所有的容器都可以在不用NAT的方式下同别的容器通讯
> 所有节点都可在不用NAT的方式下同所有容器通讯
> 容器的地址和别人看到的地址是同一个地址
二、Docker网络基础
术语 | 作用 |
---|---|
网络命名空间 | 将独立的网络协议栈隔离到不同的命令空间中 在不同命名空间的网络栈是完全隔离的,彼此之间无法通信 |
Veth设备对 | 实现不同网络命名空间之间的通信,可以直接将两个网络命名空间连接起来 Veth设备都是成对出现的 |
网桥 | 是一个二层网络设备,通过网桥可以将Linux支持的若干个网络端口“连接”起来,使得网络接口之间的报文能够互相转发 |
Iptables/Netfilter | Netfilter负责在内核中执行各种挂接的规则,运行在内核模式中; Iptables是在用户模式下运行的进程,负责协助维护内核中Netfilter的各种规则表 通过二者的配合实现整个Linux网络协议栈中灵活的数据包处理机制 |
路由 | Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往的目的地 |
三、Flanner网络插件
- 目的是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址
- 是一种“覆盖网络(overlay network)”
- 目前支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式
- 节点间默认的数据通信方式是UDP转发
(1)工作原理
Flannel通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于Linux TUN/TAP,使用UDP/VXLAN封装IP包来创建overlay网络,并借助etcd(也支持kubernetes)维护网络的分配情况。
详细图解:
源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器
简单图解:
数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端
(2)Flannel 特点
1. 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
2. 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。
覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。
在将封装的数据包转发到端点后,将其解封装。
3. 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。
4. etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
四、Flannel 网络部分部署
切记提前解决好防火墙策略和核心防护
'如果没有提前备好安装包可以下载'
wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
'写入分配的子网段到ETCD中,供flannel使用'
----master操作----
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.90.100:2379,https://192.168.90.101:2379,https://192.168.90.102:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
'拷贝到所有node节点(只需要部署在node节点即可)'
scp flannel-v0.10.0-linux-amd64.tar.gz root@192.168.90.101:/root
scp flannel-v0.10.0-linux-amd64.tar.gz root@192.168.90.102:/root
'所有node节点操作解压'
tar zxvf flannel-v0.10.0-linux-amd64.tar.gz
'创建k8s工作目录'
mkdir /opt/kubernetes/{cfg,bin,ssl} -p
mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/
vim flannel.sh
----------------------------------------------------------------------------------------------------------------------
#!/bin/bash
ETCD_ENDPOINTS=${1:-"http://127.0.0.1:2379"}
cat <<EOF >/opt/kubernetes/cfg/flanneld
FLANNEL_OPTIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \
-etcd-cafile=/opt/etcd/ssl/ca.pem \
-etcd-certfile=/opt/etcd/ssl/server.pem \
-etcd-keyfile=/opt/etcd/ssl/server-key.pem"
EOF
cat <<EOF >/usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/opt/kubernetes/cfg/flanneld
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq \$FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable flanneld
systemctl restart flanneld
----------------------------------------------------------------------------------------------------------------------
'开启flannel网络功能'
[root@localhost ~]# bash flannel.sh https://192.168.90.100:2379,https://192.168.90.101:2379,https://192.168.90.102:2379
'配置docker连接flannel (添加两段语句)'
[root@localhost ~]# vim /usr/lib/systemd/system/docker.service
----------------------------------------------------------------------------------------------------------------------
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
> 添加此处 EnvironmentFile=/run/flannel/subnet.env
> 添加此处 ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
----------------------------------------------------------------------------------------------------------------------
cat /run/flannel/subnet.env
DOCKER_OPT_BIP="--bip=172.17.42.1/24"
DOCKER_OPT_IPMASQ="--ip-masq=false"
DOCKER_OPT_MTU="--mtu=1450"
'说明:bip指定启动时的子网'
DOCKER_NETWORK_OPTIONS=" --bip=172.17.42.1/24 --ip-masq=false --mtu=1450"
'重启docker服务'
[root@localhost ~]#
systemctl daemon-reload
systemctl restart docker
'查看flannel网络'
ifconfig
flannel.1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 172.17.84.0 netmask 255.255.255.255 broadcast 0.0.0.0
inet6 fe80::fc7c:e1ff:fe1d:224 prefixlen 64 scopeid 0x20<link>
ether fe:7c:e1:1d:02:24 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 26 overruns 0 carrier 0 collisions 0
'测试ping通对方docker0网卡 证明flannel起到路由作用'