ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

在 Docker Swarm 中部署 Traefik v3 代理:完整配置指南(HTTP/HTTPS 入口、Dashboard 鉴权与可观测性)

在 Docker Swarm 中部署 Traefik v3 代理:完整配置指南(HTTP/HTTPS 入口、Dashboard 鉴权与可观测性) 在 Docker Swarm 中部署 Traefik v3 代理完整配置指南HTTP/HTTPS 入口、Dashboard 鉴权与可观测性【免费下载链接】traefikThe Cloud Native Application Proxy项目地址: https://gitcode.com/GitHub_Trending/tr/traefik本指南以官方 Swarm 教程为主体逐步讲解如何把 Traefik v3 作为Swarm Service通过docker stack deploy部署到 Docker Swarm 集群启用 Swarm Provider 完成服务发现、暴露 web/websecure 两个入口点、强制 HTTP→HTTPS 跳转、用 basic-auth 保护 Dashboard、以自签名证书终结 TLS并部署 whoami 演示服务验证全链路。读完你将从零搭建一套可用于本地多节点 Swarm 的、带 HTTPS 与可观测性能力的反向代理栈并掌握后续扩展 Lets Encrypt、Prometheus 指标、OTel 链路追踪和访问日志的配置方法。该指南的结构与单机 Docker 教程保持一致可对照阅读其核心差异在于Swarm 模式下配置发现由Swarm Provider而非 Docker Provider完成服务标签需要写在deploy.labels中端口发布必须使用长语法且服务发现的对象从容器变为服务。准备工作Prerequisites开始之前请确认环境满足以下条件Docker Engine 已初始化Swarm 模式docker swarm init或已加入一个现有 Swarm 集群docker compose命令可用仅用于校验 compose 文件主机上安装了openssl生成自签名证书主机上安装了htpasswd生成 basic-auth 口令哈希通常随apache2-utils/httpd-tools提供。本教程的典型目标环境是本地多节点开发 Swarm没有可信 CA因此使用*.swarm.localhost的自签名证书即可满足验证需求。生产环境请改用受信任 CA 签发的证书或启用 Lets Encrypt见后文扩展配置。第一步生成自签名证书要让 Traefik 在本地提供 HTTPS 服务首先需要一份证书。生产环境应使用受信任 CA 签发的证书而对于多节点开发 Swarm用 openssl 快速生成一张自签名证书即可mkdir -p certs openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout certs/local.key -out certs/local.crt \ -subj /CN*.swarm.localhost参数说明-x509直接输出自签名 X.509 证书而非 CSR-nodes私钥不加密便于容器内直接读取-days 365证书有效期一年-newkey rsa:2048同时生成 2048 位 RSA 私钥-subj /CN*.swarm.localhost主题通用名为通配符域名覆盖后面用到的dashboard.swarm.localhost与whoami.swarm.localhost。生成的certs/local.crt与certs/local.key将以只读方式挂载进 Traefik 容器见 compose 文件中的volumes并由动态配置文件dynamic/tls.yaml引用。第二步生成 Dashboard 的 basic-auth 凭证Traefik 的 basic-auth 中间件会校验一组用户名:口令哈希。使用 htpasswd 生成admin用户的口令并用sed把$转义为$$Compose / 环境变量的取值语法需要双重转义htpasswd -nb admin Pssw0rd | sed -e s/\$/\$\$/g复制命令的完整输出形如admin:$$apr1$$…稍后粘贴到中间件的 label 中。安全提示口令哈希直接以明文形式存放在 service label 中。这对本地开发没问题但任何能访问 Docker API 的人都可以用docker service inspect查看到它。生产环境请改用更安全的密钥存储方式如 Docker Secrets 文件提供者加载本仓库的 Swarm provider 参考文档中也强调了标签方式的能力边界。第三步编写动态 TLS 配置与 docker-compose-swarm.yamlSwarm 使用docker stack deploy发布服务compose 文件可以任意命名本文沿用原教程的docker-compose-swarm.yaml。首先在项目目录下创建名为dynamic的文件夹并添加tls.yaml用于承载动态 TLS 配置证书文件的声明属于动态配置Swarm Provider 无法通过标签描述静态入口点因此以文件方式挂载# dynamic/tls.yaml tls: certificates: - certFile: /certs/local.crt keyFile: /certs/local.key在同一目录创建docker-compose-swarm.yamlservices: traefik: image: traefik:v3.7 networks: # 连接到 traefik_proxy 覆盖网络实现跨节点容器通信 - traefik_proxy ports: # 将 Traefik 的入口点暴露给 Swarm # Swarm 要求端口使用长语法声明。 - target: 80 # 容器端口Traefik web 入口点 published: 80 # 节点上对外暴露的主机端口 protocol: tcp # host 模式直接绑定到任务所在节点的 IP。 # ingress 模式使用 Swarm 路由网格跨节点负载均衡。 # 按你的负载均衡策略选择若外部已有 LBhost 模式通常更简单。 mode: host - target: 443 # 容器端口Traefik websecure 入口点 published: 443 # 主机端口 protocol: tcp mode: host volumes: # 挂载 Docker socket 供 Swarm provider 使用 # 必须在 manager 节点上运行才能通过 socket 访问 Swarm API - /var/run/docker.sock:/var/run/docker.sock:ro # Swarm API socket - ./certs:/certs:ro - ./dynamic:/dynamic:ro # Traefik 静态配置通过命令行参数传入 command: # HTTP 入口点 - --entrypoints.web.address:80 # 配置 HTTP 到 HTTPS 的重定向 - --entrypoints.web.http.redirections.entrypoint.towebsecure - --entrypoints.web.http.redirections.entrypoint.schemehttps - --entrypoints.web.http.redirections.entrypoint.permanenttrue # HTTPS 入口点 - --entrypoints.websecure.address:443 - --entrypoints.websecure.http.tlstrue # 挂载动态 TLS 文件 - --providers.file.filename/dynamic/tls.yaml # 提供者 # 启用 Docker Swarm provider而非 Docker provider - --providers.swarm.endpointunix:///var/run/docker.sock # 监听 Swarm 服务变化需要 socket 访问权限 - --providers.swarm.watchtrue # 推荐默认不暴露任何服务要求显式添加标签 - --providers.swarm.exposedbydefaultfalse # 指定 Traefik 用于连接服务的默认网络 - --providers.swarm.networktraefik_traefik_proxy # API 与 Dashboard - --api.dashboardtrue # 启用 Dashboard - --api.insecurefalse # 显式关闭非安全 API 模式 # 可观测性 - --log.levelINFO # 设置日志级别如 INFO、DEBUG - --accesslogtrue # 启用访问日志 - --metrics.prometheustrue # 启用 Prometheus 指标 deploy: mode: replicated replicas: 1 placement: # 放置约束限制 Traefik 任务可以运行的节点。 # 通常放在 manager 节点上以便通过 socket 访问 Swarm API。 constraints: - node.role manager # Traefik 动态配置通过标签定义 # 在 Swarm 中service 定义上的标签用于配置该服务的 Traefik 路由。 labels: - traefik.enabletrue # Dashboard 路由器 - traefik.http.routers.dashboard.ruleHost(dashboard.swarm.localhost) - traefik.http.routers.dashboard.entrypointswebsecure - traefik.http.routers.dashboard.serviceapiinternal - traefik.http.routers.dashboard.tlstrue # basic-auth 中间件 - traefik.http.middlewares.dashboard-auth.basicauth.usersPASTE_HASH_HERE - traefik.http.routers.dashboard.middlewaresdashboard-authswarm # 服务提示 - traefik.http.services.traefik.loadbalancer.server.port8080 # 部署 Whoami 演示应用 whoami: image: traefik/whoami networks: - traefik_proxy deploy: labels: # 为 Traefik 启用服务发现 - traefik.enabletrue # 定义 Whoami 的路由规则 - traefik.http.routers.whoami.ruleHost(whoami.swarm.localhost) # 在 HTTPS 入口点上暴露 Whoami - traefik.http.routers.whoami.entrypointswebsecure # 启用 TLS - traefik.http.routers.whoami.tlstrue # 向 Traefik 暴露 whoami 的端口号 - traefik.http.services.whoami.loadbalancer.server.port80 # 为 Swarm 定义覆盖网络 networks: traefik_proxy: driver: overlay attachable: true关键点提醒把PASTE_HASH_HERE替换为第二步生成的转义哈希Swarm 对端口必须使用长语法target/published/protocol/mode短语法会被忽略mode: host直接绑定节点 IPmode: ingress则走 Swarm 路由网格做跨节点分发标签必须放在deploy.labelsservices.traefik.labels容器标签在 Swarm 模式下不会被读取——这是与单机 Docker 教程最大的差异参考实现见 pkg/provider/docker/pswarm.go--providers.swarm.networktraefik_traefik_proxy中的前缀以docker stack deploy traefik发布且网络在 compose 内声明时Swarm 会为网络加上栈名前缀traefik_proxy即变为traefik_traefik_proxy若网络是预先手动创建的外部网络则保持原名两种方式见下节Traefik 需要明确它应通过哪个 overlay 网络解析服务 IP跨节点请求才能正确转发dashboard 中间件引用写作dashboard-authswarmswarm后缀显式声明中间件来源提供者是 Swarm Provider动态元素名带 provider 限定符Dashboard 路由将请求转发给内置服务apiinternalTraefik 自身 API默认监听 8080随后的 service 提示端口 8080 只是帮助明确负载均衡指向的端口。第四步发布 Stack先创建一次 overlay 网络若尚不存在然后发布栈docker network create --driver overlay --attachable traefik_proxy || true docker stack deploy -c docker-compose-swarm.yaml traefikSwarm 会依据放置约束把服务调度到 manager 节点并在节点上绑定 80/443 端口。docker stack services traefik、docker service ps traefik_traefik可以观察服务的滚动调度与运行状态若此前已手动创建了同名网络栈会直接复用该外部网络。第五步访问 Dashboard在浏览器打开https://dashboard.swarm.localhost/浏览器会提示证书不受信任自签名证书点选继续即可随后页面要求输入你在 htpasswd 步骤中配置的 basic-auth 凭据用户名admin、密码Pssw0rd。成功登录后即可看到路由、服务、中间件与入口点的实时概览若该页面正常展示说明证书加载、TLS 终结、Swarm Provider 服务发现、basic-auth 中间件与 apiinternal 转发整条链路都已打通。Dashboard 前端源码位于本仓库 webui通过内置 HTTP APIapiinternal默认:8080取数渲染。第六步测试 whoami 应用使用 curl 向 HTTPS 入口发起请求-k表示忽略自签名证书校验curl -k https://whoami.swarm.localhost/whoami 服务会原样回显收到的请求与头部信息Hostname: whoami-76c9859cfc-k7jzs IP: 127.0.0.1 IP: ::1 IP: 10.42.0.59 IP: fe80::50d7:a2ff:fed5:2530 RemoteAddr: 10.42.0.60:54148 GET / HTTP/1.1 Host: whoami.swarm.localhost User-Agent: curl/8.7.1 Accept: */* Accept-Encoding: gzip X-Forwarded-For: 10.42.0.1 X-Forwarded-Host: whoami.swarm.localhost X-Forwarded-Port: 443 X-Forwarded-Proto: https X-Forwarded-Server: traefik-644b7c67d9-f2tn9 X-Real-Ip: 10.42.0.1注意X-Forwarded-Proto: https与X-Forwarded-Port: 443这些是 Traefik 在 TLS 终结后附加到上游请求的转发头由 forwarded headers 机制注入证明请求确实经过了 websecure 入口点的 HTTPS 处理。再用 HTTP 入口请求同一域名验证重定向curl -k http://whoami.swarm.localhost Moved PermanentlyHTTP 请求被 301 永久重定向到 HTTPS说明 HTTP→HTTPS 跳转配置生效。也可以在浏览器直接访问 https://whoami.swarm.localhost 查看服务回显的 JSON 数据Swarm Provider 的底层实现与配置项为了用好这套配置有必要理解 Swarm Provider 的工作原理。从源码看Traefik 的 Swarm Provider 与 Docker Provider 共用同一实现目录 pkg/provider/docker其中 pswarm.go 声明了SwarmProviderprovider 注册名固定为swarm源码中的SwarmName swarmSetDefaults()pkg/provider/docker/pswarm.go给出的默认值为watchtrue、exposedByDefaulttrue、endpointunix:///var/run/docker.sock、refreshSeconds15s、默认规则模板Host(\{{ normalize .Name }})——这正是官方参考文档 Swarm Provider 参考 中默认值的来源启动后通过listServices枚举 Swarm 服务再用builder.build把服务标签翻译成动态配置watchtrue时以 15 秒间隔轮询服务列表Swarm 事件机制受限见源码注释对 docker/docker#23827 的说明并把新的动态配置推送给 Traefik 动态配置通道。由于默认暴露所有服务原教程刻意设置exposedbydefaultfalse并配合traefik.enabletrue显式开关这是生产环境的推荐姿势。常用配置项的默认值与说明可归纳如下完整表格见 providers/swarm.md字段默认值作用providers.swarm.endpointunix:///var/run/docker.sockDocker/Swarm API 端点也支持ssh://远程端点providers.swarm.watchtrue是否轮询监听 Swarm 服务变化providers.swarm.exposedByDefaulttrue默认是否暴露所有服务建议显式设为falseproviders.swarm.network连接所有服务的默认 overlay 网络可被traefik.swarm.network标签按服务覆盖providers.swarm.refreshSeconds15sSwarm 模式的轮询间隔providers.swarm.defaultRuleHost(\{{ normalize .Name }})未通过标签指定规则时的默认路由规则模板providers.swarm.constraints依据服务标签过滤的约束表达式providers.swarm.useBindPortIPfalse使用绑定端口的 IP/Port 而非容器内部网络地址标签的命名空间也遵循统一约定路由traefik.http.routers.name.*、中间件traefik.http.middlewares.name.*、服务traefik.http.services.name.*。Swarm 模式下如果某个服务只有一个且路由器未显式指定 service该服务会自动分配给该路由器。更多关键配置方向基础栈已可用下面补充几条最常见的高频扩展配置。所有示例都沿用 compose 文件的command参数或服务deploy.labels写法。证书自动管理Lets Encrypt / ACME要让websecure入口点自动签发可信的 HTTPS 证书启用 Lets EncryptACME证书解析器command: # ... - --certificatesresolvers.le.acme.emailyouexample.com - --certificatesresolvers.le.acme.storage/letsencrypt/acme.json - --certificatesresolvers.le.acme.httpchallenge.entrypointweb - --entrypoints.websecure.http.tls.certresolverle这里定义了一个名为le的证书解析器email用于注册 ACME 账户storage指向/letsencrypt/acme.json存放已签发证书httpchallenge.entrypointweb使用 HTTP-01 质询方式验证域名最后把websecure入口点的证书解析器指定为le。在 Swarm 中启用 ACME 有两点必须注意参考文档 certificate-resolvers/overview 与 acme/letsencrypt路径必须放在共享卷或 NFS上让所有节点都能读取证书Traefik 副本分布在多节点时证书存储必须全局一致记得在docker-compose-swarm.yaml的traefik服务中挂载/letsencrypt卷例如- letsencrypt:/letsencrypt。质询方式与各家 DNS 提供商的详细配置请查阅上述参考文档。Prometheus 指标Traefik 内部指标可暴露给 Prometheus 抓取。基础栈中已开启--metrics.prometheustrue这里给出进一步定制command: # 若使用独立指标入口点先定义它 - --entrypoints.metrics.address:8082 - --metrics.prometheustrue # 可选更换指标暴露所在的入口点默认是 traefik - --metrics.prometheus.entrypointmetrics # 为路由/服务附加标签到指标会提高基数 - --metrics.prometheus.addrouterslabelstrue指标端点默认位于traefik入口点即内部 API 端口 8080也可用专用入口点在独立的:8082上暴露/metrics从而与业务流量隔离。全部选项见 observability/metrics.mdTraefik 自带的 Grafana 仪表盘模板位于本仓库 contrib/grafana可直接导入使用。分布式追踪OpenTelemetry / OTel可以开启分布式追踪来跟踪请求在 Traefik 中的处理路径command: # ... - --tracing.oteltrue - --tracing.otel.grpcendpointotel-collector:4317前提是 Swarm 中存在一个 Traefik 可访问的OTel Collector并监听上述 gRPC 端点。完整的端点与协议配置见 observability/tracing.md仓库中 integration/fixtures/tracing/otel-collector-config.yaml 提供了一份可参考的 Collector 配置样例。访问日志Traefik 可以把进入的每个请求记录成访问日志便于排障与分析command: # ... 其他命令行参数 ... - --accesslogtrue # 启用访问日志到 stdout # 可选修改格式或输出文件输出文件需要挂载卷 - --accesslog.formatjson - --accesslog.filepath/path/to/access.log # 可选过滤日志 - --accesslog.filters.statuscodes400-599format支持默认CLF与json两种格式filters.statuscodes只保留指定状态码范围如400-599的记录用于聚焦错误请求。字段定义与过滤规则详见 logs-and-access-logs.md。验证与排障思路端口未绑定 / 无法访问确认 Traefik 任务确实调度到了node.role manager的节点且该节点上 80/443 未被占用路由 404检查目标服务的traefik.enabletrue与deploy.labels是否书写正确并确认traefik.http.services.name.loadbalancer.server.port指向了真实容器端口标签不生效Swarm 模式只读取deploy.labels容器级labels不会参与服务发现基础认证失败确认已用sed -e s/\$/\$\$/g转义哈希并且中间件名与路由器引用一致dashboard-authswarm跨节点转发失败确认--providers.swarm.network指向的 overlay 网络名正确栈内声明的网络会带栈名前缀且该网络对相关服务均attachable。结论至此你已经在 Docker Swarm 上运行起一套完整可用的 Traefik v3HTTPS 与 HTTP→HTTPS 自动跳转、basic-auth 保护的 Dashboard、自签名证书 TLS 终结、whoami 演示服务以及日志与 Prometheus 指标等基础可观测能力。随着 Swarm 规模增长你可以在此基础上叠加 Lets Encrypt 自动证书、更多中间件限流、重试、鉴权等或运行多副本 Traefik关于更复杂的生产部署考虑还可参考仓库内的企业级部署讨论 traefik-for-business-applications。对应源码与示例均可在当前仓库中找到便于对照深入学习。【免费下载链接】traefikThe Cloud Native Application Proxy项目地址: https://gitcode.com/GitHub_Trending/tr/traefik创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表