介绍
```sh
本文档使用cilium(eBFP)+kube-router(BGP路由)模式,etcd使用的是外部集群,K8S ApiServer做了高可用。结合实际情况做调整
此模式优缺点:性能最好,缺点pod和非BGP节点无法通信,目前是Beta阶段,生产不推荐。
```
#### 安装cilium
配置cilium的访问etcd的secret
```sh
$ cd /opt/etcd/ssl #进入etcd证书目录
$ kubectl create secret generic -n kube-system cilium-etcd-secrets \ #创建cilium访问etcd的secret
--from-file=etcd-client-ca.crt=ca.pem \
--from-file=etcd-client.key=server-key.pem \
--from-file=etcd-client.crt=server.pem
```
helm安装cilium
```sh
$ helm repo add cilium https://helm.cilium.io/
$ export REPLACE_WITH_API_SERVER_IP=172.16.100.111
$ export REPLACE_WITH_API_SERVER_PORT=16443
$ helm install cilium cilium/cilium \
--version 1.9.10 \ #这里选择cilium 1.9.10
--namespace kube-system \
--set ipam.mode=kubernetes \ #指定PodCIDRs IPAM管理方案使用kubernetes
--set tunnel=disabled \ #关闭tunnel,开启路由模式
--set nativeRoutingCIDR=172.16.100.0/24 \ #本地网络
--set kubeProxyReplacement=strict \ #严格模式,完全用cilium替代kube-proxy
--set k8sServiceHost=$REPLACE_WITH_API_SERVER_IP \ #k8s ApiServer IP
--set k8sServicePort=$REPLACE_WITH_API_SERVER_PORT \ #k8s ApiServer Port
--set etcd.enabled=true \ #etcd开启
--set etcd.ssl=true \ #etcd ssl证书
--set "etcd.endpoints[0]=https://172.16.100.100:2379" \ #etcd 集群节点
--set "etcd.endpoints[1]=https://172.16.100.101:2379" \
--set "etcd.endpoints[2]=https://172.16.100.102:2379"
```
测试cilium网络
```sh
$ wget https://raw.githubusercontent.com/cilium/cilium/master/examples/kubernetes/connectivity-check/connectivity-check.yaml
$ sed -i 's/google.com/baidu.com/g' connectivity-check.yaml #测试外网的地址改成baidu.com
$ kubectl apply -f connectivity-check.yaml
```
查看pod的状态
```sh
kubectl get pods
NAME READY STATUS RESTARTS AGE
echo-a-dc9bcfd8f-hgc64 1/1 Running 0 9m59s
echo-b-5884b7dc69-bl5px 1/1 Running 0 9m59s
echo-b-host-cfdd57978-dg6gw 1/1 Running 0 9m59s
host-to-b-multi-node-clusterip-c4ff7ff64-m9zwz 1/1 Running 0 9m58s
host-to-b-multi-node-headless-84d8f6f4c4-8b797 1/1 Running 1 9m57s
pod-to-a-5cdfd4754d-jgmnt 1/1 Running 0 9m59s
pod-to-a-allowed-cnp-7d7c8f9f9b-f9lpc 1/1 Running 0 9m58s
pod-to-a-denied-cnp-75cb89dfd-jsjd4 1/1 Running 0 9m59s
pod-to-b-intra-node-nodeport-c6d79965d-w98jx 1/1 Running 1 9m57s
pod-to-b-multi-node-clusterip-cd4d764b6-gjvc5 1/1 Running 0 9m58s
pod-to-b-multi-node-headless-6696c5f8cd-fvcsl 1/1 Running 1 9m58s
pod-to-b-multi-node-nodeport-6cc4974fc4-6lmns 1/1 Running 0 9m57s
pod-to-external-1111-d5c7bb4c4-sflfc 1/1 Running 0 9m59s
pod-to-external-fqdn-allow-google-cnp-dcb4d867d-dxqzx 1/1 Running 0 7m16s
```
删除kube-proxy
```sh
$ kubectl -n kube-system delete ds kube-proxy #删除kube-proxy DaemonSet
$ kubectl -n kube-system delete cm kube-proxy
$ iptables-restore <(iptables-save | grep -v KUBE)
```
#### 安装kube-router(`使用BGP功能`)
```sh
$ curl -LO https://raw.githubusercontent.com/cloudnativelabs/kube-router/v0.4.0/daemonset/generic-kuberouter-only-advertise-routes.yaml
$ vim generic-kuberouter-only-advertise-routes.yaml #修改配置文件,只开启router
...
- "--run-router=true"
- "--run-firewall=false"
- "--run-service-proxy=false"
- "--enable-cni=false"
- "--enable-pod-egress=false"
- "--enable-ibgp=true"
- "--enable-overlay=true"
# - "--peer-router-ips=<CHANGE ME>"
# - "--peer-router-asns=<CHANGE ME>"
# - "--cluster-asn=<CHANGE ME>"
- "--advertise-cluster-ip=true" #宣告集群IP
- "--advertise-external-ip=true" #宣告svc外部ip,如果svc指定了external-ip则生效
- "--advertise-loadbalancer-ip=true"
...
```
部署kube-router
```sh
$ kubectl apply -f generic-kuberouter-only-advertise-routes.yaml
```
查看部署pod
```sh
$ kubectl get pods -n kube-system |grep kube-router
kube-router-dz58s 1/1 Running 0 2d18h
kube-router-vdwqg 1/1 Running 0 2d18h
kube-router-wrc4v 1/1 Running 0 2d18h
```
查看路由
```sh
$ ip route
default via 172.16.100.254 dev ens192 proto static metric 100
10.0.1.0/24 via 10.0.1.104 dev cilium_host src 10.0.1.104
10.0.1.104 dev cilium_host scope link
10.244.0.0/24 via 10.244.0.81 dev cilium_host src 10.244.0.81
10.244.0.81 dev cilium_host scope link
10.244.1.0/24 via 172.16.100.101 dev ens192 proto 17 #BGP路由
10.244.2.0/24 via 172.16.100.102 dev ens192 proto 17 #BGP路由
172.16.100.0/24 dev ens192 proto kernel scope link src 172.16.100.100 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
```