k3s集群私有负载均衡的另一种选择Tailscale
k3s 集群私有负载均衡的另一种选择 tailscale
在阅读此文实践前需要阅读 多云组网部署 k3s 集群的另一种选择 Tailscale
要求
- 基于 tailscale 实现 k3s 集群部署
- 有私有负载均衡场景
- 已经安装 helm
本文默认已经满足上述条件了。
历史选择
在 tailscale 之前,我是利用 MetalLB 实现负载均衡的,然后再由 tailscale 某个节点广播负载均衡路由的。
如今
在 tailscale v1.50 版本之后,增强了对 k8s 的支持,Kubernetes operator 诞生了,带来了很多新功能:
- 代理访问 k8s 控制平面 API
- 向 k8s 集群公开内部服务/k8s 集群服务暴露给内部(集群内部和集群外部互通有无,甚至是跨集群互通)
- 打通 saas 云服务
- 在 Kubernetes 上部署出口节点和子网路由控制器
其中 2、4 比较我用的比较多
安装部署
准备工作
- 编辑 ACL 策略, 新增如下配置
"tagOwners": {
"tag:k8s-operator": [],
"tag:k8s": ["tag:k8s-operator"],
},
- 创建 Oauth 客户端备用, 选择
Devices
读写权限,并绑定tag:k8s-operator
点击创建后,会弹出 Client ID
和 Client secret
记得留存一下,只会显示一次,后续步骤会使用
安装
- 添加到本地 Helm 存储库:
https://pkgs.tailscale.com/helmcharts
helm repo add tailscale https://pkgs.tailscale.com/helmcharts
- 更新
helm repo update
- 安装
helm upgrade \
--install \
tailscale-operator \
tailscale/tailscale-operator \
--namespace=tailscale \
--create-namespace \
--set-string oauth.clientId=<OAauth Client ID> \
--set-string oauth.clientSecret=<OAuth Client secret> \
--set-string operatorConfig.image.repository=ccr.ccs.tencentyun.com/k7scn/tailscale-k8s-operator \
--set-string proxyConfig.image.repository=ccr.ccs.tencentyun.com/k7scn/tailscale \
--wait
如果你的环境拉取镜像没问题的话,关于镜像部分可以去掉, 目前最新版本是 v1.68.1
operatorConfig.image.repository=ccr.ccs.tencentyun.com/k7scn/tailscale-k8s-operator
ccr.ccs.tencentyun.com/k7scn/tailscale
- 验证
等 pod 状态变成 ok 之后,可以在 tailscale 控制台机器里看到 tailscale-operator
节点,类似
使用
这里主要介绍 svc 负载均衡模式(即 ingress
模式)和 svc 子网路由配置,其他可以参考官网文档
负载均衡
其实这里最好的演示是 nginx-ingress-controller, 但是 bitnami 的 nginx-ingress-controller 不支持这个参数
默认已经安装好了 nginx-ingress-controller,这里我手动配置一下。
apiVersion: v1
kind: Service
metadata:
annotations:
meta.helm.sh/release-name: nginx-ingress-controller
meta.helm.sh/release-namespace: kube-system
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress-controller
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: nginx-ingress-controller
app.kubernetes.io/version: 1.10.1
helm.sh/chart: nginx-ingress-controller-11.3.8
name: nginx-ingress-controller-lb
namespace: kube-system
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: nginx-ingress-controller
app.kubernetes.io/name: nginx-ingress-controller
sessionAffinity: None
type: LoadBalancer
loadBalancerClass: tailscale
手动配置 loadBalancerClass
值为 tailscale
apply 生效后,查看 kubectl get svc -n kube-system
查看 tailscale 命令空间
当然除了这种方式外还支持给 Service 添加注解,更多详细请阅读官方文档 Expose a Kubernetes cluster workload to your tailnet (cluster ingress)
子网路由
之前说到,基于 tailscale 组网,会自动分发 pod 的路由,使你在 任何时间任何地点都可以访问pod的ip
,那如何实现访问 svc 的 ip 呢。
之前尝试过,在 k8s 节点分发额外分发 svc 的 ip, 会导致经常性网络问题,不知道大家有没有遇到类似问题?
也比较简单, 其中 10.25.0.0/16"
是我的集群 svc 的 cidr
apiVersion: tailscale.com/v1alpha1
kind: Connector
metadata:
name: ts-svc-cidrs
namespace: tailscale
spec:
hostname: ts-svc-cidrs
subnetRouter:
advertiseRoutes:
- "10.25.0.0/16"
等 pod 状态 ok,需要控制台 allow 一下(记得不是特别清楚是否需要可以确定一下)
在此之后,你也可以实现任何时间任何地点都可以访问 svc 的 ip 了。
总结
到这里 tailscale 在 k8s 上常用技能点就点完了,如果有其他感兴趣的,可以留言。后面大概还有两三篇讲讲 tailscale 最近的新功能