Consul on Kubernetes な環境を用意して Consul を学ぶ
はじめに
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 で確認することができます。
# 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 の状態は、
alive
、left
、または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