Consul Service Discovery Hands-On

Consul Service Discovery Hands-On

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:

  1. 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
💡
Khuyến khích sử dụng Cloud server do để thực hiện bài lab này các bạn sẽ không phải trả bất kì đồng nào vì đa số các Cloud Provider đều có free tier cho các dịch vụ của mình và hơn nữa là để làm quen và thực hành trên môi trường thực tế :D
  1. 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ẹ)

Các port cần mở cho consul

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"
  1. 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.

  2. client_addr: Địa chỉ IP mà consul agent sẽ lắng nghe.

  3. data_dir: Thư mục lưu dữ liệu của consul.

  4. 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.

  5. datacenter: Tên datacenter của consul agent. Một datacenter là một nhóm logic các consul agent trong mạng.

  6. ui: Bật tính năng web-based Consul UI để dễ tương tác.

  7. server: Nếu true thì agent này sẽ là consul server, tại các agent khác ta để nó là false.

  8. 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"]
💡
Nhớ thay đổi start_join thành IP của consul server của bạn nhé.

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.

💡
Để fetch thông tin về các backend server ta sẽ dùng chương trình consul-template. Nó có chức năng tạo API call tới server và lấy thông tin về các backend. Sau đó nó tạo template dựa trên các thông tin đó và tạo ra tập tin 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, ...