IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    ysicing (i@ysicing.me)发表于 2024-07-23 12:45:42
    love 0

    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 ID和Client 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最近的新功能



沪ICP备19023445号-2号
友情链接