关于运维:Nomad-系列NomadTraefikTailscale-集成实现零信任安全

6次阅读

共计 8342 个字符,预计需要花费 21 分钟才能阅读完成。

系列文章

  • Nomad 系列文章
  • Traefik 系列文章
  • Tailscale 系列文章

概述

终于到了令人启动的环节了: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 版本。在此版本之前,当与 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 协定实现加密的点对点连贯,这意味着只有您的专用网络上的设施能力互相通信。

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

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

  • MagicDNS: 应用短主机名作为域名间接拜访设施。如:http://raspberryhttp://raspberry.west-beta.ts.net
  • HTTPS 证书: 容许用户为其设施提供 TLS 证书。如下面的:raspberry.west-beta.ts.net 提供授信证书。能够通过 https://raspberry.west-beta.ts.net 拜访且浏览器显示平安的绿锁🔒标记。

默认状况下,Tailscale 节点之间的 (4 层)连贯通过端到端加密来爱护。然而,浏览器,Web API 和 Visual Studio Code 等产品并不知道这一点,并且能够依据以下事实正告用户或禁用性能:到您的尾网服务的 HTTP URL 看起来未加密,因为它们没有应用 TLS 证书。

而 Tailscale 在启用了:

  1. tailnet name
  2. MagicDNS
  3. HTTPS 证书

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

在这次集成中,咱们应用 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

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

curl -fsSL https://tailscale.com/install.sh | sh

更多装置形式,请参见:Traefik Nomad Service Discovery Routing – Traefik

这里不做具体介绍。

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 块配置,具体配置如下:

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" {: 如 前一篇文章 所述,配置 Nomad Host Volume

    • path = "/run/tailscale/tailscaled.sock": Tailscale Socket Host Path.
    • read_only = true: 只读。

运行 Traefik Job

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

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=:${NOMAD_PORT_http}": 指定 Traefik 的 web 端口为:NOMAD_PORT_http 环境变量,即:80. 地址为::80(监听全副地址)
      • "--entryPoints.websecure.address=:${NOMAD_PORT_https}": 指定 Traefik 的 websecure 地址为::443
      • "--entrypoints.traefik.address=:${NOMAD_PORT_admin}": 指定 Traefik 的 traefik 地址为::8080
      • "--providers.nomad=true": 启用 Traefik 与 Nomad 集成
      • "--providers.nomad.endpoint.address=http://100.99.99.99:4646": 指定 Nomad Server 地址
      • "--certificatesresolvers.tailscaleresolver.tailscale=true": 启用 Traefik 与 Tailscale 集成。创立一个 Traefik Resolver 名为:tailscaleresolver, 且和 Tailscale 集成。

运行该 Job:

nomad run traefik.hcl

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

至此,咱们实现了 Nomad+Traefik+Tailscale 的集成。🎉🎉🎉

验证 Nomad+Traefik+Tailscale 成果

通过 Traefik Dashboard 验证

首先,关上 Traefik Dashboard – http://100.99.99.99, 成果如下:

从上图能够看到:

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

创立 Nomad Service 验证

咱们基于 HashiCorp Nomad 官网提供的另一个 Demo 程序:HashiCups 来进行配置调整:

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 的以下内容:(内容有省略)

...
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 获取具体路由配置。
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 上展现如下:

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

△ 能够看到,Nomad 为 nginx service 主动调配的地址是:http://100.74.143.10:25061 端口是一个随机端口(我这里 Nomad 网络应用 host 模式,而不是 bridge 模式)

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

△能够看到,通过域名能够拜访到 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
  • Traefik Nomad Service Discovery Routing – Traefik
  • Load Balancing with Traefik | Nomad | HashiCorp Developer
  • Traefik Proxy Integrates with Hashicorp Nomad | Traefik Labs
  • Traefik Tailscale Documentation – Traefik
  • Download · Tailscale
  • Integrations · Tailscale
  • Traefik certificates on Tailscale · Tailscale
  • Deploy an App with Nomad Service Discovery | Nomad | HashiCorp Developer

三人行, 必有我师; 常识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

正文完
 0