Consul on Kubernetes な環境を用意して Consul を学ぶ

2020/10/17に公開

はじめに


HashiCorp Consul という分散システム上のサービス管理に役立つソフトウェアにとても興味があったので、最近はよく HashiCorp Learn を活用して、実際に動かしながら学んでいます。

今のところは、Spring Cloud Consul を活用したアプリケーションと組み合わせて、Service Discovery や Distributed Configuration などを試したいなと思っているので、そのために調べた環境構築の手順や Consul の基本機能のことなどをここにまとめることにしました。

Consul の主な機能

Features Description
Service Discovery 依存関係にあるサービスの接続情報の管理
Health Checking ノード・サービスの死活監視と通知
KV Store クラスタ間利用できる KVS
Secure Service Communication サービス間のセキュアな通信の確立
Multi Datacenter 複数のDCで稼働する Consul との連携のサポート

環境構築

Kubernetes 環境を準備する

Install kubectl

$ brew install kubectl

Install Docker

https://docs.docker.com/desktop/ を参考にインストールします。

Install Minikube

https://minikube.sigs.k8s.io/docs/start/ に従って、Minikube をローカルマシンに Install します。

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

Confirm Installation

Docker と Minikube の両方が正常にインストールされたことを確認するために、次のコマンドを実行してローカルの Kubernetes クラスターを起動します。

$ minikube start --driver=docker --memory 4096

起動終了後、以下のコマンドを実行してクラスターのステータスを確認します。

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Kubernetes Dashboard を起動

ブラウザから Kubernetes Dashboard にアクセスできるようにします。

$ minikube dashboard

Kubernetes に Consul を Install する

install helm

$ brew install helm

HashiCorp Helm Repository を追加

 $ helm repo add hashicorp https://helm.releases.hashicorp.com
 "hashicorp" has been added to your repositories

Consul の chart にアクセスできることを確認

$ helm search repo hashicorp/consul
NAME            	CHART VERSION	APP VERSION	DESCRIPTION
hashicorp/consul	0.24.1       	1.8.2      	Official HashiCorp Consul Chart

config.yaml を作成

  • Consul Helm Chart はデフォルト値で構成されています。
  • config.yaml ファイルを作成して、要件に応じてデフォルト値をオーバーライドして使います。
  • 各パラメータについては、Helm Chart Configuration で確認することができます。
config.yaml
# Configure global settings in this section.
global:
  domain: consul
  datacenter: dc1

# Configure your Consul servers in this section.
server:
  # Specify three servers that wait until all are healthy to bootstrap the Consul cluster.
  replicas: 1
  bootstrapExpect: 1

# Configure Consul clients in this section
client:
  enabled: true
  grpc: true

# Enable and configure the Consul UI.
ui:
  enabled: true

# Configure security for Consul Connect pod injection
connectInject:
  enabled: true

Consul を Deploy

config.yaml ファイルを作成したら、Helm を使用して Consul をデプロイします。

$ helm install -f config.yaml hashicorp hashicorp/consul

少し待つと Kubernetes Dashboard や kubectl で Consul がデプロイされていることを確認することができます。

$ kubectl get services
NAME                                    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                   AGE
hashicorp-consul-connect-injector-svc   ClusterIP   10.103.12.81   <none>        443/TCP                                                                   4m39s
hashicorp-consul-dns                    ClusterIP   10.105.6.205   <none>        53/TCP,53/UDP                                                             4m39s
hashicorp-consul-server                 ClusterIP   None           <none>        8500/TCP,8301/TCP,8301/UDP,8302/TCP,8302/UDP,8300/TCP,8600/TCP,8600/UDP   4m39s
hashicorp-consul-ui                     ClusterIP   10.107.68.82   <none>        80/TCP                                                                    4m39s
kubernetes                              ClusterIP   10.96.0.1      <none>        443/TCP                                                                   5m33s

Consul UI にアクセス

Consul UI にアクセスするために、hashicorp-consul-uiの Service に対してポートフォワードを行います。

$ kubectl port-forward service/hashicorp-consul-ui 18500:80 --address 0.0.0.0
Forwarding from 0.0.0.0:18500 -> 8500

これにより、Consul UI は http://localhost:18500 で利用できるようになります。

Consul を試す

Consul Commands (CLI)

kubectl exec を使用して、任意のコンテナに直接アクセスできます。

$ kubectl exec -it hashicorp-consul-server-0 -- /bin/sh
/ #

Consul のメンバーリストを取得する

  • consul members コマンドは、Consul Agent が把握しているメンバーのリストと Status を出力しすることができます。
  • Node の状態は、aliveleft、または failed のみです。
/ # consul members
Node                       Address          Status  Type    Build  Protocol  DC   Segment
hashicorp-consul-server-0  172.17.0.7:8301  alive   server  1.8.2  2         dc1  <all>
minikube                   172.17.0.5:8301  alive   client  1.8.2  2         dc1  <default>

Consul HTTP API

Cluster の外から REST API を利用するために、hashicorp-consul-serverの Service に対してポートフォワードを行います。

$ kubectl port-forward service/hashicorp-consul-server 8500:8500 --address 0.0.0.0
Forwarding from 0.0.0.0:8500 -> 8500

他のノードで登録されたサービスの情報なども参照することが可能なので、基本的にはローカルの Agent に問い合わせれば良さそうです。

List Datacenters

  • 把握しているすべてのデータセンターのリストを返します。
  • このエンドポイントはクラスターリーダーを必要とせず、可用性が停止している場合でも成功します。したがって、Consulサーバーがルーティング可能かどうかを確認するための簡単なチェックとして使用できます。
$ curl -s 127.0.0.1:8500/v1/catalog/datacenters
["dc1"]

List Nodes for Service

  • サービスを提供するノードのリストを返します。
  • ユーザーは、ヘルスチェックの使用を組み込むことにより、動的な負荷分散やその他の機能のサポートを組み込むこともできます。
$ curl -s localhost:8500/v1/health/service/consul | jq
[
  {
    "Node": {
      "ID": "7703fc5f-1efd-7678-168a-605829939166",
      "Node": "hashicorp-consul-server-0",
      "Address": "172.17.0.7",
      "Datacenter": "dc1",
      "TaggedAddresses": {
        "lan": "172.17.0.7",
        "lan_ipv4": "172.17.0.7",
        "wan": "172.17.0.7",
        "wan_ipv4": "172.17.0.7"
      },
      "Meta": {
        "consul-network-segment": ""
      },
      "CreateIndex": 7,
      "ModifyIndex": 7
    },
    "Service": {
      "ID": "consul",
      "Service": "consul",
      "Tags": [],
      "Address": "",
      "Meta": {
        "non_voter": "false",
        "raft_version": "3",
        "serf_protocol_current": "2",
        "serf_protocol_max": "5",
        "serf_protocol_min": "1",
        "version": "1.8.2"
      },
      "Port": 8300,
      "Weights": {
        "Passing": 1,
        "Warning": 1
      },
      "EnableTagOverride": false,
      "Proxy": {
        "MeshGateway": {},
        "Expose": {}
      },
      "Connect": {},
      "CreateIndex": 12,
      "ModifyIndex": 12
    },
    "Checks": [
      {
        "Node": "hashicorp-consul-server-0",
        "CheckID": "serfHealth",
        "Name": "Serf Health Status",
        "Status": "passing",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "ServiceTags": [],
        "Type": "",
        "Definition": {},
        "CreateIndex": 12,
        "ModifyIndex": 12
      }
    ]
  }
]

Consul KV Store

Consul は KVS の機能も提供しています。

  • KVS に登録された値はクラスタ間で値を共有することができます。
  • KVS には CLI や REST API、Web UI でアクセスが可能です。
  • KVS へのアクセスを制限するために ACL などを構成することも可能です。

Create/Update Key

$ curl \
    --request PUT \
    --data 'my-value' \
    http://127.0.0.1:8500/v1/kv/my-key

Read Key

$ curl -s http://127.0.0.1:8500/v1/kv/my-key | jq
[
  {
    "LockIndex": 0,
    "Key": "my-key",
    "Flags": 0,
    "Value": "bXktdmFsdWU=",
    "CreateIndex": 401,
    "ModifyIndex": 401
  }
]

Delete Key

$ curl \
    --request DELETE \
    http://127.0.0.1:8500/v1/kv/my-key

さいごに

ひとまず、Consul on Kubernetes な環境を用意して、Consul の機能を検証するための環境を構築することができました。

HashiCorp のソフトウェアを触ってみたのは初めてなのですが、メンテナンスされている Helm Chart があったり、ドキュメントが豊富に揃えられてるおかげで、個人的にはとても印象がよいです。もっと Consul のことを詳しく知りたいな...。

お勉強会とかしてたら LT とか聴きに行ったりしたい。

今後しばらくは、Spring Cloud Consul や他のソフトウェアと組み合わせて、実務で扱えそうかなどを詳しくみていきたいなと考えています。

Discussion