k3s集群私有负载均衡的另一种选择Tailscale

本文最后更新于 183 天前, 如有失效请评论区留言.

k3s 集群私有负载均衡的另一种选择 tailscale

在阅读此文实践前需要阅读 多云组网部署 k3s 集群的另一种选择 Tailscale

要求

  • 基于 tailscale 实现 k3s 集群部署
  • 有私有负载均衡场景
  • 已经安装 helm

本文默认已经满足上述条件了。

历史选择

在 tailscale 之前,我是利用 MetalLB 实现负载均衡的,然后再由 tailscale 某个节点广播负载均衡路由的。

如今

在 tailscale v1.50 版本之后,增强了对 k8s 的支持,Kubernetes operator 诞生了,带来了很多新功能:

  • 代理访问 k8s 控制平面 API
  • 向 k8s 集群公开内部服务/k8s 集群服务暴露给内部(集群内部和集群外部互通有无,甚至是跨集群互通)
  • 打通 saas 云服务
  • 在 Kubernetes 上部署出口节点和子网路由控制器

其中 2、4 比较我用的比较多

安装部署

准备工作

  1. 编辑 ACL 策略, 新增如下配置
"tagOwners": {
		"tag:k8s-operator": [],
		"tag:k8s":          ["tag:k8s-operator"],
	},

  1. 创建 Oauth 客户端备用, 选择 Devices 读写权限,并绑定 tag:k8s-operator

点击创建后,会弹出 Client IDClient secret 记得留存一下,只会显示一次,后续步骤会使用

安装

  1. 添加到本地 Helm 存储库:https://pkgs.tailscale.com/helmcharts
helm repo add tailscale https://pkgs.tailscale.com/helmcharts
  1. 更新
helm repo update
  1. 安装
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
  1. 验证

等 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 最近的新功能

Sponsor

Like this article? $1 reward

Comments

老狼 ·v1 台湾台北 Reply

请教一下,你跨云的K3S集群用什么做存储?longhorn还是nfs?

ysicing 👨‍💻 ·v1 Reply

@老狼 都有在用,主要是local-path, 腾讯云节点用的cfs(nfs), 其他大带宽节点用的longhorn

老狼 ·v1 台湾台北 Reply

看来博主也是南京的。 请教一下,netbird博主有没有了解?最近对netbird比较感兴趣,基于wireguard的vpn,跟tailscale类似,但是routes这块感觉比tailscale好用。 k3s 使用tailscale组建多云集群,还是有点问题。

ysicing 👨‍💻 ·v1 Reply

@老狼 刚出的时候玩过,主要是tailscale可以自建控制端,与k3s集成特别好。我目前就是多云的🤔

老狼 ·v1 台湾台北 Reply

@ysicing netbird的distribute group 控制路由功能不错,我也是多云的。master在家里内网 k3s 用traefik 发布external ip 指向到家里的服务,经常会连不上。 tailscale自建控制端这点是挺好的,netbird也可以,但是比较复杂。 k3s tailscale 有点不稳。 准备走回老路使用iface 试试tailscale和operator发布路由试试

ysicing 👨‍💻 ·v1 Reply

@老狼 k3s内置tailscale集成了呀,控制节点不要用内网的,问题比较多,工作节点可以放家里。

老狼 ·v1 台湾台北 Reply

@ysicing 是的。控制节点准备改到公网去。 如果使用k3s内置集成tailscale,自动分发pod cidr,operator里面的subroute就不能用tailscale kb示例里面的10.40.0.0/14的了吧。

ysicing 👨‍💻 ·v1 Reply

@老狼 不需要,你只需要广播自己的svc的cidr就可以了