通过 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:
- Agents
- Services
- 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
本文由 东风微鸣技术博客 编写
- 资源共享, 天下为公
- 三人行, 必有我师焉
通过 Traefik Hub 暴露家里的网络服务的更多相关文章
- openstack第四章:neutron— 网络服务
第四篇neutron— 网络服务 一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是 ...
- Docker Kubernetes Service 网络服务代理模式详解
Docker Kubernetes Service 网络服务代理模式详解 Service service是实现kubernetes网络通信的一个服务 主要功能:负载均衡.网络规则分布到具体pod 注 ...
- openstack——neutron网络服务
一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...
- Linux下网络服务的安全设置
Linux下网络服务的安全设置 Linux操作系统由于其良好的稳定性.健壮性.高效性和安全性.正在成为各种网络服务的理想平台.各种网络应用在Linux系统上部有性能卓越的应用,例如,提供We ...
- OpenStack核心组件-neutron网络服务
1. neutron 介绍 1.1 Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能 ...
- openstack核心组件--neutron网络服务(4)
一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...
- OpenStack组件——Neutron网络服务(1)
1.neutron 介绍: 1)Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...
- neutron网络服务
一.neutron 介绍: 1. Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需 ...
- centOS7 通过nmtui和nmcli图形配置网络服务
一.通过nmtui配置网络参数 Linux系统配置网络参数的方式有很多种,其中最简单最直接的方式就是直接修改网卡配置文件,但这种方式也很容易出错,比如说IPADDR.NETMASK.GATEWAY等参 ...
- openstack核心组件——neutron网络服务(8)
云计算openstack核心组件——neutron网络服务(8) 一.neutron 介绍: Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云 ...
随机推荐
- 【Azure Function】在Function执行中遇见Timeout错误
问题描述 在Function执行中遇见Timeout错误: Microsoft.Azure.WebJobs.Host.FunctionTimeoutException /Timeout value o ...
- RocketMQ—RocketMQ集成SpringBoot
RocketMQ-RocketMQ集成SpringBoot 新建生产者的boot项目和消费者的boot项目,pom文件重点如下: <dependencies> <dependency ...
- Glide源码解析四(解码和转码)
本文基于Glide 4.11.0 Glide加载过程有一个解码过程,比如将url加载为inputStream后,要将inputStream解码为Bitmap. 从Glide源码解析一我们大致知道了Gl ...
- vmware虚拟机出现此电脑无法运行win11,虚拟机中安装win11系统教程
一.点击新建虚拟机 二.选择自定义安装 三.默认 四.选择win11镜像 五.选择windows 六.命名 七.勾选安全引导 八.两个处理器即可 九.最低4G内存,接下来一直默认点下一步即可 十.创建 ...
- CefSharp 开发触屏终端遇到的问题记录
一.背景 最开始准备使用的 Chromely 做一个终端机项目,本来以为挺顺利的一个事情折腾了两天半.由于无法直接控制窗体的属性,最后还是切换到 .NET Framework 4.8 + CefSha ...
- Python列表字典推导式
[一]语法 列表推导式可以利用列表,元组,字典,集合等数据类型,快速的生成一个特定需要的列表. 语法格式如下 [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]] [二]列表推导式 [ ...
- br 词根 分支 broad bread branch brother broom 看到abroad后查到的
br-分支 cl-集合 pater-父亲 br/other 兄弟-br/oom笤帚-br/eed繁殖-br/ood一窝-br/eak打破-br/anch分枝 cl/ash碰撞-class/ify分类- ...
- python处理txt文件常用方法总结
一 打开txt的正确方式 一般人会用到怎么快速打开txt,下面分享两种方式: f = open("data.txt","r") #设置文件对象 f.close( ...
- Kotlin学习快速入门(9)—— 密封类的使用
原文地址: Kotlin学习快速入门(9)-- 密封类的使用 - Stars-One的杂货小窝 代码逻辑中,很多时候我们会需要分支语句,来根据数据的情况走不同的处理逻辑,而密封类就是在这种情况下,方便 ...
- 【UE虚幻引擎】干货!UE修改分辨率的3种方法
虚幻引擎作为一款实时3D创作工具,在游戏.建筑.影视动画.虚拟仿真等领域受到全球各行各业创作者广泛欢迎,在UE中获取和设置分辨率也是3D创作开发工作中的常用功能.本文介绍了在虚幻引擎中修改分辨率的3种 ...