Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

Nomad 系列-Nomad+Traefik+Tailscale 集成实现零信任安全

作者头像
东风微鸣
发布于 2023-09-14 07:00:48
发布于 2023-09-14 07:00:48
61800
代码可运行
举报
运行总次数:0
代码可运行

系列文章

•Nomad 系列文章[1]•Traefik 系列文章[2]•Tailscale 系列文章[3]

概述

终于到了令人启动的环节了:Nomad+Traefik+Tailscale 集成实现零信任安全

在这里:

•Nomad 负责容器调度;(容器编排工具)•Traefik 负责入口流量;(Ingress 工具)•Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。

Traefik 简介

Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易。

Traefik 可以与现有的多种基础设施组件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS、Nomad…)集成,并自动和动态地配置自己。

Traefik 与 Nomad Native Service 集成

2023 年 5 月初,Hashicorp 发布了 Nomad 1.3 版本[4]。在此版本之前,当与 Nomad 一起使用服务发现时,Traefik Proxy 用户必须同时使用 Hashicorp Consul 和 Nomad,以便从 Traefik Proxy 著名的自动配置中获益。现在,Nomad 有了一种简单直接的方法来使用内置的服务发现。这大大提高了直接可用性!不仅在简单的测试环境中,而且在边缘环境中。

Traefik 与 Tailscale 集成

从 Traefik Proxy 3.0 Beta 1 发布开始,Traefik Proxy 支持 Tailscale。当 Traefik 收到对 *.ts.net 站点的 HTTPS 请求时,它会从机器的本地 Tailscale 守护进程(实际是 Tailscale 的 socket) 获取 HTTPS 证书。并且证书不需要配置。

Traefik 小结

在这次集成中,我们使用 Traefik 作为 Nomad 集群中工作负载的 HTTP 反向代理和负载均衡,并通过 Nomad Native Service 和 Nomad 集成,通过 Traefik Resolver 与 Tailscale 集成。

Tailscale 简介

Tailscale 是一种 V(irtual)P(rivate)N(etwork) 服务,可以让您在世界任何地方安全、轻松地访问您拥有的设备和应用程序。它使用开源 WireGuard[5] 协议实现加密的点对点连接,这意味着只有您的专用网络上的设备才能相互通信。

Tailscale 快速可靠。与传统的 V(irtual)P(rivate)N(etwork) 不同,传统的通过中央网关服务器隧道传输所有网络流量,Tailscale 则是创建了一个对等 full-mesh 网状网络(称为 tailnet).

Tailscale 提供了一系列的额外实用功能,如:

MagicDNS: 使用短主机名作为域名直接访问设备。如:http://raspberryhttp://raspberry.west-beta.ts.netHTTPS 证书: 允许用户为其设备提供 TLS 证书。如上面的:raspberry.west-beta.ts.net 提供授信证书。可以通过 https://raspberry.west-beta.ts.net 访问且浏览器显示安全的绿锁🔒标志。

默认情况下,Tailscale 节点之间的 (4 层)连接通过端到端加密来保护。然而,浏览器,Web APIVisual Studio Code 等产品并不知道这一点,并且可以根据以下事实警告用户或禁用功能:到您的尾网服务的 HTTP URL 看起来未加密,因为它们没有使用 TLS 证书。

而 Tailscale 在启用了:

1.tailnet name[6]2.MagicDNS[7]3.HTTPS 证书[8]

后,便可以为每台 Tailscale 机器自动或手动生成证书。证书对应的域名如下:

Tailscale HTTPS Cert

在这次集成中,我们使用 Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。跨地域联通需要在 Nomad 上进行相关设置;4 层加密为默认提供的;HTTPS 证书则需要分别在 Nomad 以及 Traefik 上进行相关设置。

Nomad+Traefik+Tailscale 集成具体方案

•Tailscale 在多个相同或不同区域 Linux Node 上通过软件源安装;通过 systemd 启动;•Nomad 安装在这些 Linux Node 上,并指定网卡为 Tailscale 对应网卡 - tailscale0•Traefik 以 system 类型 job 的方式在 Nomad 上通过 Docker 运行。并与 Tailscale 和 Nomad 集成。

Nomad+Traefik+Tailscale 集成实施步骤

前提

•多台(最好在不同区域)的 Linux Node(本例中是 Ubuntu Node)•这些 Linux Node 最好 Hostname 各不相同•Nomad 前提:•Docker 已安装•Nomad 已安装(版本≥1.3, 越新越好)•Nomad 集群已创建并运行(至少包括 1 个 Server 和 1 个 Client)•Tailscale 前提:•已创建 Tailscale 账号•Tailscale 版本大于等于 1.14(越新越好)•MagicDNS 功能已启用•HTTPS 证书功能已启用•Traefik 前提:•Traefik Proxy 版本 ≥ 3.0 Beta 1

安装并运行 Tailscale

在每台机器上,运行以下命令安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -fsSL https://tailscale.com/install.sh | sh

更多安装方式,请参见:Traefik Nomad Service Discovery Routing - Traefik[9]

这里不做详细介绍。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo tailscale up

并登录 Tailscale.

Nomad Client 配置调整

Nomad Client 需要进行如下配置调整,以方便后续和 Tailscale 及 Traefik 集成:

1.配置 Tailscale Socket 作为 Nomad Host Volume(供 Docker 中的 Traefik 和 Tailscale 通信)2.配置网卡为 tailscale0, 使用 Tailscale 网络进行东西向通信。

修改 /etc/nomad.d/nomoad.hclclient 块配置,具体配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data_dir  = "/opt/nomad/data"
bind_addr = "0.0.0.0"

client {
  enabled = true
  servers = ["100.99.99.99"]
  network_interface = "tailscale0"
  host_volume "tailscale-socket" {
    path      = "/run/tailscale/tailscaled.sock"
    read_only = true
  }
}

具体说明如下:

servers = ["100.99.99.99"]: 指定 servers ip 列表为对应的 Servers 的 Tailscale IP 地址。后续该地址都要根据您的实际情况替换为 Nomad Server 的一个地址或所有地址列表。•network_interface = "tailscale0": 指定要强制进行网络指纹识别的接口的名称。在开发模式下运行时,默认为环回接口。不处于开发模式时,将使用连接到默认路由的接口。调度程序在为任务分配端口时从这些指纹 IP 地址中进行选择。这里指定 Nomad 使用 Tailscale 隧道网卡 tailscale0 作为网络指纹识别的接口。•host_volume "tailscale-socket" {: 如 前一篇文章[10] 所述,配置 Nomad Host Volume•path = "/run/tailscale/tailscaled.sock": Tailscale Socket Host Path.•read_only = true: 只读。

运行 Traefik Job

Traefik Job HCL - traefik.hcl 具体如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
job "traefik" {
  datacenters = ["dc1"]
  type        = "system"

  group "traefik" {

    network {
      port  "http"{
         static = 80
      }
      port "https" {
        static = 443
      }
      port  "admin"{
         static = 8080
      }
    }

    service {
      name = "traefik-http"
      provider = "nomad"
      port = "http"
    }

    service {
      name = "traefik-https"
      provider = "nomad"
      port = "https"
    }

    volume "tailscale-socket" {
      type      = "host"
      read_only = true
      source    = "tailscale-socket"
    }

    task "server" {
      driver = "docker"
      volume_mount {
        volume           = "tailscale-socket"
        destination      = "/var/run/tailscale/tailscaled.sock"
        read_only        = true
      }
      config {
        image = "traefik:v3.0"
        ports = ["admin", "http", "https"]
        args = [
          "--api.dashboard=true",
          "--api.insecure=true", ### For Test only, please do not use that in production
          "--entrypoints.web.address=:${NOMAD_PORT_http}",
          "--entryPoints.websecure.address=:${NOMAD_PORT_https}",  
          "--entrypoints.traefik.address=:${NOMAD_PORT_admin}",
          "--providers.nomad=true",
          "--providers.nomad.endpoint.address=http://100.99.99.99:4646", ### Tailscale IP to your nomad server 
          "--certificatesresolvers.tailscaleresolver.tailscale=true"
        ]
      }
    }
  }
}

详细说明如下:

•type = "system": 数据中心和节点池中的每个客户端都获得分配。类似于 K8s 的 Daemonset.•network {} Network 块,这里指定了 3 个静态端口(类似于 K8s 中的 HostSubnet), 即容器内和主机都监听:•http 端口 80•https 端口 443•admin Traefik admin 端口 8080 (因为底层是 Tailscale, 所以其实 HTTP 也是在 4 层透明加密过的)•service {} 2 个 Service 块,都是 Nomad Native Service. 分别是:•traefik-http 服务:指向 http 端口 - 80•traefik-https 服务:指向 https 端口 - 443•volume "tailscale-socket" { 通过 Nomad Host Volume 声明 Tailscale Socket•type = "host": Volume 类型为 Nomad Host Volume•read_only = true: Volume 级别 read_only 配置•source: source 指向 Nomad Client 的tailscale-socket, 即:/run/tailscale/tailscaled.sock path•driver = "docker": Traefik 实际在 Docker 中运行•volume_mount {: volume mount 配置:•destination = "/var/run/tailscale/tailscaled.sock": 将 Tailscale Socket 挂载到容器内 /var/run/tailscale/tailscaled.sock path.•config { docker 配置块。•image = "traefik:v3.0": 指定 traefik 镜像为:traefik:v3.0•ports = ["admin", "http", "https"]: 对外暴露的端口为:80, 443, 8080•args [: traefik 启动参数•"--api.dashboard=true": 启动 Traefik Dashboard•"--api.insecure=true": 仅供测试使用,请勿在生产环境中使用•"--entrypoints.web.address=:

运行该 Job:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nomad run traefik.hcl

则 Traefik 会部署到 Nomad 所有的 Client 上。

至此,我们完成了 Nomad+Traefik+Tailscale 的集成。🎉🎉🎉

验证 Nomad+Traefik+Tailscale 效果

通过 Traefik Dashboard 验证

首先,打开 Traefik Dashboard - http://100.99.99.99, 效果如下:

Traefik 集成 Nomad

从上图可以看到:

•Traefik 的版本是 3.0 Beta 1 以上,实际为:3.0.0-beta3•Traefik 监听的端口为:80, 443 和 8080•Traefik 已经和 Nomad 集成,Providers 显示为 Nomad.

创建 Nomad Service 验证

我们基于 HashiCorp Nomad 官方提供的另一个 Demo 程序:HashiCups[11] 来进行配置调整:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/hashicorp/learn-nomad-sd.git
cd learn-nomad-sd
git checkout tags/v0.1 -b nomad-hashicups-sd

修改 hashicups.hcl 的以下内容:(内容有省略)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
job "hashicups" {
  type   = "service"

  ...
  group "nginx" {
    network {
      port "nginx" {
        to = var.nginx_port
      }
    }
    task "nginx" {
      driver = "docker"
      service {
        name = "nginx"
        provider = "nomad"
        port = "nginx"
        tags = [
            "traefik.http.routers.hashicups.rule=Host(`firefly-sub03.west-beta.ts.net`)",
            "traefik.http.routers.hashicups.tls.certResolver=tailscaleresolver"
        ]
      }
      ...
    }
  }
}

具体说明如下:

to = var.nginx_port: 🐾注意,这里要从 static 改为 to, 避免 Host 端口冲突。Host 端口会随机分配一个端口。•service {: service 块,这里 provider = "nomad", Traefik 会通过 Nomad Server API 获取 Nomad Native Service, 并通过 tags 获取具体路由配置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tags = [
    "traefik.http.routers.hashicups.rule=Host(`firefly-sub03.west-beta.ts.net`)",
    "traefik.http.routers.hashicups.tls.certResolver=tailscaleresolver"
]

这里是 Traefik 的配置风格,Traefik 和 Nomad 集成时,Nomad tags 的配置和 Traefik docker 集成的配置风格是一模一样的。

traefik.http.routers.hashicups.rule=Host(...) 创建hashicups router. 并指定域名,这里我指定了我的一台 Nomad Client Node 的 Tailscale 完整域名:firefly-sub03.west-beta.ts.net. 其中 .west-beta.ts.net 是我的专属域,如果您要配置,请根据从 Tailscale Admin Console 获取到的域自行调整。firefly-sub03 是我的一台 Linux Node 的 hostname, 显然,这台 Node 上安装了:nomad client, tailscale, traefik.•"traefik.http.routers.hashicups.tls.certResolver=tailscaleresolver" 指定该 router 的 HTTP 证书解析方名称为:tailscaleresolver, 即 tailscale.

效果如下:

在 Traefik Dashboard 上展示如下:

Traefik Dashboard - hashicups router

△ 可以看到,通过 http://firefly-sub03.west-beta.ts.net/ 或 https://firefly-sub03.west-beta.ts.net/ 都可以访问到 Nomad 的 nginx service. 并且 TLS 启用,且 Resolver 是tailscaleresolver

Traefik Dashboard - hashicups nginx service

△ 可以看到,Nomad 为 nginx service 自动分配的地址是:http://100.74.143.10:25061 端口是一个随机端口 (我这里 Nomad 网络使用 host 模式,而不是 bridge 模式)

直接通过 TS 内网访问 https://firefly-sub03.west-beta.ts.net/ 如下:

HashiCups Demo with https cert

△可以看到,通过域名可以访问到 Hashicups, 并且该域名的 HTTPS 证书也是受信的。

🎉🎉🎉

总结

本文我们通过 Nomad+Traefik+Tailscale 集成实现零信任安全。

在这里:

•Nomad 负责容器调度;(容器编排工具)•Traefik 负责入口流量;(Ingress 工具)•Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。

具体来说,在这次集成中:

•使用 Traefik 作为 Nomad 集群中工作负载的 HTTP 反向代理和负载均衡,并通过 Nomad Native Service 和 Nomad 集成,通过 Traefik Resolver 与 Tailscale 集成。•使用 Tailscale 实现跨地域联通,4 层加密以及提供 HTTPS 证书。•跨地域联通需要在 Nomad 上进行相关设置;•4 层加密为默认提供的;•HTTPS 证书则需要分别在 Nomad 以及 Traefik 上进行相关设置。

并且,这套方案也特别适合边缘 Edge 环境:

•Nomad 为边缘集群提供了简单轻量的(容器)编排服务•Traefik 为边缘集群提供了 4 层 和 7 层的 负载均衡以及 7 层的 HTTP 代理服务•Tailscale 为边缘集群的"云" "边" "端" 提供了隧道打通,实现网络连接和边缘网络加密。并自动为 HTTPS 提供受信证书。

📚️参考文档

•Traefik Proxy Integrates with Hashicorp Nomad | Traefik Labs[12]•Traefik Nomad Service Discovery Routing - Traefik[13]•Load Balancing with Traefik | Nomad | HashiCorp Developer[14]•Traefik Proxy Integrates with Hashicorp Nomad | Traefik Labs[15]•Traefik Tailscale Documentation - Traefik[16]•Download · Tailscale[17]•Integrations · Tailscale[18]•Traefik certificates on Tailscale · Tailscale[19]•Deploy an App with Nomad Service Discovery | Nomad | HashiCorp Developer[20]

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-05 20:10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 东风微鸣技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Traefik-v2.x快速入门 顶
注意:Traefikv2.0之后的版本在修改了很多bug之后也增加了新的特性,比如增加了TCP的支持,并且更换了新的WEB UI界面
BGBiao
2019/09/29
1.1K0
Traefik-v2.x快速入门
                                                                            顶
Nomad 系列-Nomad 挂载存储卷
•容器存储接口(CSI)插件•Nomad 主机卷支持•Docker Volume 驱动程序
东风微鸣
2023/09/14
4080
Nomad 系列-Nomad 挂载存储卷
芜湖,Tailscale 开源版本让你的 WireGuard 直接起飞~
目前国家工信部在大力推动三大运营商发展 IPv6,对家用宽带而言,可以使用的 IPv4 公网 IP 会越来越少。有部分地区即使拿到了公网 IPv4 地址,也是个大内网地址,根本不是真正的公网 IP,访问家庭内网的资源将会变得越来越困难。
米开朗基杨
2022/04/11
8.3K1
芜湖,Tailscale 开源版本让你的 WireGuard 直接起飞~
Traefik入门
traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。至于使用它的原因则基于以下几点
码客说
2021/03/02
1.1K0
Traefik入门
Traefik-v2.x快速入门
traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。至于使用它的原因则基于以下几点
py3study
2020/04/16
4K1
解锁 Traefik v3.0 的强大特性:SPIFFE、Tailscale 和 HTTP/3
众所周知,在上个月重磅发布的 Traefik v3.0 版本,标志着云原生网关技术正式迈入了一个全新的纪元。这一里程碑版本囊括了诸多创新功能,旨在为用户提供卓越的安全性、出众的性能表现,以及无与伦比的易用体验。
Luga Lee
2024/11/01
1600
解锁 Traefik v3.0 的强大特性:SPIFFE、Tailscale 和 HTTP/3
手把手搭建一个容器化+代理网关+可视化管理环境
创建名称为 traefik 的 Docker 网络环境,后续 Traefik 和需要代理的应用容器都需要部署在该网络环境下才可以被访问到
gopher云原生
2021/10/18
1.3K0
Nomad系列-Nomad网络模式
Nomad 的网络和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前后)或是否集成 Consul 及 CNI 等不同组件也会导致网络模式各不相同. 本文详细梳理一下 Nomad 的主要几种网络模式
东风微鸣
2023/09/14
4830
Nomad系列-Nomad网络模式
Tailscale 构建私有网络访问家中设备
在此前,我都是通过一些硬件设备来构建一个私有网络,并且能有一个稳定的公网 IP,外部可以通过设备厂商对应的外部资源来构建一个私有网络,随时随地访问家中设备,如:NAS 。但,人生无常,大肠包小肠,最近很不稳定,于是准备了一个后手方案,防止意外。
LinkinStar
2023/10/18
1.5K0
一文搞定快速使用 Docker Compose 玩转 Traefik v2
Traefik 和 containers(容器)需要在同一网络上。Compose 会自动创建一个,但事实是隐藏的,以后可能会发生混乱。最好仅创建自己的网络并将其设置为每个 compose 文件中的默认网络。
为少
2021/05/27
7K0
一文搞定快速使用 Docker Compose 玩转 Traefik v2
Docker 环境下使用 Traefik 3 的最佳实践:快速上手
Traefik 最近终于发布了大版本升级后的第一个修正版本,或许是时候正式迁移程序到新版本了。
soulteary
2024/08/05
4820
Docker 环境下使用 Traefik 3 的最佳实践:快速上手
Nomad 系列-快速上手
•agent - 代理。Agent 是在 Server(服务器) 或 Client(客户端) 模式下运行的 Nomad 进程。•client - 客户端。Nomad 客户端负责运行分配给它的任务。它还向服务器注册自己,并监视要分配的任何工作。当运行代理时,客户端可以被称为节点 (Node)。•server - 服务器端。Nomad 服务器管理所有作业和客户端,监视任务,并控制哪些任务被放置在哪些客户端节点上。服务器之间相互复制数据以确保高可用性。•dev_agent - 开发(模式)代理是一种代理配置,它为运行 Nomad 的单节点集群提供了有用的默认值。它在服务器和客户端模式下运行,并且不会将其群集状态持久化到磁盘,这允许代理从可重复的干净状态启动,而不必在运行之间删除基于磁盘的状态。
东风微鸣
2023/09/14
8140
Nomad 系列-快速上手
你所不了解的 Traefik
在之前的文章中,我们简单介绍了关于 Traefik 的相关概念及组件原理机制,具体可参考:为什么选择 Traefik Ingress ?
Luga Lee
2021/11/18
9801
你所不了解的 Traefik
更简单的 Traefik 2 使用方式
经过一年多的实践,对于使用 Traefik 有了一些更深入的体会,本篇先来介绍如何简化使用,后续会逐步展开聊聊如何在云上使用这款“云原生”工具,以及结合它做一些提升业务效率和开发效率的实践。
soulteary
2020/12/02
1.3K0
Traefik 2 使用指南,愉悦的开发体验
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
soulteary
2020/01/28
1.6K0
能更好集成容器的反向代理工具Traefik的简单使用
Traefik 与 Nginx 一样,也是一款优秀的反向代理工具,使用 go 语言开发,本文将介绍怎样用 Traefik 来实现多服务转发的需求。
oec2003
2024/04/03
5530
能更好集成容器的反向代理工具Traefik的简单使用
Kubernetes生态Ingress组件Traefik v2.0浅析
上一篇文章简单介绍了下Kubernetes生态的几个组件,这篇文章重点讲解下其中的Traefik组件,Traefik组件类似与Nginx,可以为整个集群做服务暴露、域名控制等等的作用,目前Traefik主要分为两个版本,v1.x与v2.x,这两个版本之间差距较大,让人感觉在使用不同的软件。本篇文章是以v2.x版本为基础来演示的,相关脚本代码都在Github仓库https://github.com/lateautumn4lin/KubernetesResearch里面,大家使用的时候可以切换目录到ClusterEcology/initTraefik下面。
云爬虫技术研究笔记
2020/02/19
8250
下一代VPN工具:体验TailScale的简便和高效
tailscale管理端:https://login.tailscale.com/admin/machines
小尘要自信
2023/11/16
8.7K0
下一代VPN工具:体验TailScale的简便和高效
还不会Traefik?看这篇文章就够了!(文末送书)
暂且我们把Traefik当成和Nginx差不多的一类软件,待读完整篇文章,你就会对Traefik有不一样的认识。
没有故事的陈师傅
2021/11/12
4.1K0
还不会Traefik?看这篇文章就够了!(文末送书)
基于 Traefik 的加权灰度发布
众所周知,Traefik 是云原生生态中的一个爆款的反向代理和负载均衡器。我们无论如何定义、赞美它都不为过。毫无疑问,基于传统的反向代理组件而言,真正使 Traefik 与 Nginx,Haproxy 最为关键的不同之处在于其“开箱即用”的功能,即它的自适应和动态可配置性。不仅如此,相比较而言,Traefik 最为核心的部分可能是它做自动服务发现、灰度发布等能力。
Luga Lee
2021/11/19
1.7K1
基于 Traefik 的加权灰度发布
相关推荐
Traefik-v2.x快速入门 顶
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档