自学内容网 自学内容网

Traefik出口网关配置

前述

Traefik 是整个 NAS 外网入口的核心,从下图我们简单说一下从外至内访问的路径,用户访问 Gitea,实际是通过 Traefik 进行反代访问的 Gitea,Photoprism 和 Jellyfin 也是一样的。这仅仅是一个举例,其它很多 WEB 应用也是经过 Traefik 反代,当然您也可以使用 Nginx、APISIX、HAProxy 等 。

Traefik 简介

在现代的微服务架构中,对于请求的路由、负载均衡以及SSL证书的自动化管理变得至关重要。Traefik正是一个为此而生的云原生反向代理和负载均衡器。本文将为您简要介绍Traefik,它的部署方式以及它的优缺点。

什么是 Traefik?

Traefik是一个开源的、用Go编写的现代HTTP反向代理和负载均衡器,专为微服务而设计。它可以与大多数流行的容器和编排工具(如 Docker、Kubernetes 和 Swarm)无缝集成。Traefik可以自动发现新的服务或容器,并为它们自动配置路由。

部署方式

作为Docker容器运行: Traefik可以直接作为Docker容器来运行,利用Docker API进行服务发现。

在Kubernetes集群中运行: Traefik可以作为Kubernetes的 Ingress Controller来运行,从而自动发现并路由到集群中的服务。

使用其他编排工具:除了Docker和 Kubernetes,Traefik还支持许多其他编排解决方案,如 Swarm、Rancher等。

优点

 (1)动态配置:与其他反向代理不同,Traefik可以动态地发现并配置新的服务。无需手动修改配置文件并重新启动代理。

(2)自动SSL:Traefik可以与Let’s Encrypt集成,为您的服务自动提供和续订SSL证书。

(3)简单的配置:与其他解决方案相比,Traefik的配置更为简洁明了。

(4)丰富的中间件:Traefik提供了多种内置的中间件,如: 重试、基于路径的路由、基本认证等。

(5)高性能和轻量级:由于其Go的基础结构,Traefik是轻量级且高性能的。

缺点

学习曲线:对于那些习惯于传统的反向代理(如 Nginx 或 Apache)的人来说,Traefik 的某些概念可能需要一些时间来熟悉。

高级配置的复杂性:尽管基本配置相对简单,但高级用例可能会变得更为复杂。

总之 Traefik 是一个强大而灵活的反向代理和负载均衡器,特别适用于微服务架构。它的自动服务发现、动态配置和自动SSL管理使其成为现代应用部署的理想选择。如果您正在寻找一个现代、高性能的反向代理解决方案,那么Traefik绝对值得一试。

Traefik部署

因为在家用NAS中部署,所以采用Docker方式部署,如果是在Kubernetes中部署则采用 Ingress Controller方式。这里采用Docker-compose进行管理,下面是对应的docker-compose.yaml文件。

先说一下家用 NAS 部署Traefik,对外提供服务的提前条件:

(1) 一个自己的域名

(2)能够分配动态公网IP的带宽(可以找ISP提供商要求分配公网IP)

(3)Cloudflare平台账号,由Cloudflare接管您的域名解析,基于Cloudflare + Let’s Encrypt实际证书自动续期功能。

# 中间件及 SSL/TLS 证书相关配置
[root@demo traefik]# cat > config/dynamic.yaml << /EOF
tls:
  options:
    default:
      minVersion: VersionTLS12
      cipherSuites:
        - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384   # TLS 1.2
        - TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305    # TLS 1.2
        - TLS_AES_256_GCM_SHA384                  # TLS 1.3
        - TLS_CHACHA20_POLY1305_SHA256            # TLS 1.3
      curvePreferences:
        - CurveP521
        - CurveP384
      sniStrict: true
 
http:
  middlewares:
    SecHeaders:
      headers:
        forceSTSHeader: true
        stsIncludeSubdomains: true
        #stsSeconds: 31536000
        stsSeconds: 15768000 
        sslRedirect: true
        sslForceHost: true
EOF
 
[root@demo traefik]# cat > docker-compose.yaml << /EOF
version: "3"
 
services:
  traefik:
    privileged: true
    image: traefik:v2.10.1
    restart: always
    environment:
      CF_API_KEY: xxx # CloudFlare API EKY
      CF_API_EMAIL: xxx #  CloudFlare 注册邮箱地址
    stdin_open: true
    volumes:
      - /SSD/Demo/traefik/letsencrypt:/letsencrypt # 挂载证书存放目录
      - /var/run/docker.sock:/var/run/docker.sock
      - /SSD/Demo/traefik/config:/etc/traefik/config # 挂载traefik配置目录
    tty: true
    networks:
      - traefik_net
    ports:
      - 8880:8880/tcp
      - 1443:1443/tcp
      - 8085:8085/tcp
    command:
      - --providers.docker=true
      - --providers.file=true
      - --providers.docker.exposedByDefault=false
      - --api.debug=true
      - --api=true
      - --api.dashboard=true
      - --api.insecure=true
      - --accesslog=true
      - --entrypoints.traefik.address=:8085
      # - --entrypoints.dashboard.address=:8080
      #- --entrypoints.api.address=:8080
      - --entryPoints.web.address=:8880
      - --entryPoints.websecure.address=:1443 # HTTPS端口,家用带宽不提供443、80端口解析服务
      - --entrypoints.web.http.redirections.entryPoint.to=websecure
      - --entrypoints.web.http.redirections.entryPoint.scheme=https
      - --certificatesresolvers.myresolver.acme.dnschallenge.provider=cloudflare # 域名解析提供商
      - --certificatesresolvers.myresolver.acme.dnschallenge.delaybeforecheck=30
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.myresolver.acme.email= xxx@xxx.com # 设置一个let's encrypt 证书申请邮箱
      - --providers.file.directory=/etc/traefik/config
      - --providers.file.watch=true
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik_net"
      - "traefik.http.routers.dashboard.tls=true"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.entryPoints=websecure"
      - "traefik.http.routers.dashboard.tls.certresolver=myresolver"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.rockylinux.cn`) " # Traefik 使用的域名
      - "traefik.http.middlewares.dashboard-auth.basicauth.users=username:password" # 通过命令 htpasswd -nb username:password 加密
      - "traefik.http.routers.dashboard.middlewares=dashboard-auth@docker,SecHeaders@file"
      - "traefik.http.routers.dashboard.tls.domains[0].main=rockylinux.cn"
      - "traefik.http.routers.dashboard.tls.domains[0].sans=*.rockylinux.cn"
networks:
  traefik_net:
    external: true
EOF
 
# 启动 Traefik 服务
[root@demo traefik]# docker-compose up -d
 
# 确保启动服务正常
[root@demo traefik]# docker-compose ps

Docker启动正常以后,正常通过域名DNS解析或者绑定hosts解析,就可以打开对应Traefik Dashboard 了。如果需要从公网可以打开,首先手动在Cloudflare上创建一条A记录解析至动态公网IP(可以上路由器查看,或者curl ifconfig.me命令获取,然后路由器上开启1443端口DNAT至 Traefik 服务器的1443端口,最后打开Traefik Dashboard。


原文地址:https://blog.csdn.net/HWP18612324139/article/details/143693172

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!