docker 集群 flannel网络构建
先保证集群状态是正常的
集群管理
kubelet 在创建pod 时会先下载一个pause 镜像,这个镜像用于容器基础网络管理
非常重要: 每个node 节点都要执行该操作:
iptables -P FORWARD ACCEPT
iptables-save
1、flannel 介绍
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址
在默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够之间通过IP地址相互找到,也就是相互ping通。
Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信
2、flannel工作于原理
Flannel实质上是一种“覆盖网络(overlay network)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式
3、部署flannel网络
etcd创建flanneld网络
etcdctl --endpoints http://192.168.10.221:2379 \
set /coreos.com/network/config '{"NetWork":"10.0.0.0/16"}'
[root@node1 ~]# tar xf flannel-v0.9.1.tar.gz [root@node1 ~]# cd flannel-v0.9.1 [root@node1 flannel-v0.9.1]# cp flanneld mk-docker-opts.sh /usr/local/bin/ [root@node1 flannel-v0.9.1]# cd conf/ [root@node1 conf]# cp *.service /usr/lib/systemd/system cp: overwrite ‘/usr/lib/systemd/system/docker.service’? y 覆盖docker的启动脚本 [root@node1 conf]# [root@node1 conf]# cp flanneld /etc/sysconfig/ [root@node1 conf]# vi /etc/sysconfig/flanneld [root@node1 conf]# [root@node1 conf]# [root@node1 conf]# cat /etc/sysconfig/flanneld # Flanneld configuration options # etcd url location. Point this to the server where etcd runs FLANNEL_ETCD_ENDPOINTS="http://192.168.10.221:2379" # etcd config key. This is the configuration key that flannel queries # For address range assignment FLANNEL_ETCD_KEY="/coreos.com/network" FLANNEL_OPTIONS="--etcd-endpoints=http://192.168.10.221:2379 --ip-masq=true" # Any additional options that you want to pass #FLANNEL_OPTIONS="" 重启flannel 和docker systemctl daemon-reload systemctl start flanneld && systemctl enable flanneld systemctl restart docker
检测状态
node2节点上面做同样的操作
跨主机容器网络通信测试
[root@manager ~]# cat bs1.yaml apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - image: busybox command: - sleep - "3600" imagePullPolicy: IfNotPresent name: busybox restartPolicy: Always [root@manager ~]# [root@manager ~]# cat bs2.yaml apiVersion: v1 kind: Pod metadata: name: busybox2 namespace: default spec: containers: - image: busybox command: - sleep - "36000" imagePullPolicy: IfNotPresent name: busybox2 restartPolicy: Always [root@manager ~]# [root@manager ~]# kubectl create -f bs1.yaml [root@manager ~]# kubectl create -f bs2.yaml
可以看到容器间网络通讯正常,可以访问外网,但是还是无法解析域名,下次我们介绍 dns