在通过kubeadm 初始化之后,进行网络插件的配置和安装;
1、 kubernetes网络模型
kubernetes的网络模型假定了所有的pod都在一个可以直接连通的扁平化的网络空间中。这在GCE里面是现成的网络模型,kubernetes假定这个网络已经存在。而在私有云里,也就是我们本地搭建kubernetes集群的时候就不能假设这种网络空间已经存在了。所以我们需要自己实现这种假想的网络假设,将不同节点上的Docker容器之间的相互访问先打通,然后运行kubernetes。[图片上传中...(5006907-34e6d36d172a402b.png-bb45c3-1558515533858-0)]
目前已经有多可开源的网络组件支持容器网络模型。比如:Flannel、Open vSwitch、直接路由和Calico等。我选用的是Flannel。
2、 Flannel
Flannel之所以能够搭建kubernetes依赖的底层网络,是因为他能实现以下两点:
(1)它能协助kubernetes,个每一个Node上的Docker容器分配互相不冲突的IP地址。
(2)它能够在这些IP地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络将数据包原封不动的传递到容器内部。
其主要原理和工作流程参考网上先关资料
3 kubeadm方式配置flannel
以下过程只需要在master节点下进行即可,master节点上配置好之后kubernetes会自动配置所属的全部node
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
container:
......
command:
- /opt/bin/flanneld
arg:
- --ip-masq
- --kube-subnet-mgr
- --iface=eth0
在有的kube-flannle.yml文件的arg
参数中只有前两个,最后的--iface=eth0
并没有编辑,这样的话就可能导致,不同node上的pod之间无法通信。大致原因是因为--iface
参数是指定flanneld 数据包输出的网端,如果没有填写,那么在上图中flanneld
无法将数据包传送到eth0
,也就是数据无法正常被发送出去,所以不同node上的pod是无法通信的,所以对--iface
进行指定,数据包才能正常的经过flannel
进行传送
下载完flannel的yml配置文件之后,运行kubectl create -f kube-flannel.yml
建立kube-flannle POD,并且开始工作,可以使用kubectl get pods --all-namespaces
查看是否已经建立了这个pod。
参考自[https://www.codercto.com/a/37238.html],如果关于flannel还有其他问题也可以移步到此地址参考解决(https://www.codercto.com/a/37238.html)
coredns
在配置完flannel等相关网络之后kube-coredns
才会进行工作,之后每当kubernetes建立一个pod的时候coredns就会给予这个pod一个域名。
kubernetes中,由于pod不是固定的,即使通过标签选择器固定pod。kubernetes会通过自身所带的算法等工具去分配这些pod到最优的node上去,在不同的node上,网络环境可能不同,所以pod的IP一会随之变化,kubernetes也就没有提供固定ip的方法。
这样一来,域名就相当于一个pod在网络空间的唯一标识,可以通过域名来确定一个pod的网络位置,即使pod在运行过程中更换node导致IP地址发生变化,其域名也是固定不变的。
在之前的版本kubernetes默认的dns服务是通过kube-dns实现的,在最近的版本(大概1.10左右)之后的版本,kubernetes默认的dns服务使用过coredns实现的,在使用kubeadm安装kubernetes时,在最后请确定kube-coredns是否已经建立,每一个node上会建立一个coredns 的POD。