From deb9edeab885e17de54cd303b0bc20a280fa3af9 Mon Sep 17 00:00:00 2001 From: gjmzj Date: Thu, 14 Jun 2018 23:34:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0kube-router=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E5=8F=8A=E6=B8=85=E9=99=A4=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 99.clean.yml | 7 ++ README.md | 6 +- docs/06-安装kube-router网络组件.md | 45 -------- docs/06-安装网络组件.md | 38 +++++++ ...装calico网络组件.md => 06.calico.md} | 45 +------- ...flannel网络组件.md => 06.flannel.md} | 5 +- docs/06.kube-router.md | 107 ++++++++++++++++++ roles/docker/tasks/main.yml | 6 + 8 files changed, 166 insertions(+), 93 deletions(-) delete mode 100644 docs/06-安装kube-router网络组件.md create mode 100644 docs/06-安装网络组件.md rename docs/{06-安装calico网络组件.md => 06.calico.md} (73%) rename docs/{06-安装flannel网络组件.md => 06.flannel.md} (94%) create mode 100644 docs/06.kube-router.md diff --git a/99.clean.yml b/99.clean.yml index 3a338eb..22bbb87 100644 --- a/99.clean.yml +++ b/99.clean.yml @@ -49,6 +49,11 @@ - kube-node - new-node tasks: + - name: 清理kube-router相关 + shell: "{{ bin_dir }}/docker run --privileged --net=host cloudnativelabs/kube-router --cleanup-config" + ignore_errors: true + when: "CLUSTER_NETWORK == 'kube-router'" + - name: stop docker service shell: "systemctl stop docker" ignore_errors: true @@ -90,6 +95,8 @@ ip link del flannel.1; \ ip link del cni0; \ ip link del mynet0; \ + ip link del kube-bridge; \ + ip link del dummy0; \ systemctl restart networking; \ systemctl restart network" ignore_errors: true diff --git a/README.md b/README.md index 5fe6847..9261544 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ |k8s|v1.10.4|v1.8, v1.9, v1.10| |etcd|v3.3.6|v3.1, v3.2, v3.3| |docker|18.03.0-ce|17.*.*-ce, 18.*.*-ce| -|network| |calico v3.0, flannel v0.10, kube-router(todo)| +|network| |calico v3.0, flannel v0.10, kube-router| -注:集群用到的所有二进制文件已打包好供下载 [https://pan.baidu.com/s/1c4RFaA](https://pan.baidu.com/s/1c4RFaA) @@ -31,13 +31,13 @@ 00-规划集群和安装概览 02-安装etcd集群 04-安装master节点 - 06-安装calico网络 + 06-安装集群网络 01-创建证书和安装准备 03-安装docker服务 05-安装node节点 - 06-安装flannel网络 + diff --git a/docs/06-安装kube-router网络组件.md b/docs/06-安装kube-router网络组件.md deleted file mode 100644 index 6188433..0000000 --- a/docs/06-安装kube-router网络组件.md +++ /dev/null @@ -1,45 +0,0 @@ -# kube-router 网络组件 - - - - -## 验证 - -- 1.pod间网络联通性:略 - -- 2.host路由表 - -``` bash -# master上路由 -root@master1:~$ ip route -... -172.20.1.0/24 via 192.168.1.2 dev ens3 proto 17 -172.20.2.0/24 via 192.168.1.3 dev ens3 proto 17 -... - -# node3上路由 -root@node3:~$ ip route -... -172.20.0.0/24 via 192.168.1.1 dev ens3 proto 17 -172.20.1.0/24 via 192.168.1.2 dev ens3 proto 17 -172.20.2.0/24 dev kube-bridge proto kernel scope link src 172.20.2.1 -... -``` - -- 3.bgp连接状态 - -``` bash -# master上 -root@master1:~$ netstat -antlp|grep router|grep LISH|grep 179 -tcp 0 0 192.168.1.1:179 192.168.1.3:58366 ESTABLISHED 26062/kube-router -tcp 0 0 192.168.1.1:42537 192.168.1.2:179 ESTABLISHED 26062/kube-router - -# node3上 -root@node3:~$ netstat -antlp|grep router|grep LISH|grep 179 -tcp 0 0 192.168.1.3:58366 192.168.1.1:179 ESTABLISHED 18897/kube-router -tcp 0 0 192.168.1.3:179 192.168.1.2:43928 ESTABLISHED 18897/kube-router - -``` - -- 4.NetworkPolicy有效性,验证参照[这里](guide/networkpolicy.md) - diff --git a/docs/06-安装网络组件.md b/docs/06-安装网络组件.md new file mode 100644 index 0000000..20952f2 --- /dev/null +++ b/docs/06-安装网络组件.md @@ -0,0 +1,38 @@ +## 06-安装网络组件.md + +首先回顾下K8S网络设计原则,在配置集群网络插件或者实践K8S 应用/服务部署请时刻想到这些原则: + +- 1.每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间 +- 2.集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问 + - 所有容器之间无需NAT就可以直接互相访问 + - 所有Node和所有容器之间无需NAT就可以直接互相访问 + - 容器自己看到的IP跟其他容器看到的一样 +- 3.Service cluster IP尽可在集群内部访问,外部请求需要通过NodePort、LoadBalance或者Ingress来访问 + +`Container Network Interface (CNI)`是目前CNCF主推的网络模型,它由两部分组成: + +- CNI Plugin负责给容器配置网络,它包括两个基本的接口 + - 配置网络: AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) + - 清理网络: DelNetwork(net *NetworkConfig, rt *RuntimeConf) error +- IPAM Plugin负责给容器分配IP地址 + +Kubernetes Pod的网络是这样创建的: +- 0.每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的`基础容器`,比如:`mirrorgooglecontainers/pause-amd64` `registry.access.redhat.com/rhel7/pod-infrastructure` +- 1.首先 kubelet创建`基础容器`生成network namespace +- 2.然后 kubelet调用网络CNI driver,由它根据配置调用具体的CNI 插件 +- 3.然后 CNI 插件给`基础容器`配置网络 +- 4.最后 Pod 中其他的容器共享使用`基础容器`的网络 + +本项目基于CNI driver 调用各种网络插件来配置kubernetes的网络,常用CNI插件有 `flannel` `calico` `weave`等等,这些插件各有优势,也在互相借鉴学习优点,比如:在所有node节点都在一个二层网络时候,flannel提供hostgw实现,避免vxlan实现的udp封装开销,估计是目前最高效的;calico也针对L3 Fabric,推出了IPinIP的选项,利用了GRE隧道封装;因此这些插件都能适合很多实际应用场景。 + +项目当前内置支持的网络插件有:`calico` `flannel` `kube-router` + +### 安装讲解请 + +- [安装calico](06.calico.md) +- [安装flannel](06.flannel.md) +- [安装kube-router](06.kube-router.md) + +### 参考 +- [kubernetes.io networking docs](https://kubernetes.io/docs/concepts/cluster-administration/networking/) +- [feiskyer-kubernetes指南网络章节](https://github.com/feiskyer/kubernetes-handbook/blob/master/zh/network/network.md) diff --git a/docs/06-安装calico网络组件.md b/docs/06.calico.md similarity index 73% rename from docs/06-安装calico网络组件.md rename to docs/06.calico.md index 6bd0a01..73373f4 100644 --- a/docs/06-安装calico网络组件.md +++ b/docs/06.calico.md @@ -1,35 +1,10 @@ ## 06-安装calico网络组件.md -推荐阅读[feiskyer-kubernetes指南](https://github.com/feiskyer/kubernetes-handbook) 网络相关内容 - -首先回顾下K8S网络设计原则,在配置集群网络插件或者实践K8S 应用/服务部署请时刻想到这些原则: - -- 1.每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间 -- 2.集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问 - - 所有容器之间无需NAT就可以直接互相访问 - - 所有Node和所有容器之间无需NAT就可以直接互相访问 - - 容器自己看到的IP跟其他容器看到的一样 -- 3.Service cluster IP尽可在集群内部访问,外部请求需要通过NodePort、LoadBalance或者Ingress来访问 - -`Container Network Interface (CNI)`是目前CNCF主推的网络模型,它由两部分组成: - -- CNI Plugin负责给容器配置网络,它包括两个基本的接口 - - 配置网络: AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) - - 清理网络: DelNetwork(net *NetworkConfig, rt *RuntimeConf) error -- IPAM Plugin负责给容器分配IP地址 - -Kubernetes Pod的网络是这样创建的: -- 0.每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的`基础容器`,比如:`mirrorgooglecontainers/pause-amd64` `registry.access.redhat.com/rhel7/pod-infrastructure` -- 1.首先 kubelet创建`基础容器`生成network namespace -- 2.然后 kubelet调用网络CNI driver,由它根据配置调用具体的CNI 插件 -- 3.然后 CNI 插件给`基础容器`配置网络 -- 4.最后 Pod 中其他的容器共享使用`基础容器`的网络 - -本文档基于CNI driver 调用calico 插件来配置kubernetes的网络,常用CNI插件有 `flannel` `calico` `weave`等等,这些插件各有优势,也在互相借鉴学习优点,比如:在所有node节点都在一个二层网络时候,flannel提供hostgw实现,避免vxlan实现的udp封装开销,估计是目前最高效的;calico也针对L3 Fabric,推出了IPinIP的选项,利用了GRE隧道封装;因此这些插件都能适合很多实际应用场景,这里选择calico,主要考虑它支持 `kubernetes network policy`。 - 推荐阅读[calico kubernetes guide](https://docs.projectcalico.org/v3.0/getting-started/kubernetes/) -calico-node需要在所有master节点和node节点安装 +本项目提供多种网络插件可选,如果需要安装calico,请在/etc/ansible/hosts文件中设置变量 `CLUSTER_NETWORK="kube-router"` + +- calico-node需要在所有master节点和node节点安装 ``` bash roles/calico/ @@ -80,6 +55,7 @@ roles/calico/ + 配置集群POD网络 CALICO_IPV4POOL_CIDR={{ CLUSTER_CIDR }} + **重要**本K8S集群运行在同网段kvm虚机上,虚机间没有网络ACL限制,因此可以设置`CALICO_IPV4POOL_IPIP=off`,如果你的主机位于不同网段,或者运行在公有云上需要打开这个选项 `CALICO_IPV4POOL_IPIP=always` + 配置FELIX_DEFAULTENDPOINTTOHOSTACTION=ACCEPT 默认允许Pod到Node的网络流量,更多[felix配置选项](https://docs.projectcalico.org/v2.6/reference/felix/configuration) ++ 多网卡服务器运行kube-controller可能会出现问题,本项目已通过增加设置环境变量`KUBERNETES_SERVICE_HOST`和`KUBERNETES_SERVICE_PORT`解决 ### 安装calico 网络 @@ -168,18 +144,6 @@ tcp 0 0 192.168.1.66:179 192.168.1.34:40243 ESTABLISHED tcp 0 0 192.168.1.66:179 192.168.1.63:48979 ESTABLISHED 28479/bird ``` -**查看集群ipPool情况** - -``` bash -calicoctl get ipPool -o yaml -- apiVersion: v1 - kind: ipPool - metadata: - cidr: 172.20.0.0/16 - spec: - nat-outgoing: true -``` - **查看etcd中calico相关信息** 因为这里calico网络使用etcd存储数据,所以可以在etcd集群中查看数据 @@ -200,4 +164,3 @@ ETCDCTL_API=3 etcdctl --endpoints="http://127.0.0.1:2379" get --prefix /calico/i etcdctl --endpoints=http://127.0.0.1:2379 --ca-file=/etc/kubernetes/ssl/ca.pem ls /calico ``` -[前一篇](06-安装kube-node节点.md) -- [后一篇]() diff --git a/docs/06-安装flannel网络组件.md b/docs/06.flannel.md similarity index 94% rename from docs/06-安装flannel网络组件.md rename to docs/06.flannel.md index 6579733..ca34b9e 100644 --- a/docs/06-安装flannel网络组件.md +++ b/docs/06.flannel.md @@ -1,8 +1,6 @@ ## 06-安装flannel网络组件.md -** 注意: ** 只需选择安装`calico` `flannel`其中之一,如果你已经安装了`calico`,请跳过此步骤。 - -关于k8s网络设计和CNI Plugin的介绍请阅读[安装calico](07-安装calico网络组件.md)中相关内容。 +本项目提供多种网络插件可选,如果需要安装flannel,请在/etc/ansible/hosts文件中设置变量 `CLUSTER_NETWORK="flannel"` `Flannel`是最早应用到k8s集群的网络插件之一,简单高效,且提供多个后端`backend`模式供选择;本文介绍以`DaemonSet Pod`方式集成到k8s集群,需要在所有master节点和node节点安装。 @@ -126,4 +124,3 @@ ping 172.20.1.5 ping 172.20.0.6 ``` -[前一篇](06-安装kube-node节点.md) -- [后一篇]() diff --git a/docs/06.kube-router.md b/docs/06.kube-router.md new file mode 100644 index 0000000..8b5842a --- /dev/null +++ b/docs/06.kube-router.md @@ -0,0 +1,107 @@ +# kube-router 网络组件 + +kube-router是一个简单、高效的网络插件,它提供一揽子解决方案: +- 基于GoBGP 提供Pod 网络互联(Routing) +- 使用ipsets优化的iptables 提供网络策略支持(Firewall/NetworkPolicy) +- 基于IPVS/LVS 提供高性能服务代理(Service Proxy) + +更多介绍请前往`https://github.com/cloudnativelabs/kube-router` + +## 配置 + +本项目提供多种网络插件可选,如果需要安装kube-router,请在/etc/ansible/hosts文件中设置变量 `CLUSTER_NETWORK="kube-router"` + +- kube-router需要在所有master节点和node节点安装 + +## 安装 + +- 单步安装已经集成:`ansible-playbook 90.setup.yml` +- 分步安装请执行:`ansible-playbook 06.network.yml` + +## 验证 + +- 1.pod间网络联通性:略 + +- 2.host路由表 + +``` bash +# master上路由 +root@master1:~$ ip route +... +172.20.1.0/24 via 192.168.1.2 dev ens3 proto 17 +172.20.2.0/24 via 192.168.1.3 dev ens3 proto 17 +... + +# node3上路由 +root@node3:~$ ip route +... +172.20.0.0/24 via 192.168.1.1 dev ens3 proto 17 +172.20.1.0/24 via 192.168.1.2 dev ens3 proto 17 +172.20.2.0/24 dev kube-bridge proto kernel scope link src 172.20.2.1 +... +``` + +- 3.bgp连接状态 + +``` bash +# master上 +root@master1:~$ netstat -antlp|grep router|grep LISH|grep 179 +tcp 0 0 192.168.1.1:179 192.168.1.3:58366 ESTABLISHED 26062/kube-router +tcp 0 0 192.168.1.1:42537 192.168.1.2:179 ESTABLISHED 26062/kube-router + +# node3上 +root@node3:~$ netstat -antlp|grep router|grep LISH|grep 179 +tcp 0 0 192.168.1.3:58366 192.168.1.1:179 ESTABLISHED 18897/kube-router +tcp 0 0 192.168.1.3:179 192.168.1.2:43928 ESTABLISHED 18897/kube-router + +``` + +- 4.NetworkPolicy有效性,验证参照[这里](guide/networkpolicy.md) + +- 5.ipset列表查看 + +``` bash +ipset list +... +Name: kube-router-pod-subnets +Type: hash:net +Revision: 6 +Header: family inet hashsize 1024 maxelem 65536 timeout 0 +Size in memory: 672 +References: 2 +Members: +172.20.1.0/24 timeout 0 +172.20.2.0/24 timeout 0 +172.20.0.0/24 timeout 0 + +Name: kube-router-node-ips +Type: hash:ip +Revision: 4 +Header: family inet hashsize 1024 maxelem 65536 timeout 0 +Size in memory: 416 +References: 1 +Members: +192.168.1.1 timeout 0 +192.168.1.2 timeout 0 +192.168.1.3 timeout 0 +... +``` + +- 6.ipvs虚拟服务器查看 + +``` bash +# 首先创建测试应用 +$ kubectl run nginx --image=nginx --replicas=3 --port=80 --expose + +# 查看ipvsadm输出 +$ ipvsadm +IP Virtual Server version 1.2.1 (size=4096) +Prot LocalAddress:Port Scheduler Flags + -> RemoteAddress:Port Forward Weight ActiveConn InActConn +TCP 10.68.0.1:https rr persistent 10800 # 这个kubernetes虚拟服务地址 + -> 192.168.1.1:6443 Masq 1 0 0 +TCP 10.68.199.39:http rr # 这个是测试应用nginx的虚拟服务地址 + -> 172.20.1.5:http Masq 1 0 0 + -> 172.20.2.6:http Masq 1 0 0 + -> 172.20.2.8:http Masq 1 0 0 +``` diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml index c231b41..43a9d0a 100644 --- a/roles/docker/tasks/main.yml +++ b/roles/docker/tasks/main.yml @@ -1,4 +1,10 @@ ## ---------docker daemon配置部分----------- +- name: 准备docker相关目录 + file: name={{ item }} state=directory + with_items: + - "{{ bin_dir }}" + - /etc/docker + - name: 下载 docker 二进制文件 copy: src={{ base_dir }}/bin/{{ item }} dest={{ bin_dir }}/{{ item }} mode=0755 with_items: