セキュアなHTTPSプロトコルを介して暗号化されたアクセスを提供する必要がある場合は、Service Mesh (ASM) ingressゲートウェイを使用してHTTPSを有効にできます。 ASMでは、ingressゲートウェイを使用して動的な証明書の読み込みを有効にできます。 これにより、プライベートキー、サーバー証明書、およびルート証明書をリアルタイムで動的に構成でき、ingressゲートウェイを再起動したり、シークレットボリュームをマウントしたりする必要がなくなります。 これにより、操作が簡単になり、入口ゲートウェイの再起動によるサービス中断のリスクがなくなります。 ingressゲートウェイを使用すると、複数の証明書とその秘密鍵を監視および管理できます。 これにより、異なるホストに柔軟で安全な通信機能が提供され、データ送信のセキュリティが強化されます。
前提条件
背景情報
Istioは動的証明書の読み込みをサポートします。 ingressゲートウェイを再起動することなく、Transport Layer Security (TLS) に必要な秘密鍵、サーバー証明書、およびルート証明書を設定できます。 ingress gatewayは、ingress gatewayと同じ名前空間にあるシークレットをリッスンし、Gatewayリソースを使用してシークレットを動的に読み込みます。 ingressゲートウェイのHTTPSを有効にすると、次の利点が得られます。
入口ゲートウェイは、再起動する必要なく、必要に応じて、サーバ証明書および秘密鍵またはルート証明書を動的に追加、削除、および更新することができる。
シークレットボリュームをマウントする必要はありません。 Kubernetesシークレットが作成されると、ingress gatewayは、シークレットに格納されているサーバー証明書と秘密鍵またはルート証明書を取得できます。
複数のホストのシークレットを作成してIstioゲートウェイ (ゲートウェイリソース) を更新すると、ingressゲートウェイは複数のサーバー証明書と秘密鍵のペアをリッスンできます。
手順1: 複数のサーバーのサーバー証明書と秘密鍵を準備する
ドメイン名は、インターネットコンテンツプロバイダ (ICP) の登録を取得した後にのみアクセス可能です。 aliyun.comドメイン名のサーバー証明書と秘密鍵を作成し、サーバー証明書と秘密鍵をシークレットに保存します。
aliyun.comドメイン名で使用できるサーバー証明書と秘密鍵がある場合は、秘密鍵の名前をaliyun.com.keyに、サーバー証明書の名前をaliyun.com.crtに変更します。 または、次のopensslコマンドを実行して、サーバー証明書と秘密鍵を作成しr aliyun.com。
次のコマンドを実行して、ルート証明書と秘密鍵を作成します。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./C N=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt
次のコマンドを実行して、aliyun.comのサーバーの証明書と秘密鍵を作成します。
openssl req -ou t aliyun.com.csr -newkey rsa:2048-ノード-keyou t aliyun.com.key -subj "/C N=aliyun.com/O=myexample組織" openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -i n aliyun.com.csr -ou t aliyun.com.crt
ASMインスタンスのバージョンに基づいて、シークレットまたは証明書を作成します。
1.17より前のバージョンのASMインスタンスの場合
kubectlを使用して、ingress gatewayポッドが属するクラスターに接続し、次のコマンドを実行して、istio-system名前空間の証明書と秘密鍵を含むシークレットを作成します。
kubectl create -n istio-system secret tls myexample-credential -- ke y=aliyun.com.key -- cer t=aliyun.com.crt
重要シークレット名はistioまたはprometheusで始めることはできず、トークンフィールドを含めることはできません。
バージョン1.17以降のASMインスタンスの場合
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[証明書管理] ページで、[作成] をクリックします。 [証明書情報] パネルで、必要なパラメーターを設定し、[OK] をクリックします。
パラメーター
説明
名前
証明書の名前を入力します。 この例では、myexample-credentialを入力します。
公開キー証明書
サブステップ2で生成された
aliyun.com.crt
証明書の内容を入力します。プライベートキー
サブステップ2で生成された
aliyun.com.key
秘密鍵の内容を入力します。
ステップ2: r a.aliyun.comの内部サービスを定義する
この例の内部サービスはNGINXに基づいて実装されています。 最初にNGINXサーバーの構成ファイルを作成する必要があります。 この例では、a.aliyun.comドメイン名に対して内部サービスが作成されます。 要求されたルートパスを定義して、文を直接返すWelcome t o a.aliyun.com!
とステータスコード200
。 myexample-nginx.conf NGINX設定ファイルには、次の内容が含まれています。
イベント {
}
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;
サーバー{
listen 80;
location /hello {
200を返す 'ようこそt o a.aliyun.com!';
add_header Content-Type text/plain;
}
}
}
ingress gatewayポッドが属するクラスターで、次のコマンドを実行して、NGINXサーバーの構成を格納するConfigMapを作成します。
kubectl create configmap myexample-nginx-configmap -- from-file=nginx.conf=./myexample-nginx.conf
デフォルトの名前空間の自動サイドカープロキシ注入を有効にします。 詳細については、「自動サイドカープロキシ注入の有効化」をご参照ください。
次の内容を含むmyexampleapp.yamlファイルを作成します。 次に、
kubectl apply -f myexampleapp.yaml
コマンドを実行して、a.aliyun.comドメイン名の内部サービスを作成します。
ステップ3: r b.aliyun.comの内部サービスを定義する
この例の内部サービスは、HTTPBinに基づいて実装されています。
次のコンテンツを含むhttpbin.example.yamlファイルを作成します。
ingress gatewayポッドが属するクラスターで、次のコマンドを実行して、b.aliyun.comドメイン名の内部サービスを作成します。
kubectl apply -f httpbin.example.yaml
ステップ4: Istioゲートウェイの作成
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。 表示されるページで、[YAMLから作成] をクリックします。
[作成] ページで、名前空間 (この例では既定の名前空間) とシナリオテンプレートを選択し、次のYAMLコードを設定し、[作成] をクリックします。
[ゲートウェイ] ページで、作成したIstioゲートウェイを表示できます。
ステップ5: 仮想サービスの作成
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。 表示されるページで、[YAMLから作成] をクリックします。
[作成] ページで、名前空間とシナリオテンプレートを選択し、次のYAMLコードを設定し、[作成] をクリックして仮想サービスr a.liyun.comを作成します。をします。
同様の方法でb.aliyun.com用の仮想サービスを作成します。
VirtualServiceページで、作成された仮想サービスを表示できます。
結果を表示するView the result
次のいずれかの方法を使用して、ingressゲートウェイのIPアドレスを取得します。
方法1: ASM コンソールでingress gatewayのIPアドレスを表示します。 ASMコンソールにログインし、目的のService Meshインスタンスを見つけます。 左側のナビゲーションウィンドウで、 を選択します。 Ingress Gatewayページで、ingress gatewayのIPアドレスを表示できます。
方法2: ACK コンソールでingressゲートウェイのIPアドレスを表示します。 詳細については、「ingressゲートウェイの作成」トピックの「ACKコンソールでのingressゲートウェイの表示」セクションをご参照ください。
ingressゲートウェイへのアクセス
次のコマンドを実行して、HTTPS経由でa.aliyun.comドメイン名にアクセスします。
curl -k -H Hos t:a.aliyun.com -- resolv e a.aliyun.com:443:{ingress gatewayのIPアドレス} https://a.aliyun.com/hello
期待される出力:
ようこそt o aliyun.com!
次のコマンドを実行して、HTTPS経由でb.aliyun.comドメイン名にアクセスします。
curl -k -H Hos t:b.aliyun.com -- resolv e b.aliyun.com:443:{ingress gatewayのIPアドレス} https://b.aliyun.com/status/418
期待される出力:
-=[ティーポット]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`
関連する API 操作
ゲートウェイ証明書の更新
ingressゲートウェイにマウントされた証明書を更新するには、データプレーンにシークレットを作成し、IstioゲートウェイのYAMLコードのcredentialNameフィールドの値をシークレットの名前に変更する必要があります。 次に、新しいシークレットがゲートウェイに自動的にマウントされます。 次の例では、example.comのサーバーに対してnew-istio-ingressgateway-certsという名前のシークレットが作成されます。
発行者がmyexampleである証明書を作成します。
次のopensslコマンドを実行して、ルート証明書と秘密鍵を作成します。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./C N=example.com' -keyout example.root.key -out example.root.crt
次のコマンドを実行して、example.comのサーバーの証明書と秘密鍵を作成します。
openssl req -ou t example.com.csr -newkey rsa:2048-ノード-keyou t example.com.key -subj "/C N=example.com/O=myexample組織" openssl x509 -req -days 365 -CA example.root.crt -CAkey example.root.key -set_serial 0 -i n example.com.csr -ou t example.com.crt
クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続します。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
次のコマンドを実行して、new-istio-ingressgateway-certsという名前のシークレットを作成します。
kubectl create -n istio-system secret tls new-istio-ingressgateway-certs -- ke y example.com.key -- cer t example.com.crt
クラスターで次のコマンドを実行して、以前のシークレットを削除します。
kubectl delete secret istio-ingressgateway-certs -n istio-system
Istioゲートウェイを更新します。
ASMコンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASMインスタンスの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
On theゲートウェイページで、更新するゲートウェイを見つけて、YAMLで、アクション列を作成します。
では、編集ダイアログボックスで、の値を変更します。credentialNamenew-istio-ingressgateway-certsに移動し、OK.
ゲートウェイ証明書が更新されていることを確認します。
クラスターで次のコマンドを実行して、現在の証明書情報を表示します。
kubectl exec istio-ingressgateway-xxxx -n istio-system -- curl localhost:15000/config_dump > ingressgateway_dump.yaml
次のコマンドを実行して、new-istio-ingressgateway-certs証明書を検索して表示します。
cat ingressgateway_dump.yaml | grep new-istio-ingressgateway-certs -A 3
期待される出力:
inline_bytesパラメーターの内容をコピーして、Base64-encoded証明書を取得します。
ローカルのコマンドラインツールで次のコマンドを実行して、Base64-encoded証明書をデコードします。
echo <Base64-encoded証明書> | base64 -- decode
デコードされたコンテンツをtest.com.crtファイルとして保存します。
次のopensslコマンドを実行して、証明書の組織を表示します。
openssl x509 -i n test.com.crt -text -noout
期待される出力:
組織が
myexample
に変更されました。 これは、ゲートウェイ証明書が更新されたことを示します。