Nomad 系列-Nomad+Traefik+Tailscale

2023-09-07  本文已影响0人  东风微鸣

系列文章

概述

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

在这里:

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 提供了一系列的额外实用功能,如:

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

而 Tailscale 在启用了:

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

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

Tailscale HTTPS Cert

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

Nomad+Traefik+Tailscale 集成具体方案

Nomad+Traefik+Tailscale 集成实施步骤

前提

安装并运行 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
  }
}

具体说明如下:

运行 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"
        ]
      }
    }
  }
}

详细说明如下:

运行该 Job:

nomad run traefik.hcl

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

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

验证 Nomad+Traefik+Tailscale 效果

通过 Traefik Dashboard 验证

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

Traefik 集成 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"
        ]
      }
      ...
    }
  }
}

具体说明如下:

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 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 集成实现零信任安全。

在这里:

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

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

📚️参考文档

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

上一篇 下一篇

猜你喜欢

热点阅读