Contents
Linkerdによるマルチクラスター通信の概要と導入意義
Kubernetes環境におけるマルチクラスター構成は、スケーラビリティや災害復旧の観点から企業が採用するケースが増えています。しかし、複数クラスター間での通信をセキュアかつ効率的に実現することは依然として技術的課題です。Linkerdはサービスメッシュとして、この問題に特化したソリューションを提供します。本記事では、Linkerdの特徴を強調しつつ、導入意義と具体的な手順を初心者にもわかりやすく解説します。
Linkerdインストール時のクラスタ認証設定手順
マルチクラスター環境でLinkerdを導入する際には、クラスタ間での信頼関係構築が不可欠です。特にTLS証明書の準備とRBAC設定が基本となります。
TLS証明書の準備
各クラスターに認証されたTLS証明書を配置することで、通信の暗号化と認証を実現します。Linkerdでは自動証明書発行機能を活用するケースが増加しています。
-
CA証明書の生成
openssl req -new -x509 -days 365 -nodes -out ca.crt -keyout ca.key
この際、各クラスターごとに独自のCAを発行することが推奨されます。 -
サーバ証明書の作成
openssl req -new -key server.key -out server.csr
生成したCSR(Certificate Signing Request)をCAで署名し、server.crtを作成します。 -
証明書の配布
各クラスターの/etc/certificatesディレクトリに配置後、LinkerdのConfigMap経由で読み込むように設定します。
注意: クライアント証明書とサーバ証明書を別々に管理する仕様が標準化されています。
Kubernetes RBAC設定の確認
LinkerdはClusterRoleBindingを通じてクラスター全体のアクセス権を管理します。RBACの設定ミスによる通信不能を防ぐため、以下の項目を必ず確認してください。
| 設定項目 | 内容 |
|---|---|
| ServiceAccount | linkerd-linkerdが存在するか |
| ClusterRole | linkerd:service-meshの許可が付与されているか |
| RoleBinding | ネームスペースに適切にバインドされているか |
特に、LoadBalancer型サービスを使用している場合は、NetworkPolicyとRBAC設定が相互に関係しています。Linkerdでは、自動的な権限調整機能が導入されており、手動のエラーチェックを軽減できます。
セキュリティポリシー構成による通信制御
セキュアなマルチクラスター通信にはmTLSとネットワークポリシーの組み合わせが不可欠です。Linkerdの特徴的なセキュリティ強化機能を活用することで、信頼性のある環境を構築できます。
mTLS設定のベストプラクティス
mTLS(Mutual TLS)はサービス間通信の暗号化と信頼確立に必須です。Linkerdでは下記手順で設定します。
-
mTLS有効化のためのConfigMap更新
yaml
apiVersion: linkerd.io/v1alpha2
kind: Config
metadata:
name: config
namespace: linkerd
spec:
identity:
trustAnchors: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE----- -
Podに証明書を注入
linkerd injectコマンドで自動注入されるが、手動でvolumeMountsとvolumesの定義が必要な場合もあります。 -
信頼されたCAリストの同期
マルチクラスター環境では各クラスターごとのCAを中央リポジトリに登録し、動的に更新できる仕組みを構築する必要があります。
補足: mTLS設定が自動化されつつあり、手動で証明書を管理する必要性が減少しています。ただし、セキュリティポリシーの柔軟な定義は依然として重要です。
ネットワークポリシーのクラスタ横断定義
LinkerdはKubernetesネイティブのNetworkPolicyと連携して通信を制御します。以下のようなポリシーテンプレートが提供されています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: linkerd-policy spec: podSelector: matchLabels: app: linkerd-proxy policyTypes: - Ingress - Egress ingress: - from: - namespaceSelector: matchLabels: linkerd.io/control-plane-ns: "true" |
この設定により、Linkerdのプロキシとアプリケーション間の通信を厳格に制限できます。また、「linkerd.io/allow-external」ラベルを付与することで外部クラスターとの通信を許可することも可能です。
LoadBalancer型サービスのマルチクラスター統合方法
LoadBalancer型サービスは、複数クラスター間での外部アクセスに最適ですが、その設定にはいくつかの注意点があります。
DNSベースのサービス発見
現在では、DNSレコードを動的に更新する方式が主流です。以下のような手順で構成します。
-
各クラスターのLoadBalancer IPを取得
kubectl get svc -n <namespace> <service-name>からIPアドレスを確認し、外部DNSに登録します。 -
AレコードまたはCNAMEの設定
例:app.example.com→192.168.10.1, 192.168.10.2 -
DNSサーバーの同期
各クラスターで使用するDNSサーバーを統一し、IPアドレス変更時に自動反映させます。
補足: Linkerdでは、LoadBalancer型サービスとServiceEntryリソースを組み合わせることで、複数クラスターからのトラフィック分散が可能になります。
外部IPアドレスの動的管理
クラスターのスケーリングや障害復旧時にIPアドレスが変化する場合、静的な設定では通信不能になるため、動的な管理が必要です。
-
Cloud DNSサービスの活用(例: AWS Route 53, Google Cloud DNS)
自動更新APIを使ってLoadBalancerのIPをリアルタイムで反映させます。 -
LinkerdのServiceEntry自動登録機能
各クラスターにlinkerd.io/external-ipラベルを付与すると、自動的にサービスメッシュ内に追加されます。
Linkerdではこの機能がデフォルトで有効化されるように変更され、運用負荷の軽減が期待できます。
クラスタ横断トラフィック制御ポリシーの実装
複数クラスターをまたぐトラフィックに対して、レート制限やフェイルオーバーの仕組みが必要です。Linkerdはその機能を強化しており、特徴的な設計が可能です。
グローバルなレート制限設定
各クラスターで個別に設定していたレート制限を、LinkerdのConfigMap内で統一的に管理できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
apiVersion: linkerd.io/v1alpha2 kind: Config metadata: name: config spec: rateLimit: enabled: true limits: - match: ns: default limit: 100rps |
この設定により、任意のネームスペース内での通信を制限できます。また、linkerd.io/rate-limitラベルを付与することで、特定アプリケーションにだけ適用する場合も可能になります。
フェイルオーバー時の挙動管理
障害発生時に自動的に別のクラスターへの切り替えが行われるように設定できます。Linkerdでは以下のような仕組みが標準化されています。
-
フェイルオーバーポリシーの定義
yaml
apiVersion: linkerd.io/v1alpha2
kind: Policy
metadata:
name: failover-policy
spec:
failover:- toCluster: cluster2
when: error
- toCluster: cluster2
-
フェイルオーバーの検出タイミング
デフォルトでは3回連続エラー発生時に切り替えますが、カスタム値を設定可能です。 -
フェイルバックの有無指定
backToPrimary: trueと設定することで、障害解消後の元クラスターへの戻りが可能になります。
ゲートウェイベースとPod-to-Pod方式の選定基準
マルチクラスター通信には2つの主要なアプローチがあります。それぞれの特性を理解し、自社環境に最適な方法を選択することが重要です。
アーキテクチャ設計時の考慮要素
| 考え方 | ゲートウェイベース | Pod-to-Pod方式 |
|---|---|---|
| 通信経路 | ネットワーク内でのゲートウェイ通過 | Pod同士の直接接続 |
| セキュリティ | 高い(mTLSとネットワークポリシー) | 中程度(mTLSに依存) |
| レイテンシ | やや高め | 低め |
Linkerdでは、ゲートウェイ方式がさらに簡易な設定で利用可能になり、運用負荷の軽減が期待されています。
パフォーマンス比較
ベンチマークテストでは、Pod-to-Pod方式の方が15~30%の通信速度向上を記録しています。ただし、クラスタ間距離やネットワーク帯域によって結果が変化するため、以下のようなケースで選択肢を検討してください。
- 高パフォーマンスが必須なシステム → Pod-to-Pod方式
- セキュリティと柔軟性が重視される場合 → ゲートウェイベース
現在の傾向として、Hybridアプローチ(ゲートウェイとPod-to-Podの併用)が増加しています。特に、一部クラスターでPod-to-Podを採用し、他クラスターはゲートウェイ方式にすることも可能です。
まとめ
本記事ではLinkerdによるマルチクラスター通信の導入意義と設定方法について、初心者にもわかりやすく解説しました。以下が主なポイントです:
- 認証設定の際は、TLSとRBACを厳密に管理
- mTLSの有効化とNetworkPolicyの連携でセキュリティ向上
- LoadBalancer型サービスにはDNSベースの動的管理を推奨
- レート制限やフェイルオーバーはLinkerdのConfigMapで一括設定可能
- ゲートウェイ方式かPod-to-Pod方式か、自社環境に応じた選択が重要
本ガイドに従ってLinkerdを導入し、自社環境でのマルチクラスター通信テストを実施してください。