klipper + traefik 实现公网服务

目录


Traefik的代理服务器。 相较于Nginx,Traefik更加专注于流量整形,常被用作Kubernetes Ingress 是一个非常流程的云原生、API Gateway等角色。

年前使用k3s搭建了一个简陋的Kubernetes的集群,为了便于管理集群安装了KubeSphere。今天心血来潮打算使用全站加速访问KubeShpere,来看下Traefik Ingress是怎么工作的。Here we go…

一、Traefik 安装配置

k3s 默认安装了Taefik,如果没有安装或者希望安装最新版本 参照 https://doc.traefik.io/traefik/getting-started/install-traefik/#use-the-helm-chart。 这里建议独立安装来获取更多的自主性。

k3s 默认使用klipper-lb 作为负载均衡组件,这是一个使用iptables作为端口监听的轻量工具。

1. NodePort?

严格来说不算是NodePort,而是一种ServiceLB 的LowB方案,因为非云原生部署(穷且好奇心重),LB Endpoint复用了Node。架构如下

这个架构做到了基本可用,因为DNS修改的生效时间问题,作为一个好奇心奇重的人,怎么能忍受这种基本可用呢。

2.全站加速

全站加速是一种优化过的CDN,严格来说就是CDN,但这种产品一般支持的协议比较多,大多数云厂商Websocket加速都采用类似的产品,价格稍贵,人心不古啊。

基本架构如下

LoadBalaner 是怎么工作的

klipper-lb 做为负载均衡Daemonset,会在每个Node安装一个svclb-traefik Pod,在Node上做一个80端口的DNAT,将所有发来80/443的流量转发到Traefik 80/443端口上。traefik接受到请求后做7层转发。这就是Traefik的Ingress/IngressRoute 工作方式。


[root@k3s-master ~]# kubectl logs -f -n traefik svclb-traefik-wfmc2 lb-port-80
+ trap exit TERM INT
+ echo 10.43.108.196
+ grep -Eq :
+ cat /proc/sys/net/ipv4/ip_forward
+ '[' 1 '!=' 1 ]
+ iptables -t nat -I PREROUTING '!' -s 10.43.108.196/32 -p TCP --dport 80 -j DNAT --to 10.43.108.196:80
+ iptables -t nat -I POSTROUTING -d 10.43.108.196/32 -p TCP -j MASQUERADE
+ '[' '!' -e /pause ]
+ mkfifo /pause

[root@k3s-master ~]# kubectl get ds -n traefik
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
traefik 3 3 3 3 3 traefik=true 71d
svclb-traefik 4 4 4 4 4 <none> 71d

一些特殊的原因某些节点并不开启80/443端口甚至8080/8443也不可用,基于上面我们得到的经验,CDN回源使用 IP:PORT, PORT避开这些端口就可以了。也就是这些不开放80/443的节点上我们可以使用其他端口比如9990/9443。设置如下:

iptables -t nat -I PREROUTING '!' -s 10.43.108.196/32 -p TCP --dport 9980 -j DNAT --to 10.43.108.196:80
iptables -t nat -I PREROUTING '!' -s 10.43.108.196/32 -p TCP --dport 9443 -j DNAT --to 10.43.108.196:443

本着提高可用性的目的我们在看下klipper怎么处理的这些规则。

containers:
- env:
- name: SRC_PORT
value: "80"
- name: DEST_PROTO
value: TCP
- name: DEST_PORT
value: "80"
- name: DEST_IPS
value: 10.43.108.196
image: rancher/klipper-lb:v0.3.4
name: lb-port-80
ports:
- containerPort: 80
hostPort: 80
name: lb-port-80
protocol: TCP

呀哈,每个端口启动一个容器来注入iptales,我们也可以创建两个新的Container来处理我们的新规则。

- env:
- name: SRC_PORT
value: "9980"
- name: DEST_PROTO
value: TCP
- name: DEST_PORT
value: "80"
- name: DEST_IPS
value: 10.43.108.196
image: rancher/klipper-lb:v0.3.4
imagePullPolicy: IfNotPresent
name: lb-port-9980
ports:
- containerPort: 9980
hostPort: 9980
name: lb-port-9980
protocol: TCP
resources: {}
securityContext:
capabilities:
add:
- NET_ADMIN

修改完毕,就可以在CDN控制台修改了回源节点了。

总结

klipper 可靠行比较高,在一些低负载应用或者测试环境下可以尝试使用;

Traefik 作为Ingress功能丰富性要强于Nginx-Ingress;

参考