Traefik Hub
📚️Reference: 你的云原生网络平台 -- 发布和加固你的容器从未如此简单。 Traefik Hub 为您在 Kubernetes 或其他容器平台上运行的服务提供一个网关。
Traefik Hub 定位:
•云原生网络平台
它有 2 大核心功能,我这次体验感觉也是如此:
•(易于)发布(以网站域名的形式发布容器服务)•(易于)加固 (HTTPS + 认证)
部署 Hub 容器,选择你的服务,并在几秒钟内获得对你的容器的安全公共访问。
通过安全的隧道访问你的容器,部署行业标准的认证,并自动化 TLS 证书管理。
从单一的 Kubernetes 或 Docker 集群开始,在你的集中式 Hub 仪表板上(将 Traefik Hub Agent) 无缝扩展到多个集群。
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 提供了一个唯一的 DNS 名称,可以立即用于从互联网的任何地方访问该容器。
一键服务发布
Traefik Hub 通过一个私有的、加密的隧道连接到你的集群。利用该隧道,你可以发布你的容器供外部访问,而不必担心复杂和不安全的公共 IP 或 NAT 配置。
Traefik Hub 将请求、更新和传播 ACME 证书到你所有的集群,以便所有服务保持一致的安全配置。
无论你使用哪种容器编排工具,都能保护和保障对你的服务的访问。Traefik Hub 支持 JSON 网络令牌(JWT)、Basic Auth.
在一个单一的窗口内,轻松地可视化所有关于你的所有集群、它们的配置以及服务性能和健康的入站流量的信息。
•Kubernetes•Docker•Docker Swarm
•Traefik Proxy 2.8
•Let's Encrypt•连接多路复用•安全隧道
通过https://sso.hub.traefik.io/login 注册账号即可。
正常登录后,界面如下图所示:
点击按钮添加。
这里我的环境是:
•家里的威联通 NAS (或树莓派) 上的 K3s
所以接下来这一步选择:Kubernetes
, 如下图。(除此之外,在这里还可以选择:docker
docker compose
docker swarm
. 有能力的推荐 Kubernetes, 因为方便后续通过 SVC+Endpoint 把家里的其他服务发布出去。这里推荐轻量 Kubernetes 发行版:K3s -- 512MB 内存就能跑起来。)
选择了 Kubernetes 之后,就会出来详细的步骤,如下图:
📝Notes: 我按照上图的步骤一步一步走,实际上还是碰到了很多次意外。下面会另起章节说明我这次碰到的问题和解决办法。
安装 Traefik Proxy
添加 Traefik proxy helm 仓库:
helm repo add traefik https://helm.traefik.io/traefik
helm repo update
安装 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
安装 Traefik Hub Agent
添加 Traefik Hub Helm 仓库:
helm repo add traefik-hub https://helm.traefik.io/hub
helm repo update
安装 Traefik hub-agent
helm upgrade --install hub-agent traefik-hub/hub-agent \
--set token="<your-token>" --namespace hub-agent \
--create-namespace --set image.pullPolicy=Always --set image.tag=experimental
📝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 页面还是很简洁的,这是首页 - Dashboard:
1.Agents2.Services3.Access Control Policies
Agents 页面:
Services 页面:
Access Control 页面:
Traefik Hub Agent 会获取 Kubernetes 集群中的所有 services, 如果需要暴露,直接选择就好,非常简单,如下图:
等待 1min 左右,即可创建完毕:
点击 URL 即可正常访问,真的是把复杂的边缘服务暴露简单化、标准化。👍️👍️👍️
在边缘端(家里), 我还有很多服务(如: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
然后和上一节同样的办法,将 Service: jellyfin 发布即可。
发布后就可以通过 Traefik Hub 的 URL 来访问了:
🎉🎉🎉
安装碰到的第一个问题是执行该命令后,提示渲染后的 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
解决办法是用:helm template --debug
生成了一下,然后报错提示 Deployment 那边第 35 行语法有问题,发现渲染后的结果如下:
...
spec:
template:
spec:
- name: traefik:
...
结尾多了个:
出来,删除:
后,执行 kubectl apply -f
即可成功安装。
碰到的第二个问题,是发布的所有服务访问都报错 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
...
配置完成后即可正常访问。
Traefik 近期新出了一个叫做 Traefik Hub 的边缘网关 SaaS 服务,很有意思。可以很轻松地把家里位于 nat 后面的 IP 地址和服务暴露出来。今天刚试了下把 NAS UI 和 Jellyfin 暴露出来,效果不错。
屏蔽了复杂的 tunnel、vpn、tcpoverudp、ssl、dns、域名。.., 将边缘网关的发布和加密:简单化、标准化。
•简单在于就做 2 件事: 发布和安全加固。•标准在于架构的统一:
Traefik Hub Diagram
👍️👍️👍️
📝Notes: 不过目前 Traefik Hub SaaS 服务是实验阶段,所以可以免费使用。 后续随时可能收费。..
[1]
Traefik Hub, the Cloud Native Networking Platform: https://traefik.io/traefik-hub/
[2]
Traefik Hub: Publish & Secure Applications | Traefik Labs: https://traefik.io/blog/publish-and-secure-applications-with-traefik-hub/