乐趣区

关于kubernetes:通过-Traefik-Hub-暴露家里的网络服务

Traefik Hub 简介

📚️Reference:

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

Traefik Hub 定位:

  • 云原生网络平台

它有 2 大外围性能,我这次体验感觉也是如此:

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

Traefik Hub 次要性能

公布

部署 Hub 容器,抉择你的服务,并在几秒钟内取得对你的容器的平安公共拜访。

平安加固

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

可伸缩

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

Traefik Hub 工作原理

  • 在你本人的 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

装置 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 页面速览

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

而后和上一节同样的方法,将 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

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

...
spec:
  template:
    spec:
    - name: traefik:
...

结尾多了个: 进去,删除: 后,执行 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
...

配置实现后即可失常拜访。

总结

Traefik 近期新出了一个叫做 Traefik Hub 的边缘网关 SaaS 服务,很有意思。能够很轻松地把家里位于 nat 前面的 IP 地址和服务裸露进去。明天刚试了下把 NAS UI 和 Jellyfin 裸露进去,成果不错。

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

  • 简略在于就做 2 件事:公布和平安加固。
  • 规范在于架构的对立:

👍️👍️👍️.

📚️参考文档

  • Traefik Hub, the Cloud Native Networking Platform
  • Traefik Hub: Publish & Secure Applications | Traefik Labs

本文由东风微鸣技术博客 EWhisper.cn 编写!

退出移动版