在现代的微服务架构中,对于请求的路由、负载均衡以及 SSL 证书的自动化管理变得至关重要。Traefik 正是一个为此而生的云原生反向代理和负载均衡器。
Traefik 是一个开源的、用 Go 编写的现代 HTTP 反向代理和负载均衡器,专为微服务而设计。它可以与大多数流行的容器和编排工具(如 Docker、Kubernetes 和 Swarm)无缝集成。Traefik 可以自动发现新的服务或容器,并为它们自动配置路由。
部署方式
优点
缺点
最简单的方式是采用 Docker 方式部署,如果是在 Kubernetes 中部署则采用 Ingress Controller 方式。这里采用 Docker-compose 进行管理,下面是对应的 docker-compose.yaml 文件。
对外提供服务的提前条件
[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。