やわらかConsulをやってみた

Consulマスターになるべく、やわらかConsulでハンズオンをやってみました。

参照したハンズオン資料は公開されてから時間が経っており、その通りにすすめるといくつか躓くところがあったのでメモを残しておきます。

Setup

2018年3月10日現在、Setup手順で./build-rpms.shを実行してもこけてしまいます。forkして修正したリポジトリを参照するように修正します。

diff --git a/build-rpms.sh b/build-rpms.sh
index c91f69b..fe92160 100755
--- a/build-rpms.sh
+++ b/build-rpms.sh
@@ -8,7 +8,7 @@ fi
 mkdir -p ./rpms ./checkout

 ( cd checkout;
-  test -d hashibuilder || git clone https://github.com/udzura/hashibuilder.git;
+  test -d hashibuilder || git clone https://github.com/akichan22/hashibuilder.git;
   cd hashibuilder;
   docker-compose build consul-rpm;
   docker-compose run consul-rpm;

Step1

設定ファイルのディレクトリを/etc/consulから/etc/consul.dに変えてやる必要があります。

diff --git a/Vagrantfile b/Vagrantfile
index 08df03f..77db2e3 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -45,7 +45,7 @@ Vagrant.configure(2) do |config|
       sudo yum -y check-update
       sudo yum -y install epel-release
       sudo yum -y install jq nagios-plugins-all
-      sudo yum -y install /vagrant/rpms/consul-0.5.2-1.el7.centos.x86_64.rpm || true
+      sudo yum -y install /vagrant/rpms/consul-1.0.1-1.el7.centos.x86_64.rpm || true
     EOS
   end

@@ -53,9 +53,9 @@ Vagrant.configure(2) do |config|
     vm.provision "step1", type: "shell" do |s|
       s.inline = indent(<<-EOS)
         set -x
-        echo '{"server": true, "bind_addr": "192.168.100.101", "client_addr": "0.0.0.0", "bootstrap_expect": 3}' | sudo tee /etc/consul/default.json
-        sudo yum -y install /vagrant/rpms/consul-ui-0.5.2-1.el7.centos.x86_64.rpm
-        sudo yum -y install /vagrant/rpms/consul-template-0.10.0-1.el7.centos.x86_64.rpm
+        echo '{"server": true, "bind_addr": "192.168.100.101", "client_addr": "0.0.0.0", "bootstrap_expect": 3}' | sudo tee /etc/consul.d/default.json
+        sudo yum -y install /vagrant/rpms/consul-1.0.1-1.el7.centos.x86_64.rpm
+        sudo yum -y install /vagrant/rpms/consul-template-0.19.4-1.el7.centos.x86_64.rpm
         sudo systemctl restart consul
         sleep 5
         sudo journalctl -u consul -e -n 20
@@ -67,7 +67,7 @@ Vagrant.configure(2) do |config|
         set -x
         sudo yum -y install nginx

-        cat <<JSON | sudo tee /etc/consul/step3-check-nginx.json
+        cat <<JSON | sudo tee /etc/consul.d/step3-check-nginx.json
         {
           "service": {
             "id": "nginx",
@@ -80,7 +80,14 @@ Vagrant.configure(2) do |config|
           }
         }
         JSON
-        sudo systemctl reload consul
+
+        cat <<JSON | sudo tee /etc/consul.d/config.json
+        {
+          "enable_script_checks": true
+        }
+        JSON
+
+        sudo systemctl restart consul
         sleep 2
         sudo journalctl -u consul -e -n 20
       EOS
@@ -148,7 +155,7 @@ Vagrant.configure(2) do |config|
       vm.provision "step2", type: "shell" do |s|
         s.inline = indent(<<-EOS)
           set -x
-          echo '{"server": true, "bind_addr": "#{each_ip}"}' | sudo tee /etc/consul/default.json
+          echo '{"server": true, "bind_addr": "#{each_ip}"}' | sudo tee /etc/consul.d/default.json
           sudo systemctl restart consul
           sleep 1
           consul join 192.168.100.101
@@ -183,7 +190,7 @@ Vagrant.configure(2) do |config|
           systemctl enable ruby-app.service
           systemctl start ruby-app.service

-          cat <<JSON | sudo tee /etc/consul/step5-check-application.json
+          cat <<JSON | sudo tee /etc/consul.d/step5-check-application.json
           {
             "service": {
               "id": "application",
@@ -205,7 +212,7 @@ Vagrant.configure(2) do |config|
       vm.provision "step6", type: "shell" do |s|
         s.inline = indent(<<-EOS)
           set -x
-          cat <<JSON | sudo tee /etc/consul/step5-check-application.json
+          cat <<JSON | sudo tee /etc/consul.d/step5-check-application.json
           {
             "service": {
               "id": "application",

Step2

ところで、非サーバーモードのノードは、リーダーに選出されることはありません。むやみにリーダー不在期間を作らないために、頻繁に上げ下ろしをするようなロールのサーバーは、非サーバーモードでConsulを起動すると問題が起きにくいでしょう。

頻繁にダウンしないノードだけサーバモードにすることで、リーダー不在期間を減らせる。

Step3

ヘルスチェックを有効にするかどうかを制御する"enable_script_checks" オプションをtrueに設定する必要がある。(デフォルトはfalse)

[vagrant@front ~]$ echo '{"enable_script_checks": true}' |sudo tee /etc/consul.d/config.json
{"enable_script_checks": true}
[vagrant@front ~]$ sudo systemctl restart consul

"enable_script_checks" オプションはreloadでは反映されないので注意。(https://github.com/hashicorp/consul/issues/3323)

Step5

back01からback03 にサンプルアプリをインストール。

$ vagrant provision back01 back02 back03 --provision-with step5

Step6

# /usr/local/sample.conf.ctmpl
upstream backend_apps {
{{range service "production.application@dc1" "passing"}}
    server {{.Address}}:{{.Port}};{{end}}
}
server {
    listen      80;
    server_name _;
    proxy_set_header Host               \$host;
    proxy_set_header X-Real-IP          \$remote_addr;
    proxy_set_header X-Forwarded-For    \$proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host   \$host;
    proxy_set_header X-Forwarded-Server \$host;
    location / {
        proxy_pass http://backend_apps;
    }
}

range service “production.application@dc1” “passing” というテンプレートの組み込み関数で、「production」というタグのついた、applicationという、dc1データセンターにある(ここではデフォルトのデータセンターです)サービスから、 passing つまりチェックが正常であるものを抽出し、その情報をもとにテンプレートを展開する、という意味になります。

まとめ

Consulの機能や実現できることについて一通り試せる・復習できる良いドキュメントでした。

次はRaftについて深掘りしてみます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です