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 暴露家里的网络服务的更多相关文章

  1. openstack第四章:neutron— 网络服务

    第四篇neutron— 网络服务 一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是 ...

  2. Docker Kubernetes Service 网络服务代理模式详解

    Docker Kubernetes  Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...

  3. openstack——neutron网络服务

    一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...

  4. Linux下网络服务的安全设置

    Linux下网络服务的安全设置      Linux操作系统由于其良好的稳定性.健壮性.高效性和安全性.正在成为各种网络服务的理想平台.各种网络应用在Linux系统上部有性能卓越的应用,例如,提供We ...

  5. OpenStack核心组件-neutron网络服务

    1. neutron 介绍 1.1 Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能 ...

  6. openstack核心组件--neutron网络服务(4)

    一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...

  7. OpenStack组件——Neutron网络服务(1)

    1.neutron 介绍: 1)Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...

  8. neutron网络服务

    一.neutron 介绍: 1. Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需 ...

  9. centOS7 通过nmtui和nmcli图形配置网络服务

    一.通过nmtui配置网络参数 Linux系统配置网络参数的方式有很多种,其中最简单最直接的方式就是直接修改网卡配置文件,但这种方式也很容易出错,比如说IPADDR.NETMASK.GATEWAY等参 ...

  10. openstack核心组件——neutron网络服务(8)

    云计算openstack核心组件——neutron网络服务(8)   一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云 ...

随机推荐

  1. 【Azure Storage Account Table】询问批量将存储账户中的表嵌入另一个账户中的办法

    问题描述 询问批量将存储账户中的表嵌入另一个账户中的办法? 问题解答 方式一:使用 AzCopy 使用Az copy做表格的导入导出,注意您需要使用Azcopy 7.3版本来实现对Table的操作,可 ...

  2. 【Azure 应用服务】在App Service中新建WebJob时候遇见错误,不能成功创建新的工作任务

    问题描述 在Azure App Service界面上,添加新的Web Job(工作任务)时,一直添加失败.无详细错误提示,在App Service的Activity Logs(活动日志)中,根本没有添 ...

  3. 【Azure 应用服务】App Service for Container中配置与ACR(Azure Container Registry)的RABC权限

    问题描述 在使用App Service for container时,在从ACR(Azure Container Registry)中获取应用的镜像时,需要使用对应的权限.默认情况为在ACR中启用Ad ...

  4. 《A Hierarchical Framework for Relation Extraction with Reinforcement Learning》论文阅读笔记

    代码 原文地址 摘要 现有的大多数方法在确定关系类型之前,需要先识别出所有的实体,这样就忽略了实体提及和关系类型之间的交互.本文提出了一种新颖的联合抽取范式,把相关实体看作是关系的参数( 首先检测一个 ...

  5. 使用Kubernetes搭建带有ik分词的Elasticsearch集群

    创建好带有Ik分词的es镜像,并上传到镜像仓库中,创建镜像可参考链接中的文档 https://www.cnblogs.com/hi-lijq/p/16895206.html 编写es_cluster- ...

  6. 【架构师视角系列】QConfig配置中心系列之Server端(三)

    声明 原创文章,转载请标注.https://www.cnblogs.com/boycelee/p/17993697 <码头工人的一千零一夜>是一位专注于技术干货分享的博主,追随博主的文章, ...

  7. Kafka的Controller

    控制器组件(Controller),是 Apache Kafka 的核心组件.它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群.集群中任意一台 Broker ...

  8. Codeforces Round 770 (Div. 2)(数学异或奇偶性)

    B. Fortune Telling 拿到题目看数据范围之后就知道暴力显然是来不及的. 那么只能找性质. \(考虑x和x+3的不同 \quad 奇偶性不同\) \(然后考虑两种操作对于一个数的奇偶性的 ...

  9. Java面经知识点图谱总结

    未完待续~~~

  10. HDFS分布式文件系统知识点梳理(一)

    HDFS分布式文件系统 一.HDFS简介 ​ HDFS是Hadoop Distribute File System,翻译成中文就是Hadoop 分布式文件系统,它是Hadoop的核心组成部分,是一个分 ...