Contents
HashiCorp ConsulとKubernetesの統合概要
HashiCorp ConsulをKubernetes環境に統合することで、サービス発見や分散トレーサビリティといった重要な機能が強化されます。特にマイクロサービスアーキテクチャでは、動的なスケーリングやポッドの再配置に対応する柔軟なサービス管理が求められます。この記事では、HashiCorp ConsulとKubernetesの連携方法を実践的な構成例とトラブルシューティングに焦点を当てて解説します。
統合の意義と主要なユースケース
ConsulはKubernetesのネイティブなサービスディスカバリー機能(DNSやEndpointSlice)を補完し、グローバルなサービス管理やセキュリティポリシーの統一を実現します。例えば、複数クラスターにまたがるマイクロサービス間での通信制御や、ステートフルアプリケーションのレプリカ同期など、ユースケースは幅広いです。
Consul Kubernetes Operatorの導入手順
Consul Kubernetes Operatorは、Kubernetes上でConsulクラスタをスムーズに管理するためのツールです。Helmチャートや手動インストールの両方で導入可能です。
Operatorのデプロイ方法
Kubernetes環境へのConsul Operator導入には、Helmチャートおよび手動インストールの2つのアプローチが利用できます。それぞれの方法に応じて、セキュリティや拡張性に最適な設定を行います。
- Helmチャートによる導入
- HelmリポジトリからOperatorをインストールし、必要に応じてカスタム設定(例:セキュリティポリシー)を反映させます。
-
helm install consul hashicorp/consulのように実行しますが、ACL有効化やデータストレージの指定が必要な場合は以下のパラメータを追加します:
bash
helm install consul hashicorp/consul \
--set global.acl.enabled=true \
--set storageClass.default="slow" -
手動インストール
- ConsulのYAMLファイルを適用し、RBACやNamespaceの制限を考慮してデプロイします。
- 特にServiceAccountとClusterRoleBindingの設定には注意が必要です。
リソース定義ファイルの構成ポイント
Consulの導入には、ConfigMapやStatefulSetのリソース定義が不可欠です。
- ConsulのConfigMap:初期設定(データストレージの種類やACL)を含めます。
- StatefulSetデプロイメント:ステートフルなサービス(例:Consul Server)に適したリソース定義を記述します。
注意点: デフォルト設定ではNamespace制限がかけられている場合がありますので、
--namespaceオプションやYAMLファイル内のmetadata.namespaceを確認してください。
サービス発見の実装とトラブルシューティング
ConsulはDNSベースのサービス検出機能によって、KubernetesのServiceリソースと連携します。この設定により、アプリケーションは動的に変化するエンドポイントを自動で検出できます。
DNSベースのサービス検出構成
- Consul AgentをKubernetesの各Nodeにデプロイし、
consul.k8s.io/service-nameのようなカスタムDNSレコードを設定します。 - KubernetesのServiceリソースとConsulのサービス名をマッピングするため、Consulのサービス定義ファイル(service.yaml)を作成します。
ServiceEntryとWorkloadIdentityの連携
Kubernetesクラスター外のサービスをConsulネットワークに統合するには、ServiceEntryリソースとWorkload Identity(OIDC)の組み合わせが有効です。
-
ServiceEntryの構成例:
yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service
spec:
hosts:- external.example.com
location: MESH_EXTERNAL
ports: - number: 80
protocol: TCP
name: http
resolution: DNS
- external.example.com
-
Workload Identityの設定:
- KubernetesクラスターにOIDCが有効化されていることを確認します。
- Pod内にServiceAccountを割り当て、Consul APIへのアクセスを許可するRoleBindingを作成します。
- Consul AgentでWorkload Identityの認証情報を自動取得可能な設定(
--token-review-ttl=1m)を有効化します。
よくあるエラーコードと対処法
| エラーコード | 原因 | 対策 |
|---|---|---|
| 503 Service Unavailable | Consul Agentの不具合やリソース不足 | Agentロギングを確認し、ノードリソースを増やす |
| 401 Unauthorized | 認証情報が正しく設定されていない | Workload IdentityまたはTLS認証の再確認 |
セキュリティポリシーの統合アプローチ
Kubernetes NetworkPolicyとConsul ACL(Access Control List)を連携させることで、セキュリティリスクを効果的に軽減できます。
ACLベースのアクセス制御設定
ConsulのACLはサービスやユーザーごとに権限を細かく管理できます。Kubernetes NetworkPolicyと組み合わせて、ネットワークレベルでの制限も可能です。
- 例: データベース接続用のサービスアカウントにだけ
read権限を与える。 - Consul ACL:
acl = "read" - Kubernetes NetworkPolicy:
ingress: { ports: [80] }
TLS mutual authenticationの実装
Consul AgentとKubernetes Pod間でTLS mutual authを有効化し、通信の暗号化と認証を行います。
- Cert-Managerによる証明書自動生成:
- Consulクラスターに合わせた証明書の有効期限(
--ca-cert-ttl=72h)や再発行ポリシーを設定します。 - 次のYAMLでIssuerを定義し、Consul Agentへの証明書配布を自動化します:
yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: consul-tls-issuer
spec:
ca:
secretName: consul-ca-secret
ステートフルアプリケーションの連携ケース
ステートフルなデータベースやキャッシュサービス(例:PostgreSQL、MongoDB)は、Consulを使用することでレプリカ同期やセッション管理を安定させられます。
StatefulSetでのConsul Client設定
StatefulSetでConsul Agentをクライアントとしてデプロイし、各PodがConsulに自身のステータスを定期的に更新します。フェイルオーバー時のロジックは、KVストレージを使って実装できます。
- KVストレージを使用したフェイルオーバー例:
consul.kv/failover_leaderというキーに、現在のリーダーPod情報を保存します。- レプリカが検出された場合、アプリケーションはこの値を参照して接続先ノードを切り替えます。
データベースクラスターのサービス発見実装
PostgreSQLの場合、Consulで各レプリカノードを登録し、アプリケーションが動的に接続先を選択できるようにします。
例: アプリケーションは
consul.example.com/postgresというDNS名を使って、常に最新のエンドポイントに接続できます。
ヘルスチェックカスタマイズとモニタリング
Consulのヘルスチェックをカスタムすることで、アプリケーションの可用性をさらに高められます。また、メトリクスの収集とPrometheusとの連携も重要です。
カスタムヘルスチェッカーの実装
livenessProbeとreadinessProbeを組み合わせて、Podの状態をConsulにフィードバックします。- 例: HTTPエンドポイント
/healthzに応答するように設定。
Consul UIとPrometheusの連携
- Consulはネイティブでメトリクスを出力(/v1/metrics)しており、Prometheus Exporter経由で収集可能です。
- Grafanaに接続して可視化することで、リアルタイムでの監視が可能になります。
アラーム設定の例:
|
1 2 3 4 5 6 7 8 |
- name: consul_health_check expr: avg(consul_agent_connectivity) < 0.95 for: 5m labels: severity: warning annotations: summary: "Consul Agent Connectivity Drop" |