Skip to content

Commit

Permalink
更新kube-router相关文档及清除脚本
Browse files Browse the repository at this point in the history
  • Loading branch information
gjmzj committed Jun 14, 2018
1 parent 1d737f6 commit deb9ede
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 93 deletions.
7 changes: 7 additions & 0 deletions 99.clean.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

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

Expand Down
45 changes: 0 additions & 45 deletions docs/06-安装kube-router网络组件.md

This file was deleted.

38 changes: 38 additions & 0 deletions docs/06-安装网络组件.md
Original file line number Diff line number Diff line change
@@ -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)
45 changes: 4 additions & 41 deletions docs/06-安装calico网络组件.md → docs/06.calico.md
Original file line number Diff line number Diff line change
@@ -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/
Expand Down Expand Up @@ -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 网络

Expand Down Expand Up @@ -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集群中查看数据
Expand All @@ -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) -- [后一篇]()
5 changes: 1 addition & 4 deletions docs/06-安装flannel网络组件.md → docs/06.flannel.md
Original file line number Diff line number Diff line change
@@ -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节点安装。

Expand Down Expand Up @@ -126,4 +124,3 @@ ping 172.20.1.5
ping 172.20.0.6
```

[前一篇](06-安装kube-node节点.md) -- [后一篇]()
107 changes: 107 additions & 0 deletions docs/06.kube-router.md
Original file line number Diff line number Diff line change
@@ -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
```
6 changes: 6 additions & 0 deletions roles/docker/tasks/main.yml
Original file line number Diff line number Diff line change
@@ -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:
Expand Down

0 comments on commit deb9ede

Please sign in to comment.