サービスメッシュアーキテクチャの魔法を解き明かし、分散システムのパフォーマンスをどのように強化するかを体感してください。
サービスメッシュのスーパースターであるIstioを深く掘り下げ、Kubernetesクラスターを完璧にオーケストレーションする方法を学びましょう。
モノリシックなアプリケーションは、より小さく独立したサービスへと進化してきました。このシフトは、クラウドネイティブコンピューティングとマイクロサービスアーキテクチャにより、非常に人気を博しました。DockerやKubernetesなどのツールがこのトレンドを加速させました。
Kubernetesなどのプラットフォームでのマイクロサービスは多くの利点を提供しますが、同時に複雑さも伴います。これらの分散サービス間の通信を管理するには、検出、ルーティング、再試行、およびフェイルオーバーについて慎重に考慮する必要があります。
セキュリティや可観測性も追加の課題として挙げられます。
各サービスに通信機能を組み込むのは、特にサービスの規模が拡大するにつれて時間がかかります。そこでサービスメッシュが活躍します。分散システム内のすべてのサービス間通信を処理します。
サービスメッシュは、ネットワークプロキシを使ってこれを実現します。サービス間のリクエストはインフラ層にあるこれらのプロキシを介してルーティングされます。
これらのプロキシはサービスのメッシュネットワークを形成し、すべてのサービス間通信を管理します。そのため、この仕組みは「サービスメッシュ」と呼ばれます。これにより、分散コンピューティングの8つの誤謬にも対応できます。
サービスメッシュを使って、サービスの可能性を最大限に引き出しましょう!この魔法のツールがアプリケーションをどのように変革するかを発見してください。
トラフィック管理、鉄壁のセキュリティ、明瞭な可視性という3つのコア能力に分解して、その魔法を解き明かしましょう。
サービスメッシュは、トラフィックを正確に制御する究極の交差点監視員です。動的ルーティング、スマートなサービス発見、トラフィックのシャドウイングや分割など、画期的な機能を駆使して、シームレスなカナリーデプロイやA/Bテストを可能にします。
信頼性の低い接続にさようなら!サービスメッシュは、サービスを信頼性の高い保護層で包み、再試行、タイムアウト、レート制限、サーキットブレーカーなどでアプリを混乱から守ります。
サービスを鉄壁の要塞で守りましょう!サービスメッシュは強力なMTLSを使ってすべての通信を暗号化し、厳格な認証でIDを確認し、アクセスルールを適用して究極の保護を実現します。
隠されたセキュリティの力を発見しましょう!サービスを分離し、あらゆる動作を追跡して監査し、アプリケーションに安全な境界を作り出します。
複雑な分散システムを簡単にナビゲートしましょう!サービスメッシュは、分散トレースを通じて、アプリケーションの内部動作を比類ない可視性で提供します。
豊富なメトリクス、ログ、パフォーマンスデータから貴重な洞察を得て、プロのようにサービスを最適化し、問題をトラブルシューティングしましょう。
IBM、Google、Lyftが生み出したオープンソースのサービスメッシュであるIstioは、トラフィック管理、セキュリティ、パフォーマンスの洞察により、分散アプリケーションを目に見えない形で強化します。
オンプレミス、クラウド、Kubernetes内、または仮想マシンに柔軟にデプロイできるIstioは、Kubernetes上のマイクロサービスで輝きを放ちます。プラットフォームに依存しませんが、コンテナ化された環境に適しています。
Istioは、各マイクロサービスと一緒にEnvoyプロキシをサイドカーとしてデプロイします。
このプロキシネットワークは、コントロールプレーンによってオーケストレーションされたIstioのデータプレーンを形成します。
コントロールプレーンであるIstioのマスターマインドは、Envoyプロキシに検出、構成、証明書管理の機能を提供します。
サイドカープロキシが織り成す、相互接続された多数のマイクロサービスによって、堅牢なサービスメッシュインフラストラクチャが形成されます。
Istioの適応性は、外部のロギング、テレメトリ、ポリシーシステムとのシームレスな統合によって際立ちます。
Istioのアーキテクチャは、データプレーンとコントロールプレーンのダイナミックデュオです。これらが連携して、Istioの機能の背後にある魔法をオーケストレーションします。この卓越したプラットフォームを支えるコアコンポーネントについて詳しく見ていきましょう。
Istioのコアコンポーネントの詳細について説明します。
Istioのデータプレーンは、基本的にEnvoyプロキシの拡張バージョンです。このオープンソースの驚異は、ネットワークの複雑さを処理するため、アプリケーションはコアビジネスに集中できます。アプリケーションは、複雑なネットワークインフラストラクチャを意識せずにシームレスに対話します。
Envoyは、OSIモデルのレイヤー3と4で動作するネットワークウィザードです。適応性のあるネットワークフィルターのチェーンを使用して、接続を巧みに管理します。さらに、EnvoyのL7レイヤーフィルターは、HTTPトラフィックを巧みに処理し、HTTP/2およびgRPCプロトコルにも対応しています。
Istioの際立った機能の多くは、実際にはEnvoyの組み込み機能から継承されたスーパーパワーです。
Envoyの真の可能性は、Istioと組み合わせることで発揮されます。WebAssemblyを搭載したその拡張性は、カスタムポリシーの適用とテレメトリのゲームチェンジャーです。さらに、IstioのProxy-WasmサンドボックスAPIは、さらに多くのEnvoyのカスタマイズへの扉を開きます。
Istioのコントロールプレーンのオーケストラの指揮者であるistiodを紹介します。このマエストロは、高レベルのルーティングルールとトラフィック管理の指示をEnvoyフレンドリーな構成に変換し、サイドカーにシームレスに配信します。
Istioの以前のアーキテクチャを覚えていますか?簡素化のために、これらのコンポーネントは統合されistiodにマージされました。しかし、心配はいりません。コア機能はそのままです。
istiodは、以前のコンポーネントと同じコードとAPIを活用しています。例えば、Pilotは引き続きサービスディスカバリーのマエストロであり、プラットフォーム固有の詳細をサイドカーが理解できる普遍的な言語に変換します。この柔軟性により、IstioはKubernetesや仮想マシンなど多様な環境と調和します。
さらに、istiodはセキュリティを担当し、組み込みのIDおよび資格情報管理システムを使用して、堅牢なサービス間およびエンドユーザー認証を提供します。サービスIDに基づいてセキュリティポリシーを簡単に適用できます。さらに、istiodは、認証局(CA)として機能し、MTLSを使用してサービス間通信のために証明書を発行します。
サービスメッシュの一般的な機能について説明し、Istioのアーキテクチャとコアコンポーネントを分析しました。次に、Istioがこれらのコアコンポーネントを使用して、これらの機能をどのように提供するかを見ていきましょう。
前に説明したのと同じ機能カテゴリを再検討します。
Istioのトラフィック管理APIは、サービスメッシュ内のトラフィックをきめ細かく制御します。これらのAPIを使用してトラフィック構成を調整し、Kubernetesカスタムリソース定義(CRD)を使用してAPIリソースを定義します。トラフィックルーティングの主要なAPIリソースは、仮想サービスとデスティネーションルールです。
仮想サービスは、Istioメッシュ内でリクエストをサービスにルーティングする方法を指示します。これは、順番に評価される1つ以上のルーティングルールで構成されます。仮想サービスのルーティング後、デスティネーションルールが適用され、バージョンごとにサービスインスタンスをグループ化するなど、宛先へのトラフィックを制御します。
Istioのセキュリティの基盤は、すべてのサービスに対する強力なIDです。Istioエージェントは各Envoyプロキシと連携し、istiodと協力してキーと証明書のローテーションを自動化します。
Istioは、ピア認証とリクエスト認証の2種類の認証をサポートしています。ピア認証は、IstioのMTLSソリューションを使用して、サービス間通信を保護します。リクエスト認証は、カスタム認証プロバイダーまたはOpenID Connect(OIDC)プロバイダーを使用して、JWTの検証を通じてエンドユーザー認証を処理します。
Istioは、認可ポリシーを適用することにより、サービスへのアクセス制御を実施します。これらのポリシーは、Envoyプロキシのインバウンドトラフィックを制御し、メッシュ、ネームスペース、サービスレベルでのアクセス制御を可能にします。
Istioは、メッシュ内のすべてのサービス通信について、メトリクス、分散トレース、アクセスログを含む包括的なテレメトリを生成します。このテレメトリには、プロキシレベル、サービス指向、およびコントロールプレーンのメトリクスが含まれます。
以前は、MixerはIstioのテレメトリアーキテクチャの中心的なコンポーネントでしたが、Telemetry v2では、Mixerの機能がEnvoyプロキシプラグインに置き換えられています。
Istioは、Envoyプロキシを介して分散トレースを生成し、Zipkin、Jaeger、Lightstep、Datadogなどのさまざまなトレースバックエンドをサポートしています。トレース生成のサンプリングレートは構成可能です。さらに、Istioは、カスタマイズ可能な形式でサービス通信のアクセスログを生成します。
十分なバックグラウンドを踏まえて、Istioを実際に見てみましょう!KubernetesクラスターにIstioをインストールし、シンプルなマイクロサービスアプリを使用してそのパワーを紹介します。
Istioはさまざまな方法でインストールできますが、OS(Windowsなど)の最新リリースをダウンロードして解凍するのが最も簡単です。解凍されたパッケージには、binフォルダーにistioctlクライアントが含まれています。istioctlを使用して、KubernetesクラスターにIstioをインストールします。
istioctl install --set profile=demo -y
これにより、デフォルトのKubernetesクラスターにIstioコンポーネントがインストールされます。必要に応じて、「デモ」を別のプロファイルに置き換えてください。
次に、このKubernetesクラスターにアプリをデプロイするときに、Envoyサイドカープロキシを自動的に挿入するようにIstioに指示します。
kubectl label namespace default istio-injection=enabled
ここでは、Kubernetesクラスター(Minikubeなど)とKubernetes CLI kubectlがセットアップされていることを前提として、kubectlを使用しています。
このデモでは、簡単なオンライン注文アプリを想像してみてください。注文を処理するために連携する3つのマイクロサービスで構成されています。
マイクロサービスの詳細には立ち入りませんが、Spring BootやREST APIを使って簡単に作成できます。重要なのは、これらのマイクロサービスのDockerイメージを作成し、Kubernetesにデプロイすることです。
MinikubeなどのKubernetesクラスターにコンテナ化されたワークロードをデプロイするのは簡単です。DeploymentおよびServiceリソースを使用して、ワークロードを宣言しアクセスできます。通常は、YAMLファイルで定義します。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: order-service
namespace: default
spec:
replicas: 1
template:
metadata:
labels:
app: order-service
version: v1
spec:
containers:
- name: order-service
image: kchandrakant/order-service:v1
resources:
requests:
cpu: 0.1
memory: 200
---
apiVersion: v1
kind: Service
metadata:
name: order-service
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
selector:
app: order-service
これは、order-serviceの基本的なDeploymentおよびService定義です。inventory-serviceおよびshipping-serviceについても同様のYAMLファイルを作成します。
kubectlを使用して、これらのリソースを簡単にデプロイできます。
kubectl apply -f booking-service.yaml -f inventory-service.yaml -f shipping-service.yaml
デフォルトのネームスペースに対してEnvoyサイドカープロキシの自動挿入を有効にしているため、すべて処理されます。または、istioctlのkube-injectコマンドを使用して、Envoyサイドカープロキシを手動で挿入します。
Istioは主にメッシュ内のトラフィックを処理します。デフォルトでは、メッシュ外とのトラフィックはブロックされます。Istioはゲートウェイを使用して、インバウンドおよびアウトバウンドのメッシュトラフィックを管理し、入出力を正確に制御します。Istioは、事前に構成されたゲートウェイプロキシデプロイメントであるistio-ingressgatewayとistio-egressgatewayを提供します。
アプリケーション用のゲートウェイと仮想サービスを作成します。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: booking-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: booking
spec:
hosts:
- "*"
gateways:
- booking-gateway
http:
- match:
- uri:
prefix: /api/v1/booking
route:
- destination:
host: booking-service
port:
number: 8080
ここでは、デフォルトのIstioイングレスコントローラーを使用しています。さらに、リクエストを予約サービスにルーティングする仮想サービスを定義しました。
アウトバウンドメッシュトラフィックのエグレスゲートウェイを定義することもできます。
Istioを使ってKubernetesにシンプルなアプリをデプロイしました。Istioの強力な機能を活用して、アプリケーションをどのように強化できるかを見ていきましょう。
例えば、配送サービスの複数のバージョンをデプロイする場合を想像してみてください。すべてのユーザーに影響を与えることなく、新機能を徐々に導入したいと考えています。リクエストルーティングを使用して、トラフィックの一部を最新バージョンに転送することで、これを実現できます。
仮想サービスのルーティングルールを使用して、これを実現します。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: shipping-service
spec:
hosts:
- shipping-service
http:
- route:
- destination:
host: shipping-service
subset: v1
weight: 90
- destination:
host: shipping-service
subset: v2
weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: shipping-service
spec:
host: shipping-service
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
ルーティングルールは、ヘッダーやその他の属性に基づいてトラフィックをフィルタリングすることもできます。destinationフィールドは、リクエストの照合の対象となるターゲットサービスを指定します。
サーキットブレーカーを使用して、カスケード障害を防ぎます。このパターンは、エラーを検出し、障害が発生しているサービスへのトラフィックを一時的に停止し、アプリケーションの全体的な状態を保護します。
IstioのDestinationRuleを使用すると、在庫サービスなどのサービスのサーキットブレイキングの動作を構成できます。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: inventory-service
spec:
host: inventory-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 1
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
outlierDetection:
consecutive5xxErrors: 1
interval: 1s
baseEjectionTime: 3m
maxEjectionPercent: 100
最大接続数、保留中のリクエスト数、および接続あたりのリクエスト数を制限することで、トラフィックを効果的に管理し、過負荷を防ぐことができます。
相互TLSは、両方の当事者に認証を要求することにより、サービス間の安全な通信を保証します。Istioは、プロキシを使用して、サービスの相互TLSを自動的に有効にします。
Istioはプロキシされたサービス間の相互TLSを適用しますが、プレーンテキストトラフィックはプロキシなしでサービスに到達する可能性があります。PeerAuthenticationポリシーを使用して、メッシュ全体で相互TLSを適用します。
apiVersion: "security.istio.io/v1beta1"
kind: "PeerAuthentication"
metadata:
name: "default"
namespace: "istio-system"
spec:
mtls:
mode: STRICT
メッシュ、ネームスペース、またはサービスレベルで相互TLSを適用できます。サービス固有のポリシーは、ネームスペース全体の設定よりも優先されます。
JWTは、ユーザー情報を安全に送信するための標準です。認証や認可に広く使用されています。
IstioのAuthorizationPolicyを使用して、JWTクレームに基づいてサービスへのアクセスを制御できます。
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
selector:
matchLabels:
app: booking-service
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["[email protected]/[email protected]"]
承認されたアクセスには、特定のクレームを含む有効なJWTが必要です。Istioは、JWTの発行者とサブジェクトのクレームからrequestPrincipal属性を作成します。
Istioは、分散マイクロサービスアーキテクチャの一般的な課題を管理するのを簡素化します。しかし、その複雑さはデプロイにオーバーヘッドを加える可能性があります。どんなツールにも言えることですが、Istioは万能の解決策ではなく、慎重な検討が必要です。
サービスメッシュには利点がありますが、次のような欠点も考慮する必要があります。
サービスメッシュには利点がありますが、アプリケーションの複雑さを慎重に評価し、メリットと追加の複雑さを比較することが重要です。
Istioは業界のリーダーによって支援される人気のサービスメッシュですが、他にも選択肢があります。ここでは、LinkerdとConsulを簡単に紹介します。
Linkerd はKubernetesネイティブのオープンソースサービスメッシュで、人気を集めています。CNCFのインキュベーションプロジェクトであり、Istioと同様にTCPプロキシを使用します。RustベースのマイクロプロキシであるLinkerd-proxyを使用しています。
Linkerdは、Kubernetesに特化しているため、Istioよりもシンプルです。ただし、その機能セットはIstioに似ており、コアアーキテクチャも同様です。Linkerdは、ユーザーインターフェース、データプレーン、コントロールプレーンで構成されています。
Consul はHashiCorpのオープンソースサービスメッシュで、他のHashiCorpインフラストラクチャツールと統合されています。Consulのデータプレーンは、プロキシとネイティブ統合モデルの両方をサポートしています。内蔵のプロキシを提供しますが、Envoyと一緒に使用することもできます。
ConsulはKubernetes以外にも対応しており、Nomadなどのプラットフォームもサポートしています。各ノードにエージェントを配置してヘルスチェックを行い、データストレージとレプリケーションのためにConsulサーバーと通信します。標準的なサービスメッシュ機能を提供しますが、Consulのデプロイと管理はより複雑です。
このチュートリアルでは、サービスメッシュアーキテクチャの基本とIstioの強力な機能について説明しました。Istioのコア構造、コンポーネント、および実際のアプリケーションについて詳しく解説しました。最後まで進めば、Istioをインストールして一般的なシナリオで活用するための確かな知識が得られるはずです。
顧客のフィードバック
以下のレビューは、当社ウェブサイトで収集されました。
質問がありますか? 以下で答えを見つけてください!
最もよくある質問