Kubernetesでコンテナ化されたサービスを実行すると、自動スケーリング、依存関係の分離、リソースの最適化など、多くのメリットが得られます。 IstioをKubernetes環境に追加すると、多数のコンテナーを操作している場合でも、メトリクスの集計とポリシー管理を大幅に簡略化できます。
しかし、ステートフルサービス、またはレガシーアプリケーションが仮想マシンで実行されている場合はどうでしょうか。または、VMからコンテナーに移行する場合はどうでしょうか?心配要りません。仮想マシンをIstioサービスメッシュに統合できます。方法を見てみましょう。
この例では、地方図書館のWebアプリケーションを実行しています。このウェブアプリには複数のバックエンドがあり、すべてKubernetesクラスターで実行されています。 Kubernetesのワークロードの1つ、inventory
は、PostgreSQLデータベースと通信し、図書館に追加された新しい本ごとにレコードを書き込みます。このデータベースは、別のクラウドリージョンの仮想マシンで実行されています。
VMベースのデータベースであるPostgreSQLの完全なIstioの機能を取得するには、VMにIstioサイドカープロキシをインストールし、クラスターで実行されているIstioコントロールプレーンと通信するように構成する必要があります。(これは外部のServiceEntriesを追加するのとは異なる点に注意してください。)Postgresデータベースを3つのステップでメッシュに追加できます。GitHubのデモコマンドに従ってください。
- PodからVMへのトラフィック用のファイアウォールルールを作成します。 これにより、Kubernetes PodのCIDR範囲からVMベースのワークロードに直接トラフィックを送信できます。
- VM上にIstioをインストールします。 サービスアカウントキー、およびVMサービスが公開するポート(この場合は、PostgreSQLクライアントポート
5432
)をコピーします。 VMの/etc/hosts
を更新して、クラスターで実行されているIstio IngressGatewayを介してistio.pilot
およびistio.citadel
トラフィックをルーティングします。次に、VMにIstioサイドカープロキシとノードエージェントをインストールします。ノードエージェントは、相互TLS認証のために、サイドカープロキシにマウントするクライアント証明書を生成します。systemctl
を使用してプロキシとノードエージェントを起動します。 - KubernetesのワークロードVMに登録します。 Postgresデータベースをメッシュに追加するには、2つのKubernetesリソースが必要です。 1つは
ServiceEntry
です。これにより、KubernetesのDNS名で仮想マシンのIPアドレスにルーティング可能になります。最後に、そのDNSエントリを作成するには、KubernetesのService
が必要です。これにより、クライアントPodがpostgres-1-vm.default.svc.cluster.local
でデータベース接続を開始できるようになります。これを行うには、istioctl register
コマンドを使用できます。
Podのログを見ることで、Kubernetesベースのクライアントがデータベースに正常に書き込めることを確認できます。:
postgres-library-6bb956f86b-dt94x server ✅ inserted Fun Home
postgres-library-6bb956f86b-dt94x server ✅ inserted Infinite Jest
postgres-library-6bb956f86b-dt94x server ✅ inserted To the Lighthouse
また、VM上にあるEnvoyのアクセスログを見ることで、VM上で実行されているサイドカープロキシがポート 5432
で内向きのトラフィックを傍受していることを確認できます。
$ tail /var/log/istio/istio.log
[2019-11-14T19:09:00.174Z] "- - -" 0 - "-" "-" 268 441 194 - "-" "-" "-" "-"
"127.0.0.1:5432" inbound|5432|tcp|postgresql-1-vm.default.svc.cluster.local
127.0.0.1:54104 10.128.0.14:5432 10.24.2.23:40190
outbound_.5432_._.postgresql-1-vm.default.svc.cluster.local -
KialiサービスグラフでTCPメトリックフローを確認することもできます。:
ここから、マルチ環境のサービスメッシュで、すべてのIstioトラフィックやセキュリティポリシーを使用できます。たとえば、メッシュ全体の相互TLSポリシーを追加することで、クラスターとVM間のすべてのトラフィックを暗号化できます。:
apiVersion: "authentication.istio.io/v1alpha1"
kind: "MeshPolicy"
metadata:
name: "default"
spec:
peers:
- mtls: {}
---
apiVersion: "networking.istio.io/v1alpha3"
kind: "DestinationRule"
metadata:
name: "default"
namespace: "istio-system"
spec:
host: "*.local"
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
より詳しく学ぶ: