イングレスゲートウェイとサイドカープロキシ間のすべてのデータは、相互トランスポート層セキュリティ(mTLS)トンネルを介して送信されます。 サイドカープロキシがアプリケーションに挿入されている場合は、エンドツーエンドの暗号化を確保するために、イングレスゲートウェイで TLS ターミネーションを設定することをお勧めします。 サイドカープロキシがアプリケーションに挿入されていない場合、またはその他の特別な状況が発生した場合、イングレスゲートウェイは TLS パススルーをサポートします。 このトピックでは、イングレスゲートウェイで TLS パススルーを有効にして、クラスター内の HTTPS サービスへの安全なアクセスを確保する方法について説明します。
前提条件
クラスターが ASM インスタンスに追加されていること。 詳細については、「ASM インスタンスへのクラスターの追加」をご参照ください。
イングレスゲートウェイがデプロイされていること。 詳細については、「イングレスゲートウェイの作成」をご参照ください。
ASM インスタンスに追加されたクラスターにアプリケーションがデプロイされていること。 詳細については、「ASM インスタンスに追加された ACK クラスターへのアプリケーションのデプロイ」をご参照ください。
インターネットコンテンツプロバイダー(ICP)ファイリングを持つドメイン名を使用できること。 このトピックでは、aliyun.com ドメイン名を使用します。
手順 1:サーバー証明書と秘密鍵を準備する
sample.aliyun.com ドメイン名に使用できるサーバー証明書と秘密鍵がある場合は、秘密鍵の名前を sample.aliyun.com.key に、サーバー証明書の名前を sample.aliyun.com.crt に変更します。 または、次の openssl コマンドを実行して、sample.aliyun.com のサーバー証明書と秘密鍵を作成します。
ルート証明書と秘密鍵を作成するには、次のコマンドを実行します。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=mynginx Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crtsample.aliyun.comサーバーのサーバー証明書と秘密鍵を生成するには、次のコマンドを実行します。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
手順 2:内部サービスを定義する
この例の内部サービスは、NGINX に基づいて実装されています。 まず、NGINX サーバーの設定ファイルを作成する必要があります。 この例では、aliyun.com ドメイン名の内部サービスを使用します。 要求されたルートパスを定義して、Welcome to aliyun.com without TLS Termination! という文とステータスコード 200 を直接返します。 次のサンプルコードは、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;
location / {
return 200 'Welcome to aliyun.com without TLS Termination!'; // TLS ターミネーションなしで aliyun.com へようこそ!
add_header Content-Type text/plain;
}
server_name www.aliyun.com;
ssl_certificate /etc/nginx-server-certs/tls.crt;
ssl_certificate_key /etc/nginx-server-certs/tls.key;
}
}kubeconfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続します。 次に、次のコマンドを実行して、NGINX サーバーの設定を格納する ConfigMap を作成します。
kubectl create configmap mynginx-configmap --from-file=nginx.conf=./mynginx.confkubeconfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続します。 次に、次のコマンドを実行して、デフォルトの名前空間にサーバー証明書と秘密鍵を含むシークレットを作成します。
kubectl create secret tls nginx-server-certs --key sample.aliyun.com.key --cert sample.aliyun.com.crtデフォルトの名前空間に対してサイドカープロキシの自動挿入を有効にします。 手順の詳細については、「サイドカープロキシの自動挿入を有効にする」をご参照ください。
次の内容を含む mynginxapp.yaml ファイルを作成します。 次に、
kubectl apply -f mynginxapp.yamlコマンドを実行して、aliyun.com ドメイン名の内部サービスを作成します。サイドカープロキシから NGINX サーバーにリクエストを送信して、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.com
手順 3:Istio ゲートウェイを作成する
ASM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の [アクション] をクリックするか、ASM インスタンスの名前をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。 表示されたページで、[YAML から作成] をクリックします。
[作成] ページで、次の手順を実行して Istio ゲートウェイを定義します。 次に、[作成] をクリックします。
必要に応じて名前空間を選択します。 この例では、[default] 名前空間が選択されています。
コードエディターで、次の YAML コードを使用して Istio ゲートウェイを定義します。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-mynginx-customingressgateway spec: selector: istio: ingressgateway servers: - hosts: - 'sample.aliyun.com' port: name: https number: 443 protocol: HTTPS tls: mode: PASSTHROUGH // PASSTHROUGH モードを指定
[ゲートウェイ] ページで、作成された Istio ゲートウェイを表示できます。
手順 4:仮想サービスを作成する
ASM コンソール にログインします。
左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、構成する ASM インスタンスを見つけます。[管理] 列の [アクション] をクリックするか、ASM インスタンスの名前をクリックします。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。 表示されたページで、[YAML から作成] をクリックします。
[作成] ページで、次の手順を実行して仮想サービスを定義します。 次に、[作成] をクリックします。
必要に応じて名前空間を選択します。 この例では、[default] 名前空間が選択されています。
コードエディターで、次の YAML コードを使用して仮想サービスを定義します。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: istio-mynginx-customvirtualservice spec: hosts: - "sample.aliyun.com" gateways: - istio-mynginx-customingressgateway tls: - match: - port: 443 sniHosts: - sample.aliyun.com route: - destination: host: mynginxapp.default.svc.cluster.local port: number: 443
[VirtualService] ページで、作成された仮想サービスを表示できます。
結果の表示
次のいずれかの方法を使用して、イングレスゲートウェイの IP アドレスを取得します。
方法 1:ASM コンソールを使用する。 詳細については、「Istio リソースを使用してトラフィックをサービスの異なるバージョンにルーティングする」トピックの手順 3 のサブステップ 1 をご参照ください。
方法 2:kubectl コマンドを実行する。
kubeconfig ファイルの情報に基づいて、イングレスゲートウェイポッドが属するクラスターに kubectl を使用して接続します。 次に、次のコマンドを実行して、イングレスゲートウェイの IP アドレスを取得します。
kubectl get svc -n istio-system -l istio=ingressgateway
HTTPS 経由で aliyun.com ドメイン名にアクセスするには、次のコマンドを実行します。
curl -v --cacert aliyun.root.crt --resolve sample.aliyun.com:443:xx.xx.xx.xx https://sample.aliyun.com予期される出力:
Welcome to aliyun.com without TLS Termination!%