更新kube-router相关文档及清除脚本

pull/243/merge
gjmzj 2018-06-14 23:34:03 +08:00
parent 1d737f6477
commit deb9edeab8
8 changed files with 166 additions and 93 deletions

View File

@ -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

View File

@ -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 @@
<td><a href="docs/00-集群规划和基础参数设定.md">00-规划集群和安装概览</a></td>
<td><a href="docs/02-安装etcd集群.md">02-安装etcd集群</a></td>
<td><a href="docs/04-安装kube-master节点.md">04-安装master节点</a></td>
<td><a href="docs/06-安装calico网络组件.md">06-安装calico网络</a></td>
<td><a href="docs/06-安装网络组件.md">06-安装集群网络</a></td>
</tr>
<tr>
<td><a href="docs/01-创建CA证书和环境配置.md">01-创建证书和安装准备</a></td>
<td><a href="docs/03-安装docker服务.md">03-安装docker服务</a></td>
<td><a href="docs/05-安装kube-node节点.md">05-安装node节点</a></td>
<td><a href="docs/06-安装flannel网络组件.md">06-安装flannel网络</a></td>
<td></td>
</tr>
</table>

View File

@ -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)

View File

@ -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)

View File

@ -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) -- [后一篇]()

View File

@ -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) -- [后一篇]()

View File

@ -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
```

View File

@ -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: