k8s使用kube-router构建高可用可扩展ingress

简介

使用kube-router实现k8s集群的ingress功能,高可用易扩展

环境说明

本实验在已经安装配置好k8s集群基础之上进行实验,k8s安装参考博客其他文章。lab4作为一个路由器,转发lab5的请求

实验架构

1
2
3
4
5
lab1: master 11.11.11.111
lab2: node 11.11.11.112
lab3: node 11.11.11.113
lab4: router 11.11.11.114
lab5: client 11.11.11.115

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 本次实验重新创建了集群,使用之前测试其他网络插件的集群环境没有成功
# 可能是由于环境干扰,实验时需要注意

# 创建kube-router目录下载相关文件
mkdir kube-router && cd kube-router
rm -f generic-kuberouter-all-features-dsr.yaml
wget https://raw.githubusercontent.com/mgxian/kube-router/master/generic-kuberouter-all-features-dsr.yaml

# 启用pod网络通信,网络隔离策略,服务代理所有功能
# CLUSTERCIDR kube-controller-manager 启动参数 --cluster-cidr 的值
# APISERVER kube-apiserver 启动参数 --advertise-address 值
CLUSTERCIDR='10.244.0.0/16'
APISERVER='https://11.11.11.111:6443'
sed -i "s;%APISERVER%;$APISERVER;g" generic-kuberouter-all-features-dsr.yaml
sed -i "s;%CLUSTERCIDR%;$CLUSTERCIDR;g" generic-kuberouter-all-features-dsr.yaml

# 修改配置
containers:
- name: kube-router
image: cloudnativelabs/kube-router
imagePullPolicy: Always
args:
...
- --peer-router-ips=11.11.11.114
- --peer-router-asns=64513
- --cluster-asn=64512
- --advertise-external-ip=true
...

# 部署
kubectl apply -f generic-kuberouter-all-features-dsr.yaml

# 删除kube-proxy
kubectl -n kube-system delete ds kube-proxy

# 在每个节点上执行
# 如果是二进制安装使用如下命令
systemctl stop kube-proxy

# 在每个节点上执行
# 清理kube-proxy留下的规则
docker run --privileged --net=host registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy-amd64:v1.10.2 kube-proxy --cleanup

# 查看
kubectl get pods -n kube-system
kubectl get svc -n kube-system

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 测试之前请先安装配置好kube-dns或者coredns

# 启动用于测试的deployment
kubectl run nginx --replicas=2 --image=nginx:alpine --port=80
kubectl expose deployment nginx --type=NodePort --name=example-service-nodeport
kubectl expose deployment nginx --name=example-service

# 查看
kubectl get pods -o wide
kubectl get svc -o wide

# dns及访问测试
kubectl run curl --image=radial/busyboxplus:curl -i --tty
nslookup kubernetes
nslookup example-service
curl example-service

在lab4配置quagga

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 安装
yum install -y quagga

# 配置
cat >/etc/quagga/bgpd.conf<<EOF
! -*- bgp -*-
!
! BGPd sample configuratin file
!
! $Id: bgpd.conf.sample,v 1.1 2002/12/13 20:15:29 paul Exp $
!
hostname lab4
password password
!
router bgp 64513
bgp router-id 11.11.11.114
maximum-paths 4
neighbor 11.11.11.111 remote-as 64512
neighbor 11.11.11.112 remote-as 64512
neighbor 11.11.11.113 remote-as 64512
log stdout
EOF

# 启动
systemctl start bgpd
systemctl status bgpd
systemctl enable bgpd

# 查看路由信息
ip route

在lab4测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 在lab1上修改 example-service 配置 external ip
kubectl edit svc example-service
...
spec:
clusterIP: 10.111.34.147
externalIPs:
- 11.11.111.111
...

# 在lab1上查看svc信息
# 可以看到 example-service 有了 external ip
kubectl get svc

# 查看lab4路由
# 可以看到有 11.11.111.111 相关的路由
ip route

# 在lab4上访问测试
curl 11.11.111.111

在lab5测试

1
2
3
4
5
6
7
8
9
# 在lab5添加路由
ip route add 11.11.111.111 via 11.11.11.114
ip route

# 在lab5访问测试
curl 11.11.111.111

# 在lab1查看ipvs
ipvsadm -L -n

使用DSR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# DSR实验没有成功,实验环境是vagrant配合virtualbox
# 在lab1设置 example-service 使用 DSR 模式
# 服务的响应直接发送到客户端不经过lvs中转
kubectl annotate svc example-service "kube-router.io/service.dsr=tunnel"

# 在lab1查看ipvs
# 可以看到 Tunnel 转发类型
ipvsadm -L -n

# 在lab5访问测试
curl 11.11.111.111

# 在集群中的节点抓包分析
tcpdump -i kube-bridge proto 4

清理

1
2
3
# 清理
kubectl delete svc example-service example-service-nodeport
kubectl delete deploy nginx curl

参考文档