• 通过 Traefik Hub 暴露家里的网络服务


    Traefik Hub

    Traefik Hub 简介

    📚️Reference:

    你的云原生网络平台 -- 发布加固你的容器从未如此简单。 Traefik Hub 为您在 Kubernetes 或其他容器平台上运行的服务提供一个网关。

    Traefik Hub 定位:

    • 云原生网络平台

    它有 2 大核心功能,我这次体验感觉也是如此:

    • (易于)发布(以网站域名的形式发布容器服务)
    • (易于)加固 (HTTPS + 认证)

    Traefik Hub 主要功能

    发布

    部署 Hub 容器,选择你的服务,并在几秒钟内获得对你的容器的安全公共访问。

    安全加固

    通过安全的隧道访问你的容器,部署行业标准的认证,并自动化 TLS 证书管理。

    可伸缩

    从单一的 Kubernetes 或 Docker 集群开始,在你的集中式 Hub 仪表板上(将 Traefik Hub Agent) 无缝扩展到多个集群。

    Traefik Hub 工作原理

    Traefik Hub Diagram

    • 在你自己的 Kubernetes 或 Docker 集群中,安装 2 个 Traefik Hub 相关组件:
      • Traefik
      • Traefik Hub Agent(实际上是 3 个组件)
        • Hub Agent Auth Server
        • Hub Agent Controller
        • Hub Agent Tunnel
    • 当你对外发布服务的时候,Traefik Hub 会给你的服务分配一个唯一的域名 (DNS)
      • 你需要访问该域名的 HTTPS 协议
      • 然后 Traefik Hub 接收到请求,将请求通过 Traefik Hub 与你自己的 Traefik Hub Agent 之间建立的安全隧道,将请求转发给 Traefik Hub Agent
      • Traefik Hub Agent 再将请求转发给 Traefik, 最后流转到具体的服务

    Traefik Hub 的关联功能

    🖱️一键服务发布

    边缘的任何地方进行访问从未如此简单。对于每个发布的服务,Traefik Hub 提供了一个唯一的 DNS 名称,可以立即用于从互联网的任何地方访问该容器。

    一键服务发布

    🔒️加密隧道

    Traefik Hub 通过一个私有的、加密的隧道连接到你的集群。利用该隧道,你可以发布你的容器供外部访问,而不必担心复杂和不安全的公共 IP 或 NAT 配置。

    🎖️自动化证书管理

    Traefik Hub 将请求、更新和传播 ACME 证书到你所有的集群,以便所有服务保持一致的安全配置。

    🔑灵活地访问控制

    无论你使用哪种容器编排工具,都能保护和保障对你的服务的访问。Traefik Hub 支持 JSON 网络令牌(JWT)、Basic Auth.

    📺️集中化多集群管理仪表板

    在一个单一的窗口内,轻松地可视化所有关于你的所有集群、它们的配置以及服务性能和健康的入站流量的信息。

    技术细节

    支持的容器编排平台
    • Kubernetes
    • Docker
    • Docker Swarm
    支持的 Ingress Controller
    • Traefik Proxy 2.8
    内部技术
    • Let's Encrypt
    • 连接多路复用
    • 安全隧道

    Traefik Hub 快速安装

    申请 Traefik Hub 账号

    通过https://sso.hub.traefik.io/login 注册账号即可。

    连接一个新的 Agent

    正常登录后,界面如下图所示:

    点击按钮添加。

    这里我的环境是:

    • 家里的威联通 NAS (或树莓派) 上的 K3s

    所以接下来这一步选择:Kubernetes, 如下图。(除此之外,在这里还可以选择:docker docker compose docker swarm. 有能力的推荐 Kubernetes, 因为方便后续通过 SVC+Endpoint 把家里的其他服务发布出去。这里推荐轻量 Kubernetes 发行版:K3s -- 512MB 内存就能跑起来。)

    选择了 Kubernetes 之后,就会出来详细的步骤,如下图:

    在 K3s 上安装 Hub Agent 及相关组件

    📝Notes:

    我按照上图的步骤一步一步走,实际上还是碰到了很多次意外。下面会另起章节说明我这次碰到的问题和解决办法。

    安装 Traefik Proxy

    添加 Traefik proxy helm 仓库:

    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update
    
    • 1
    • 2

    安装 Traefik proxy:

    helm upgrade --install traefik traefik/traefik \
    --namespace hub-agent --create-namespace \
    --set=additionalArguments='{--experimental.hub,--hub}' \
    --set metrics.prometheus.addRoutersLabels=true \
    --set providers.kubernetesIngress.allowExternalNameServices=true \
    --set ports.web=null --set ports.websecure=null --set ports.metrics.expose=true \
    --set ports.traefikhub-tunl.port=9901 --set ports.traefikhub-tunl.expose=true --set ports.traefikhub-tunl.exposedPort=9901 --set ports.traefikhub-tunl.protocol="TCP" \
    --set service.type="ClusterIP" --set fullnameOverride=traefik-hub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    安装 Traefik Hub Agent

    添加 Traefik Hub Helm 仓库:

    helm repo add traefik-hub https://helm.traefik.io/hub
    helm repo update
    • 1

    安装 Traefik hub-agent

    helm upgrade --install hub-agent traefik-hub/hub-agent \
    --set token="" --namespace hub-agent \
    --create-namespace --set image.pullPolicy=Always --set image.tag=experimental
    
    • 1
    • 2
    • 3

    📝Notes

    Token 直接在 Traefik Hub 的界面上会给出。

    这样就安装成功了,共计安装了以下组件:

    • Traefik Proxy: 1 pod
    • Traefik Hub Agent
      • Hub Agent Auth Server: 3 pod
      • Hub Agent Controller: 1 pod
      • Hub Agent Tunnel: 1 pod

    后台安装完成,在页面上点击 Configuration Done:

    点击后跳转到如下界面,还是很形象的:

    我把我的这个 Agent 重命名为:nas-k3s, 如下:

    Traefik Hub 页面速览

    Traefik Hub 页面还是很简洁的,这是首页 - Dashboard:

    1. Agents
    2. Services
    3. Access Control Policies

    Agents 页面:

    Services 页面:

    Access Control 页面:

    通过 Traefik Hub 暴露边缘服务

    暴露 Kubernetes 集群中的服务

    Traefik Hub Agent 会获取 Kubernetes 集群中的所有 services, 如果需要暴露,直接选择就好,非常简单,如下图:

    等待 1min 左右,即可创建完毕:

    点击 URL 即可正常访问,真的是把复杂的边缘服务暴露简单化、标准化。👍️👍️👍️

    暴露边缘非 Kubernetes 服务

    在边缘端(家里), 我还有很多服务(如:Jellyfin、GOGS Git 仓库、Calibre-web 书库、NAS UI 等)是不在 Kubernetes 集群里的。该如何暴露?

    其实,Traefik Hub Agent 和 Traefik Hub 通过安全隧道联通了。而 Kubernetes 集群和边缘(家里)的内网也是联通的。那么其实 Traefik Hub 和 家里的内网就是通的。因此,可以使用 Kubernetes Service + Endpoint 的方式将家里的非 Kubernetes 服务配置为 Kubernetes 服务。实现通过 Traefik Hub 暴露出来。

    举例:暴露 Jellyfin 服务

    在 Kubernetes 集群中创建如下 Service 和 Endpoint:

    apiVersion: v1
    kind: Service
    metadata:
      name: jellyfin
      namespace: nas
      labels:
        app: jellyfin
    spec:
      ports:
        - name: ui
          protocol: TCP
          port: 8096
          targetPort: 8096
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: jellyfin
      namespace: nas
      labels:
        app: jellyfin
    subsets:
      - addresses:
          - ip: 192.168.1.23
        ports:
          - name: ui
            port: 8096
            protocol: TCP
    • 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

    然后和上一节同样的办法,将 Service: jellyfin 发布即可。

    发布后就可以通过 Traefik Hub 的 URL 来访问了:

    🎉🎉🎉

    Traefik Hub 安装过程中遇到的问题

    Helm 安装 Traefik Proxy 失败

    安装碰到的第一个问题是执行该命令后,提示渲染后的 yaml 文件有问题

    helm upgrade --install traefik traefik/traefik \
    --namespace hub-agent --create-namespace \
    --set=additionalArguments='{--experimental.hub,--hub}' \
    --set metrics.prometheus.addRoutersLabels=true \
    --set providers.kubernetesIngress.allowExternalNameServices=true \
    --set ports.web=null --set ports.websecure=null --set ports.metrics.expose=true \
    --set ports.traefikhub-tunl.port=9901 --set ports.traefikhub-tunl.expose=true --set ports.traefikhub-tunl.exposedPort=9901 --set ports.traefikhub-tunl.protocol="TCP" \
    --set service.type="ClusterIP" --set fullnameOverride=traefik-hub
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解决办法是用:helm template --debug 生成了一下,然后报错提示 Deployment 那边第 35 行语法有问题,发现渲染后的结果如下:

    ...
    spec:
      template:
        spec:
        - name: traefik:
    ...
    • 1
    • 2
    • 3
    • 4
    • 5

    结尾多了个: 出来,删除: 后,执行 kubectl apply -f 即可成功安装。

    发布的所有服务访问都报错 404

    碰到的第二个问题,是发布的所有服务访问都报错 404. 没有正常进行转发和跳转。

    个人认为应该是请求转到到 Traefik Proxy 后,Traefik Proxy 没有正常处理导致的。

    解决办法:

    查看 Traefik Proxy 的日志,发现有大量如下报错:

    E0918 13:01:08.566076       1 reflector.go:138] k8s.io/client-go@v0.22.1/tools/cache/reflector.go:167: Failed to watch *v1alpha1.ServersTransport: failed to list *v1alpha1.ServersTransport: serverstransports.traefik.containo.us is forbidden: User "system:serviceaccount:hub-agent:traefik-hub" cannot list resource "serverstransports" in API group "traefik.containo.us" at the cluster scope

      查看对应的 traefik-hub ClusterRole 权限,发现确实少了相应权限,修改 ClusterRole 添加相应权限即可:

      ...
      rules:
        - verbs:
            - get
            - list
            - watch
          apiGroups:
            - ''
          resources:
            - services
            - endpoints
            - secrets
        - verbs:
            - get
            - list
            - watch
          apiGroups:
            - extensions
            - networking.k8s.io
          resources:
            - ingresses
            - ingressclasses
        - verbs:
            - update
          apiGroups:
            - extensions
            - networking.k8s.io
          resources:
            - ingresses/status
        - verbs:
            - get
            - list
            - watch
          apiGroups:
            - traefik.containo.us
          resources:
            - ingressroutes
            - ingressroutetcps
            - ingressrouteudps
            - middlewares
            - tlsoptions
            - tlsstores
            - traefikservices
            - serverstransports
      ...
      • 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

      配置完成后即可正常访问。

      总结

      Traefik 近期新出了一个叫做 Traefik Hub 的边缘网关 SaaS 服务,很有意思。可以很轻松地把家里位于 nat 后面的 IP 地址和服务暴露出来。今天刚试了下把 NAS UI 和 Jellyfin 暴露出来,效果不错。

      屏蔽了复杂的 tunnel、vpn、tcpoverudp、ssl、dns、域名。.., 将边缘网关的发布和加密:简单化、标准化。

      • 简单在于就做 2 件事: 发布和安全加固。
      • 标准在于架构的统一:

      Traefik Hub Diagram

      👍️👍️👍️.

      📚️参考文档

      本文由 东风微鸣技术博客 编写

      • 资源共享, 天下为公
      • 三人行, 必有我师焉
    • 相关阅读:
      iOS面试准备 - ios篇
      java毕业设计点餐系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
      PreferenceScreen 中如何自定义SwitchPreferenceCompat的布局
      mysql锁相关的总结
      Java项目:SSM医药信息管理系统
      Flutter教程之为什么 Flutter 是创业的最佳选择?
      AD敷铜报polygon not repour after edit[已解决]
      html5里引用vue.js,实现自定义组件,子父组件相互传参
      当下,产业园区发展面临的十大问题
      linux设备模型:sysfs(kobject)解析
    • 原文地址:https://blog.csdn.net/east4ming/article/details/127958795