TLS パススルーを使用すると、イングレスゲートウェイは暗号化された TLS トラフィックを復号せずにバックエンドサービスに直接転送します。ゲートウェイではなくバックエンドサービスが TLS 終端を処理するため、クライアントからサーバーへの TLS セッションは中断されません。
これは、ゲートウェイがトラフィックを転送する前に復号する TLS 終端とは異なります。
| モード | TLS 終端場所 | ユースケース |
|---|---|---|
| TLS 終端 | イングレスゲートウェイ | サイドカープロキシが注入され、ゲートウェイとサイドカー間のトラフィックは mTLS トンネルを介して転送されます。 |
| TLS パススルー | バックエンドサービス | サイドカープロキシが注入されない場合、または中間復号なしでエンドツーエンド暗号化が必要なその他の特殊な状況。 |
注: サイドカープロキシが注入されている場合、イングレスゲートウェイとサイドカープロキシ間のすべてのトラフィックは相互 TLS (mTLS) トンネルを介して転送されます。その場合は、代わりにイングレスゲートウェイで TLS 終端を構成してください。
TLS パススルーは、トラフィックをルーティングするためにサーバ名表示 (SNI) に依存します。ご利用のクライアントは SNI TLS 拡張機能をサポートしている必要があります。
前提条件
開始する前に、以下を確認してください。
イングレスゲートウェイがデプロイされていること。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ASM インスタンスに追加されたクラスターにアプリケーションがデプロイされていること。詳細については、「ASM インスタンスに追加された ACK クラスターへのアプリケーションのデプロイ」をご参照ください。
インターネットコンテンツプロバイダー (ICP) 登録済みのドメイン名があること (
aliyun.comは以下の手順で例として使用されます)。イングレスゲートウェイをホストするクラスターに接続するように kubectl が構成されていること。
ステップ 1: サーバー証明書と秘密鍵の準備
sample.aliyun.com のサーバー証明書と秘密鍵をすでに持っている場合は、それらを sample.aliyun.com.crt と sample.aliyun.com.key に名前変更し、ステップ 2 にスキップしてください。
それ以外の場合は、テスト用に自己署名証明書を生成するために、次の openssl コマンドを実行します。
ルート認証局 (CA) の作成:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=mynginx Inc./CN=aliyun.com' \ -keyout aliyun.root.key -out aliyun.root.crtルート CA によって署名されたサーバー証明書の生成:
openssl req -out sample.aliyun.com.csr -newkey rsa:2048 -nodes \ -keyout sample.aliyun.com.key \ -subj "/CN=sample.aliyun.com/O=mynginx sample organization" openssl x509 -req -days 365 \ -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 \ -in sample.aliyun.com.csr -out sample.aliyun.com.crt
これらのコマンドは次のファイルを生成します。
| ファイル | 目的 |
|---|---|
aliyun.root.crt / aliyun.root.key | ルート CA 証明書と秘密鍵 |
sample.aliyun.com.crt / sample.aliyun.com.key | sample.aliyun.com |
sample.aliyun.com.csr | 証明書署名要求 (中間ファイル) |
ステップ 2: HTTPS バックエンドサービスのデプロイ
このステップでは、ポート 443 で TLS を終端する NGINX ベースのバックエンドサービスをデプロイします。イングレスゲートウェイは、復号せずにこのサービスに TLS トラフィックをパススルーします。
NGINX 構成の作成
次のコンテンツで mynginx.conf という名前のファイルを作成します。
events {
}
http {
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log;
server {
listen 443 ssl;
server_name www.aliyun.com;
ssl_certificate /etc/nginx-server-certs/tls.crt;
ssl_certificate_key /etc/nginx-server-certs/tls.key;
location / {
return 200 'Welcome to aliyun.com without TLS Termination!';
add_header Content-Type text/plain;
}
}
}サポートする Kubernetes リソースの作成
NGINX 構成を保存するための ConfigMap を作成します。
kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.confサーバー証明書と秘密鍵を保存するための Secret を作成します。
kubectl create secret tls nginx-server-certs \ --key sample.aliyun.com.key --cert sample.aliyun.com.crtdefault名前空間の自動サイドカープロキシ注入を有効にします。詳細については、「自動サイドカープロキシ注入の有効化」をご参照ください。
NGINX サービスのデプロイ
次のコンテンツで mynginxapp.yaml という名前のファイルを作成し、kubectl apply -f mynginxapp.yaml を実行します。
バックエンドサービスの検証
サイドカープロキシから NGINX サーバーにテストリクエストを送信するには、次のコマンドを実行します。
kubectl exec -it $(kubectl get pod -l app=mynginxapp -o jsonpath={.items..metadata.name}) \
-c istio-proxy -- curl -v -k --resolve sample.aliyun.com:443:127.0.0.1 https://sample.aliyun.comNGINX サーバーが正しく実行されている場合、レスポンスボディには以下が含まれます。
Welcome to aliyun.com without TLS Termination!ステップ 3: TLS パススルーを持つ Istio ゲートウェイの作成
ポート 443 でリッスンし、終端せずに TLS トラフィックをバックエンドに転送する Gateway リソースを定義します。
ASM コンソールにログインします。
左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。ASM インスタンスの名前をクリックするか、[操作] 列の [管理] をクリックします。
左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [ゲートウェイ] を選択します。表示されるページで、[YAML からの作成] をクリックします。
[デフォルト] 名前空間を選択し、以下の YAML を貼り付けます。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-mynginx-customingressgateway spec: selector: istio: ingressgateway # binds to the default ingress gateway servers: - hosts: - 'sample.aliyun.com' port: name: https number: 443 protocol: HTTPS tls: mode: PASSTHROUGH # forward encrypted traffic without termination[作成] をクリックします。
新しいゲートウェイは [ゲートウェイ] ページに表示されます。
ステップ 4: TLS ルーティング用の仮想サービスの作成
SNI ホスト sample.aliyun.com に一致する TLS トラフィックをバックエンドサービスにルーティングする VirtualService を定義します。
ASM コンソールにログインします。
左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、設定する ASM インスタンスを見つけます。ASM インスタンスの名前をクリックするか、[操作] 列の [管理] をクリックします。
左側のナビゲーションウィンドウで、[トラフィック管理センター] > [VirtualService] を選択します。表示されたページで、[YAML から作成] をクリックします。
[デフォルト] 名前空間を選択し、次の YAML を貼り付けます。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-mynginx-customvirtualservice spec: hosts: - "sample.aliyun.com" gateways: - istio-mynginx-customingressgateway # reference the Gateway from Step 3 tls: - match: - port: 443 sniHosts: - sample.aliyun.com # route traffic by SNI hostname route: - destination: host: mynginxapp.default.svc.cluster.local # backend service FQDN port: number: 443[作成] をクリックします。
新しいVirtualServiceは、[VirtualService] ページに表示されます。
結果の検証
次のいずれかの方法を使用して、イングレスゲートウェイの IP アドレスを取得します。
ASM コンソール: 詳細については、「Istio リソースを使用したサービスの異なるバージョンへのトラフィックのルーティング」のステップ 3 のサブステップ 1 をご参照ください。
kubectl:
kubectl get svc -n istio-system -l istio=ingressgatewayEXTERNAL-IP列にゲートウェイの IP アドレスが表示されます。
イングレスゲートウェイを介して HTTPS リクエストを送信します。
<ingress-gateway-ip>を前のステップの IP アドレスに置き換えます。curl -v --cacert aliyun.root.crt \ --resolve sample.aliyun.com:443:<ingress-gateway-ip> \ https://sample.aliyun.com期待される出力:
Welcome to aliyun.com without TLS Termination!これにより、TLS トラフィックがイングレスゲートウェイを介して NGINX バックエンドにパススルーされ、NGINX バックエンドが TLS を終端して応答を返すことが確認されます。
クリーンアップ
このチュートリアルで作成されたリソースを削除するには、次のコマンドを実行します。
kubectl delete gateway istio-mynginx-customingressgateway
kubectl delete virtualservice istio-mynginx-customvirtualservice
kubectl delete service mynginxapp
kubectl delete deployment mynginxapp
kubectl delete secret nginx-server-certs
kubectl delete configmap mynginx-configmap