Cấu hình đăng ký cơ chế kiểm tra (Health check) trên Consul

Cấu hình đăng ký cơ chế kiểm tra (Health check) trên ConsulCuongquach.com | Bạn đã đến với gần như bài quan trọng của dịch vụ Consul Service Discovery rồi . Sau khi đã biết cách đăng ký một Service với Consul, thì bạn cần biết cách cấu hình cơ chế kiểm tra dịch vụ Service mà bạn đã đăng ký để từ đó Consul có thể tự động thêm/xoá node dịch vụ khỏi danh sách máy chủ hữu dụng phục vụ cho đối tượng dịch vụ mà bạn mong muốn.

cau-hinh-health-check-tren-consul

1. Cơ chế kiểm tra (health check) trên Consul

Một trong những tính năng quan trọng của Consul Agent đó là cung cấp các cơ chế kiểm tra phù hợp đáp ứng được nhu cầu quản lý tình trạng sức khoẻ ở cả mức hạ tầng system và cả hạ tầng ứng dụng ở phía dưới Consul Client. Có 2 đối tượng mà Health check  Consul sẽ thực hiện kiểm tra:

  • Health check ở mức hạ tầng node , nếu không chỉ định cơ chế Health check cho một Service cụ thể.
  • Health check ở mức hạ tầng ứng dụng, cần chỉ định cơ chế Health check cho một service cụ thể.

Các cơ chế kĩ thuật Health checkConsul hỗ trợ như sau:

1.1. Script check

Đơn giản bạn chỉ cần gọi một cú pháp chương trình lệnh hoặc một script có nội dung thực hiện kiểm tra dịch vụ mà bạn mong muốn được Service Discovery.

Từ phiên bản Consul 0.9.0 trở đi, tính năng script check không được kích hoạt mặc định. Để sử dụng tính năng này bạn cần kích hoạt chúng :

  • enable_local_script_checks: true

Một script check cần lưu ý một số exit code trả về sẽ tương ứng mã trạng thái mà Consul nhận định như sau :

  • Exit code 0 : passing (ok)
  • Exit code 1 : warning (cảnh báo)
  • Các mã exit code khác : là failed

Cú pháp cấu hình 

{
  "check": {
    "id": "mem-util",
    "name": "Memory utilization",
    "args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"],
    "interval": "10s",
    "timeout": "1s"
  }
}

1.2 HTTP Check

Consul sẽ thực hiện một request HTTP/HTTPS GET đến URL theo nhu cầu health check của bạn. Trạng thái ok (passing) sẽ dựa theo mã Status HTTP Code trả về 2xx, còn lại là thất bại. Bạn cũng có thể chỉ định method POST và cả HTTP Header khác.

{
  "check": {
    "id": "api",
    "name": "HTTP API on port 5000",
    "http": "https://localhost:5000/health",
    "tls_skip_verify": false,
    "method": "GET",
    "interval": "10s",
    "timeout": "1s"
  }
}

1.3. TCP Check

TCP Check thì căn bản vô cùng, Consul chỉ quan tâm việc khởi tạo một kết nối TCP đến port dịch vụ mà bạn khai báo. Nếu khởi tạo thành công, thì trạng thái thành công. Ngược lại thì trạng thái thất bại. Bạn có thể khai báo địa chỉ IP hoặc Hostname đều được.

{
  "check": {
    "id": "ssh",
    "name": "SSH TCP on port 22",
    "tcp": "localhost:22",
    "interval": "10s",
    "timeout": "1s"
  }
}

1.4 Kiểu khác

Một số kiểu Health check hỗ trợ khác như : Docker check, gRPC check, TTL check,… Xem thêm tại : https://www.consul.io/docs/agent/checks.html

1.5 Trạng thái sức khoẻ lúc khởi tạo

Mặc định, khi một cơ chế kiểm tra (check) được đăng ký tại Consul Agent, thì trạng thái ban đầu sẽ được set là ‘critical‘. Điều này giúp Service sử dụng cơ chế check đó phải trải qua đầy đủ cơ chế check mới được chuyển trạng thái. Bạn có thể set trạng thái ban đầu theo mong muốn nếu không cần Service trải qua cơ chế kiểm tra đầu tiên.

{
  "check": {
    "id": "mem",
    "args": ["/bin/check_mem", "-limit", "256MB"],
    "interval": "10s",
    "status": "passing"
  }
}

1.6 Cấu hình nhiều cơ chế kiểm tra

Bạn có cấu hình nhiều cơ chế kiểm tra trong cùng 1 file cấu hình :

{
  "checks": [
    {
      "id": "chk1",
      "name": "mem",
      "args": ["/bin/check_mem", "-limit", "256MB"],
      "interval": "5s"
    },
    {
      "id": "chk2",
      "name": "/health",
      "http": "http://localhost:5000/health",
      "interval": "15s"
    },
    {
      "id": "chk3",
      "name": "cpu",
      "args": ["/bin/check_cpu"],
      "interval": "10s"
    },
    ...
  ]
}

1.7 Kiểm tra trạng thái sức khoẻ từ Consul

Giờ chúng ta biết cú pháp khai báo cơ chế kiểm tra sức khoẻ, thì chúng ta cũng muốn xem thử làm thế nào để biết được tình trạng sức khoẻ của dịch vụ Service đã đăng ký hay Node Service đó.

+ HTTP API

Bạn có thể gọi qua API HTTPConsul local client hoặc Cluster Consul.

# curl http://localhost:8500/v1/health/state/critical
[{"Node":"gtd-ibe-ntp-01","CheckID":"ntp-check","Name":"ntp service","Status":"critical","Notes":"","Output":"Service NTP is Dead\n","ServiceID":"ntp","ServiceName":"ntp","ServiceTags":["ntp-01"],"Definition":{},"CreateIndex":313635,"ModifyIndex":313765}]

+ DNS Query

# dig @127.0.0.1 -p 8600 ntp.service.cuongqc-consul.cuongquachlab.com

2. Lab cấu hình cơ chế Health check của Consul

Ok giờ chúng ta biết là cơ chế kiểm tra tình trạng sức khoẻ của trong Consul hỗ trợ 2 phần :

  • Nếu không chỉ định Service đi kèm, thì cơ chế kiểm tra đó sẽ dùng để kiểm tra sức khoẻ node.
  • Nếu chỉ định với Service đi kèm, thì là cơ chế kiểm tra sức khoẻ dịch vụ đăng ký.

Trong bài lab này chúng ta cùng tiếp tục với dịch vụ client là NTP thử nhé. Chúng ta cấu hình trên cả 2 máy chủ NTP01 và NTP02 nhé.

+ Kích hoạt tính năng sử dụng script check

# vi /etc/consul.d/client/config.json
{
  ..
  "enable_local_script_checks": true,
  ..
}

Reload lại cấu hình lại dịch vụ Consul client.

# systemctl reload consul-client

+ Kiểm tra Service

Giờ mình làm cái shell script đơn giản , để làm cơ chế kiểm tra Service NTP của mình thử. Tạo một shell script đơn giản chạy check port UDP 123 còn sống hay không nhé :

# vi /opt/check-ntp.sh

#!/bin/bash

if [[ "$(/usr/bin/netstat -auln | grep ':123')" ]];then
        echo "Service NTP is Alive"
	exit 0
else
        echo "Service NTP is Dead"
	exit 2
fi

# chmod +x /opt/check-ntp.sh

Giờ trong file cấu hình Service , cấu hình cơ chế kiểm tra cho cái Service NTP của chúng ta.

# vi /etc/consul.d/client/ntp.json
{
  "service": {
    "name": "ntp",
    "tags": [
      "ntp-01"
    ],
    "address": "10.0.253.20",
    "port": 123,
    "check": {
        "id": "ntp-check",
        "name": "ntp service",
        "args": ["/bin/bash", "/opt/check-ntp.sh"],
        "interval": "10s",
        "timeout": "2s"
    }
  }
}

+ Kiểm tra Node

Cơ chế kiểm tra Node giờ ta làm đơn giản thôi, đó là ping địa chỉ gateway IP cùng lớp mạng là được ấy mà.

vi /etc/consul.d/client/ping-gw.json
{
  "check": {
    "id": "ping-gw",
    "name": "ping-gw",
    "args": [
      "/bin/ping",
      "-c 4",
      "10.0.253.1"
    ],
    "interval": "30s"
  }
}

Giờ bạn reload lại dịch vụ Consul client nào.

# systemctl reload consul-client
# systemctl status consul-client
● consul-client.service - Consul Service Discovery Agent - Client Mode
   Loaded: loaded (/etc/systemd/system/consul-client.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-08-06 13:32:06 +07; 48s ago
     Docs: https://www.consul.io/
  Process: 18188 ExecReload=/usr/bin/consul reload (code=exited, status=0/SUCCESS)
 Main PID: 18395 (consul)
   CGroup: /system.slice/consul-client.service
           └─18395 /usr/bin/consul agent -config-dir=/etc/consul.d/client

Aug 06 13:32:06 gtd-ibe-ntp-01 consul[18395]: ==> Consul agent running!
Aug 06 13:32:06 gtd-ibe-ntp-01 consul[18395]: agent: started state syncer
Aug 06 13:32:06 gtd-ibe-ntp-01 consul[18395]: agent: Synced service "ntp"
Aug 06 13:32:06 gtd-ibe-ntp-01 consul[18395]: 2019/08/06 13:32:06 [INFO] agent: Synced service "ntp"
Aug 06 13:32:06 gtd-ibe-ntp-01 consul[18395]: agent: Synced check "ping-gw"
Aug 06 13:32:06 gtd-ibe-ntp-01 consul[18395]: 2019/08/06 13:32:06 [INFO] agent: Synced check "ping-gw"
Aug 06 13:32:14 gtd-ibe-ntp-01 consul[18395]: agent: Synced check "ntp-check"
Aug 06 13:32:14 gtd-ibe-ntp-01 consul[18395]: 2019/08/06 13:32:14 [INFO] agent: Synced check "ntp-check"
Aug 06 13:32:28 gtd-ibe-ntp-01 consul[18395]: agent: Synced check "ping-gw"
Aug 06 13:32:28 gtd-ibe-ntp-01 consul[18395]: 2019/08/06 13:32:28 [INFO] agent: Synced check "ping-gw"

Lúc này bạn có thể kiểm tra thông qua các cách thức như : tắt dịch vụ NTP, khởi động lại máy chủ dịch vụ NTP,… để kiểm tra khả năng Health check và cập nhật trạng thái  thông tin node Service NTP.

Nếu bạn coi trên trang quản lý dịch vụ Consul Cluster, sẽ thấy các thông tin như hai hình dưới.

+ Trạng thái OK hết đây

+ Trạng thái một node NTP đã stop dịch vụ

Nếu bạn query DNS domain service tương ứng thì sẽ thấy chỉ trả về kết quả 1 địa chỉ IP của em còn lại NTP 02.

Vậy là bạn đã biết cách khai báo cơ chế Health check cho một Node và cho một Service được đăng ký trên Consul rồi. Coi như bạn đã biết cách sử dụng cơ bản hoạt động Consul cho các yêu cầu Service Discovery rồi đó. Ở phần kế chúng ta sẽ sớm tìm hiểu việc tích hợp Consul DNS với DNS Server khác như Route53.

Nguồn: https://cuongquach.com/

Previous articleCấu hình đăng ký Service trên Consul
Next articleMicrosoft Outlook là gì? Lợi ích của Microsoft Outlook
Bạn đang theo dõi website "https://cuongquach.com/" nơi lưu trữ những kiến thức tổng hợp và chia sẻ cá nhân về Quản Trị Hệ Thống Dịch Vụ & Mạng, được xây dựng lại dưới nền tảng kinh nghiệm của bản thân mình, Quách Chí Cường. Hy vọng bạn sẽ thích nơi này !