Trong bài viết này chúng ta sẽ cùng tìm hiểu về consul service discovery bằng cách triển khai Nginx service discovery sử dụng Hashicorp Consul.
Service discovery là một khái niệm mà mọi DevOps Engineer đều nên biết. Hơn hết là với các hệ thống microservices, service discovery đóng một vai trò hết sức quan trọng.
Và để học về Kubernetes thì việc nắm bắt được khái niệm về service discovery là bắt buộc vì kiến trúc của Kubernetes gồm thành phần chính là etcd có sử dụng service discovery.
Chuẩn bị
Để chuẩn bị cho bài lab này các bạn cần những công cụ sau:
- 4 Ubuntu servers. Bạn có thể tùy chọn dùng các phần mềm tạo VM local như VMware Player, Virtual Box, QEMU, ... hoặc sử dụng các server cloud để cài đặt
- Nếu bạn sử dụng Cloud Server, hãy cho phép các port của consul trong security group để các server có thể kết nối tới nhau nhé. (Hoặc mở all traffic cho lẹ)
Kiến trúc cài đặt
Cài đặt Consul Server
Chúng ta sẽ chạy 1 node Consul server cho bài lab này. Trong môi trường production, consul thường chạy theo cụm với ít nhất 3 node.
Bước 1: Log in vào consul server và cập nhật apt cache
sudo apt-get update -y
Bước 2: Thực hiện các command sau để cài đặt consul
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install consul
Bước 3: Kiếm tra version
consul --version
Bước 4: Tất cả các cấu hình của consul server nằm tại thư mục /etc/consul.d
. Giờ ta sẽ tạo file cấu hình từ đầu vậy nên hãy chuyển file cấu hình mặc định sang consul.hcl.back
sudo mv /etc/consul.d/consul.hcl /etc/consul.d/consul.hcl.back
Bước 5: Tạo file mới tên là consul.hcl
và thêm nội dung sau vào file.
sudo vi /etc/consul.d/consul.hcl
Thêm đoạn sau vào file:
"bind_addr" = "0.0.0.0"
"client_addr" = "0.0.0.0"
"data_dir" = "/var/consul"
"encrypt" = "ZENZNrsXU336Uma+S4XUj9sxvICj32N7XdEzrbYbRpY="
"datacenter" = "dc1"
"ui" = true
"server" = true
"log_level" = "INFO"
bind_addr
: Địa chỉ IP mà consul sẽ "bind" - lắng nghe trên. Khi có nhiều hơn 1 card mạng trên server thì tham số này sẽ giúp ta xác định consul sẽ lắng nghe trên card mạng nào.client_addr
: Địa chỉ IP mà consul agent sẽ lắng nghe.data_dir
: Thư mục lưu dữ liệu của consul.encrypt
: Khóa mã hóa dùng để mã hóa tất cả các traffic giao tiếp giữa các consul agent. Cần được bảo mật.datacenter
: Tên datacenter của consul agent. Một datacenter là một nhóm logic các consul agent trong mạng.ui
: Bật tính năng web-based Consul UI để dễ tương tác.server
: Nếutrue
thì agent này sẽ là consul server, tại các agent khác ta để nó là false.log_level
: Các log cùng level"INFO"
hoặc cao hơn mới được record.
Bước 6: Chạy consul server trong background dùng câu lệnh dưới. Ta sẽ dùng -dev
để ám chỉ ta muốn chạy 1 node duy nhất trong chế độ dev.
sudo nohup consul agent -dev -config-dir /etc/consul.d/ &
Bước 7: Truy cập <publicIP:8500>
của server của bạn, nếu nhìn được dashboard thì ta đã cài đặt thành công.
Cài đặt các Backend Server
Giờ ta đã có consul server, ta có thể cấu hình các Nginx backend server và đăng ký các node đó và Nginx service tới consul server (server registry).
Ta sẽ cài đặt Nginx và consul agent trong tất cả các node backend. Consul agent sẽ chịu trách nhiệm kết nối tới consul server, đăng ký chúng và đăng ký Nginx service tới server.
Thực hiện các bước sau dưới cả 2 servers:
Bước 1: Cập nhật package information
sudo apt-get update -y
Bước 2: Cài Nginx
sudo apt install nginx -y
Bước 3: Chỉnh sửa index.html
trong /var/www/html
để phân biệt từng server
cd /var/www/html
sudo vi index.html
Chỉnh sửa SERVER-01 và SERVER-02 để phân biệt 2 server
<!DOCTYPE html>
<html>
<head>
<title>Backend Server </title>
</head>
<body>
<h1>This is Backend SERVER-01</h1>
</body>
</html>
Bước 4: Cài đặt consul agent.
wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install consul
Bước 5: Chỉnh sửa consul.hcl
sudo mv /etc/consul.d/consul.hcl /etc/consul.d/consul.hcl.back
sudo vi /etc/consul.d/consul.hcl
Sau đó thay đổi nội dung file:
"server" = false
"datacenter" = "dc1"
"data_dir" = "/var/consul"
"encrypt" = "ZENZNrsXU336Uma+S4XUj9sxvICj32N7XdEzrbYbRpY="
"log_level" = "INFO"
"enable_script_checks" = true
"enable_syslog" = true
"leave_on_terminate" = true
"start_join" = ["34.222.141.217"]
Bước 6: Tạo backend.hcl
trong /etc/consul.d
để đăng ký Nginx service và health check URL tới consul server để thực hiện quản lý khả dụng của Nginx service.
sudo vi /etc/consul.d/backend.hcl
Nội dung như sau:
"service" = {
"Name" = "backend"
"Port" = 80
"check" = {
"args" = ["curl", "localhost"]
"interval" = "3s"
}
}
Validate file:
consul validate /etc/consul.d
Bước 7: Khởi động agent
sudo nohup consul agent -config-dir /etc/consul.d/ &
Hãy kiểm tra xem các node đã được đăng ký chưa
Cài đặt Load Balancer
Bước tiếp theo là cài đặt Load Balancer để cập nhật thông tin về các backend server từ consul server.
loadbalancer.conf
được sử dụng cho Nginx.Bước 1: Cài đặt unzip
sudo apt-get update -y
sudo apt-get install unzip -y
Bước 2: Cài đặt Nginx
sudo apt install nginx -y
Bước 3: Tải consul-template
sudo curl -L https://releases.hashicorp.com/consul-template/0.30.0/consul-template_0.30.0_linux_amd64.zip -o /opt/consul-template.zip
sudo unzip /opt/consul-template.zip -d /usr/local/bin/
Bước 4: Tạo file load-balancer.conf.ctmpl
trong /etc/nginx/conf.d
sudo vi /etc/nginx/conf.d/load-balancer.conf.ctmpl
Nội dung file:
upstream backend {
{{- range service "backend" }}
server {{ .Address }}:{{ .Port }};
{{- end }}
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
Block upstream backend
là template duyệt qua backend
service trong consul server và đọc IP của các node backend đã đăng kí.
Bước 5: Tạo consul-template.hcl
trong cùng thư mục. consul-template sẽ dùng file cấu hình này để lấy thông tin về IP của server, vị trí để copy file load-balancer.conf
.
sudo vi /etc/nginx/conf.d/consul-template.hcl
Nội dung file:
consul {
address = "34.222.141.217:8500"
retry {
enabled = true
attempts = 12
backoff = "250ms"
}
}
template {
source = "/etc/nginx/conf.d/load-balancer.conf.ctmpl"
destination = "/etc/nginx/conf.d/load-balancer.conf"
perms = 0600
command = "service nginx reload"
}
Thay consul address thành IP của consul server của bạn
Bước 6: Tắt cấu hình server mặc định của Nginx
sudo rm /etc/nginx/sites-enabled/default
Ta cần xóa file trên để tránh xung đột với cấu hình của server vì file trên chứa cấu hình mặc định của server.
Restart Nginx để áp dụng thay đổi
sudo systemctl restart nginx
Bước 7: Khởi động consul agent template. Consul template khởi động một daemon quản lý thời gian thực thằng consul server.
sudo nohup consul-template -config=/etc/nginx/conf.d/consul-template.hcl &
Sau khi thành công sẽ có một file load-balancer.conf
với các giá trị IP của các backend server của chúng ta, file này sẽ được tự động tạo dựa trên template ta đã chỉ định.
Giờ khi bạn truy cập Load Balancer IP sẽ thấy HTML của các backend server ta đã tùy chỉnh trước đó, nếu reload bạn sẽ nhận thấy Load Balancer thay đổi backend server do ta để thuật toán load balancing là round-robin.
Kiểm tra Service Discovery
Mọi thứ đã được cài đặt thành công, hãy kiểm tra hoạt động bằng cách xem có gì xảy ra nếu ngắt 1 backend.
Khi ngắt 1 backend, consul server sẽ đánh dấu backend server đó là unhealthy và health check sẽ thất bại.
Consul template gửi tín hiệu ngay lập tức rằng 1 server đã ngắt, nó sẽ tự động tạo một file cấu hình mới với chỉ 1 server còn sống.
Consul template chạy trong chế độ load-balancer nắm được thông tin về backend ngắt vì nó liên tục theo dõi thay đổi của server.
Nó sẽ cập nhật /etc/nginx/conf.d/load-balancer.conf
thành chỉ còn 1 IP của backend và reload lại Nginx service.
Kết luận
Chúc mừng bạn đã thành công hoàn thành bài lab. Chắc hẳn việc thực hành này sẽ giúp bạn có cái nhìn sâu hơn về service discovery. Để nâng cao kĩ năng bản thân, bạn có thể thực hiện IaC (Infrastructure as Code) cho cloud server, sử dụng Ansible để cấu hình 2 server backend, ...