Traefik là một reverse proxy và load balancer hiện đại được thiết kế đặc biệt cho microservices và các môi trường container. Đây là một công cụ mã nguồn mở rất phổ biến trong cộng đồng DevOps và được sử dụng rộng rãi với Docker và Kubernetes.
Một số tính năng và điểm nổi bật của Traefik:
- Tự động phát hiện dịch vụ: Traefik có khả năng tự động phát hiện các dịch vụ mới khi chúng được triển khai, nhờ tích hợp sâu với Docker, Kubernetes và các hệ thống khác.
- Hỗ trợ HTTP/2 và gRPC: Traefik hỗ trợ cả HTTP/1.1, HTTP/2, và gRPC, giúp tối ưu hóa hiệu suất truyền tải dữ liệu giữa các dịch vụ.
- Chứng chỉ SSL/TLS tự động: Traefik tích hợp với Let’s Encrypt để tự động cấp và gia hạn chứng chỉ SSL/TLS, đảm bảo an toàn cho các kết nối HTTP.
- Tích hợp với các hệ thống giám sát: Traefik có thể tích hợp với Prometheus, Datadog, và các hệ thống giám sát khác để theo dõi hiệu suất và sức khỏe của các dịch vụ.
- Quản lý API và giao diện người dùng: Traefik cung cấp một giao diện người dùng đơn giản và trực quan để quản lý và giám sát các dịch vụ và đường dẫn mạng.
- Khả năng mở rộng: Với kiến trúc plug-in linh hoạt, Traefik có thể mở rộng để hỗ trợ nhiều tính năng và tích hợp khác nhau theo nhu cầu của người dùng.
1. Yêu cầu chuẩn bị
Để thực hiện anh em chuẩn bị cho mình một con máy ảo hoặc VPS hệ điều hành Ubuntu 18.04 LTS, Ubuntu 20.04 LTS hoặc Ubuntu 22.04 LTS.
Anh em nào mới bắt đầu thì có thể đăng kí một tài khoản trên DigitalOcean. Hiện tại có chương trình khuyến mãi tặng $200 dùng trong 60 ngày cho khách mới lần đầu đăng kí(lần trước là tặng $100). Mình có video hướng dẫn chi tiết quá trình đăng kí tại đây.
2. Cài đặt Traefik
Trước khi cài đặt Traefik. Anh em cài docker và docker compose theo scripts.
Tạo thư mục chứa cấu hình cài đặt Traefik.
mkdir traefik
cd traefik
Tạo file cấu hình docker-compose.yml
nano docker-compose.yml
version: '3'
services:
reverse-proxy:
image: traefik:v2.11
command: --configFile=/etc/traefik/traefik.yml
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./traefik.yml:/etc/traefik/traefik.yml
- ./acme.json:/acme.json
networks:
- traefik
networks:
traefik:
external: true
Trong đó:
- Ports: khai báo các cổng triển khai HTTP (80), HTTPS (443), và Traefik Dashboard (8080).
- Volumes: khai báo volumes lưu trữ traefik.yml và acme.json
- Networks: khai báo network.
Tạo file cấu hình traefik.yml
nano traefik.yml
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
certificatesResolvers:
myresolver:
acme:
email: [email protected]
storage: acme.json
httpChallenge:
entryPoint: web
providers:
docker:
exposedByDefault: false
Trong đó:
- ACME Configuration: Dùng cấu hình tự động HTTPS. Traefik sẽ giao tiếp với Let’s Encrypt để tạo và cấp mới chứng chỉ bảo mật SSL.
- email: email cấu hình Let’s Encrypt để gửi thông báo.
- storage: nơi lưu trữ chi file acme.json khi tạo và cấp mới chứng chỉ bảo mật SSL.
Tạo file cấu hình acme.json
touch acme.json
chmod 600 acme.json
Tạo network traefik
docker network create traefik
Cuối cùng, trong thư mục triển khai Traefik có các file sau
Khởi tạo và chạy traefik
docker-compose up -d
Kiểm tra container đã khởi tạo thành công hay chưa
docker ps
3. Bảo mật web services HTTPS với traefik reverse proxy
Triển khai một ví dụ Nginx service, dùng Traefik và bật nhãn truy cập bằng HTTPS.
Tạo thư mục nginx
mkdir nginx
cd nginx
Tạo file cấu hình docker compose triển khai
version: '3'
services:
nginx_test:
image: nginx
labels:
- "traefik.enable=true"
- "traefik.http.routers.nginx.rule=Host(`nginx.kienletv.com`)"
- "traefik.http.routers.nginx.entrypoints=websecure"
- "traefik.http.routers.nginx.tls=true"
- "traefik.http.routers.nginx.tls.certresolver=myresolver"
networks:
- traefik
networks:
traefik:
external: true
Ở đây, anh em chú ý trong phần labels
mình có khai báo Host là: nginx.kienletv.com
. Điều này có nghĩa ứng dụng Nginx service sẽ chạy bằng domain này. Và domain này anh em có thể mua trên Mắt Bão, Nhân Hoà, Inet… và trỏ IP về server VPS đang cài traefik này.
Khởi tạo và chạy Nginx service
docker-compose up -d
Kiểm tra ứng dụng đã khởi tạo
docker ps
Anh em thấy ứng dụng Nginx service đã được khởi tạo với cổng 80. Cổng này hoàn toàn không được expose ra bên ngoài mà chỉ dùng local trong network docker. Và traefik lúc này đóng vai trò là một reverse proxy.
Truy cập domain và kiểm tra
Mình đã vào được trang mặc định của Nginx service
Kiểm tra SSL của domain
Anh em thấy lúc này Traefik kết hợp Let’s Encrypt để tạo và cấp một chứng chỉ bảo mật SSL cho domain nginx.kienletv.com
Một ví dụ triển khai khác với WordPress service dùng Traefik và bật nhãn truy cập bằng HTTPS
Tạo thư mục wordpress
mkdir wordpress
cd wordpress
Tạo file cấu hình docker compose triển khai
nano docker-compose.yml
services:
db:
# We use a mariadb image which supports both amd64 & arm64 architecture
image: mariadb:10.6.4-focal
# If you really want to use MySQL, uncomment the following line
#image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
networks:
- traefik
wordpress:
image: wordpress:latest
volumes:
- wp_data:/var/www/html
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
labels:
- "traefik.enable=true"
- "traefik.http.routers.wordpress.rule=Host(`wordpress.kienletv.com`)"
- "traefik.http.routers.wordpress.entrypoints=websecure"
- "traefik.http.routers.wordpress.tls=true"
- "traefik.http.routers.wordpress.tls.certresolver=myresolver"
networks:
- traefik
networks:
traefik:
external: true
volumes:
db_data:
wp_data:
Khởi tạo và chạy WordPress service
docker-compose up -d
Kiểm tra ứng dụng đã khởi tạo
docker ps
Truy cập domain và kiểm tra
Lúc này, mình đã vào được domain và giao diện wordpress quen thuộc và bắt đầu thiết lập website mới.
Kiểm tra SSL của domain và thấy một chứng chỉ SSL được cấp bởi Let’s Encrypt tương tự như với domain nginx.kienletv.com
4. Lời kết
Qua bài viết này mình đã chia sẻ với anh em một giải pháp bảo mật web services với Traefik reverse proxy
. Ngoài ra cũng còn nhiều giải pháp khác như dùng nginx reverse proxy
hay NPM…Chúc anh em thành công!
5. Nguồn tham khảo
Một số nguồn tham khảo mình để bên dưới anh em đọc thêm
- https://doc.traefik.io/traefik/getting-started/quick-start/
- https://hub.docker.com/_/traefik
- https://github.com/korridor/reverse-proxy-docker-traefik
Cảm ơn tác giả