外部トラフィック向けKubernetesサービス
KubernetesのExternalNameサービスと、エンドポイントを持つKubernetesサービスを使用すると、外部サービスへのローカルDNS *エイリアス*を作成できます。このDNSエイリアスは、ローカルサービスのDNSエントリと同じ形式を持ちます。つまり、`<サービス名>.<名前空間名>.svc.cluster.local`です。DNSエイリアスは、ワークロードに*場所の透過性*を提供します。ワークロードは、ローカルサービスと外部サービスを同じ方法で呼び出すことができます。ある時点で外部サービスをクラスタ内にデプロイすることにした場合、そのKubernetesサービスをローカルバージョンを参照するように更新するだけで済みます。ワークロードは変更なしで動作を続けます。
このタスクは、外部サービスへのアクセスのためのこれらのKubernetesメカニズムがIstioでも引き続き機能することを示しています。実行する必要がある唯一の設定手順は、Istioの相互TLS以外のTLSモードを使用することです。外部サービスはIstioサービスメッシュの一部ではないため、Istioの相互TLSを実行できません。外部サービスのTLS要件と、ワークロードが外部サービスにアクセスする方法に応じて、TLSモードを設定する必要があります。ワークロードがプレーンHTTPリクエストを発行し、外部サービスがTLSを要求する場合は、IstioによるTLS発信を実行することを検討してください。ワークロードが既にTLSを使用している場合、トラフィックは既に暗号化されているため、Istioの相互TLSを無効にするだけです。
このタスクの例ではHTTPプロトコルを使用していますが、外部トラフィックのKubernetesサービスは他のプロトコルでも機能します。
開始前に
インストールガイド7の手順に従ってIstioをセットアップします。
リクエストを送信するためのテストソースとして使用するために、curl9サンプルアプリをデプロイします。自動サイドカーインジェクションを有効にしている場合は、次のコマンドを実行してサンプルアプリをデプロイします。
それ以外の場合は、次のコマンドを使用してサイドカーを手動で挿入してから、
curl
アプリケーションをデプロイします。ソースポッドの名前を格納するために、
SOURCE_POD
環境変数を設定します。
Istioの制御を受けないソースポッドの名前空間を作成します。
without-istio
名前空間にcurl9サンプルを起動します。リクエストを送信するには、ソースポッドの名前を格納するために
SOURCE_POD_WITHOUT_ISTIO
環境変数を作成します。Istioサイドカーが挿入されていないこと、つまりポッドにコンテナが1つしかないことを確認します。
外部サービスへのアクセスのためのKubernetes ExternalNameサービス
デフォルトの名前空間に、
httpbin.org
のKubernetes ExternalNameサービスを作成します。サービスを観察します。クラスタIPがないことに注意してください。
Istioサイドカーのないソースポッドから、Kubernetesサービスのホスト名を使用して
httpbin.org
にアクセスします。Kubernetesのサービスに関するDNS形式、つまり`<サービス名>.<名前空間>.svc.cluster.local`を使用していることに注意してください。この例では、暗号化されていないHTTPリクエストが
httpbin.org
に送信されます。例のためだけに、TLSモードを無効にし、外部サービスへの暗号化されていないトラフィックを許可します。現実的なシナリオでは、Istioによる外部TLS発信11を実行することをお勧めします。Istioサイドカーのあるソースポッドから、Kubernetesサービスのホスト名を使用して
httpbin.org
にアクセスします。Istioサイドカーによって追加されたヘッダー(例:X-Envoy-Peer-Metadata
)に注意してください。また、Host
ヘッダーがサービスのホスト名と等しいことにも注意してください。
Kubernetes ExternalNameサービスのクリーンアップ
エンドポイントを持つKubernetesサービスを使用して外部サービスにアクセスする
セレクタのないWikipediaのKubernetesサービスを作成します。
サービスのエンドポイントを作成します。WikipediaのIPアドレス範囲リスト12からいくつかのIPを選択します。
サービスを観察します。
wikipedia.org
にアクセスするために使用できるクラスタIPがあることに注意してください。Istioサイドカーのないソースポッドから、KubernetesサービスのクラスタIPを使用して
wikipedia.org
にHTTPSリクエストを送信します。curl
の--resolve
オプションを使用して、クラスタIPでwikipedia.org
にアクセスします。この場合、ワークロードは
wikipedia.org
にHTTPSリクエスト(オープンTLS接続)を送信します。トラフィックはワークロードによって既に暗号化されているため、Istioの相互TLSを安全に無効にすることができます。Istioサイドカーのあるソースポッドから、KubernetesサービスのクラスタIPを使用して
wikipedia.org
にアクセスします。アクセスが実際にクラスタIPによって実行されていることを確認します。
curl -v
の出力に「Connected to en.wikipedia.org (172.21.156.230)
」という文があることに注意してください。これは、サービスの出力にクラスタIPとして表示されたIPが言及されています。