Container Service for Kubernetes (ACK) クラスタ内のアプリケーションには、複数の方法でアクセスできます。たとえば、<SLB-Instance-IP>:<Port>
、<NodeIP>:<NodePort>
、またはアプリケーションのドメイン名を使用してアプリケーションにアクセスできます。デフォルトでは、Kubernetes クラスタに HTTPS 経由でアクセスすることはできません。データセキュリティのために HTTPS 経由でクラスタにアクセスする場合は、ACK または Server Load Balancer (SLB) によって提供される Ingress を使用できます。このトピックでは、ACK クラスタへの HTTPS 経由のアクセスに使用する証明書の構成方法について説明します。
前提条件
クラスタ用にサーバー証明書が作成されます。サーバー証明書は、公開鍵証明書と秘密鍵で構成されます。
次のコマンドを実行して、証明書情報を指定し、ACK クラスタのサーバー証明書を作成できます。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt
次の結果が返されます。
Generating a 2048 bit RSA private key .......+++ .......+++ writing new private key to 'tls.key' ----- You are about to be asked to enter information that will be incorporated // 証明書リクエストに組み込まれる情報を入力するように求められます。 into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. // 入力しようとしているのは、識別名または DN と呼ばれるものです。 There are quite a few fields but you can leave some blank // かなりの数のフィールドがありますが、いくつかは空白のままにすることができます。 For some fields there will be a default value, // 一部のフィールドにはデフォルト値があります。 If you enter '.', the field will be left blank. // 「.」を入力すると、フィールドは空白のままになります。 ----- Country Name (2 letter code) []:CN // 国名(2 文字コード) State or Province Name (full name) []:zhejiang // 州または都道府県名(フルネーム) Locality Name (eg, city) []:hangzhou // 地域名(例:市) Organization Name (eg, company) []:alibaba // 組織名(例:会社) Organizational Unit Name (eg, section) []:test // 組織単位名(例:セクション) Common Name (eg, fully qualified host name) []:foo.bar.com # The domain name must be valid. // コモンネーム(例:完全修飾ホスト名)# ドメイン名は有効でなければなりません。 Email Address []:te**@alibaba.com // メールアドレス
証明書ファイル tls.crt と秘密鍵ファイル tls.key は、現在のディレクトリに保存されます。
Alibaba Cloud が提供するサーバー証明書を購入することもできます。詳細については、「証明書を作成する」をご参照ください。
背景情報
クラスタへのアクセス方法に基づいて、次の方法で証明書を構成できます。
SLB インスタンスで証明書情報を指定します。
Ingress で証明書情報を指定します。
SLB インスタンスで証明書情報を指定する
この方法を使用する場合は、次の点に注意してください。
利点:SLB インスタンスで証明書情報を指定すると、SLB インスタンスを使用して HTTPS 経由の外部リクエストを受信できます。クラスタ内からのリクエストは引き続き HTTP 経由で転送されます。
欠点:ドメイン名と IP アドレスの間のマッピングを多数維持する必要があります。
シナリオ:アプリケーションは、Ingress ではなく LoadBalancer サービス経由でアクセスされます。
準備:
NGINX アプリケーションがクラスタにデプロイされ、LoadBalancer サービスを使用してアプリケーションが公開されます。詳細については、「デプロイメントを使用してステートレスアプリケーションを作成する」をご参照ください。
例:
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のペインで、 を選択します。
関連するサービスがデプロイされている名前空間を選択し、サービスリストで [外部 IP] を表示します。
<SLB IP>:<Port>
形式の外部 IP を使用してアプリケーションにアクセスできます。SLB コンソール にログインします。
[SSL 証明書] を構成します。
前提条件で説明されているように、コマンドを実行してサーバー証明書を作成した場合は、公開鍵証明書と秘密鍵を含む作成した証明書を Alibaba Cloud にアップロードする必要があります。詳細については、「証明書を作成する」をご参照ください。
Alibaba Cloud が提供するサーバー証明書を購入した場合は、この手順をスキップします。Alibaba Cloud が提供するサーバー証明書の購入方法の詳細については、「証明書を作成する」をご参照ください。
証明書リストから使用する証明書を見つけます。
ACK コンソールの [サービス] ページで、作成したサービスを見つけ、更新[アクション] 列の をクリックします。
[サービスの更新] ダイアログボックスで、次の図に示すようにアノテーションを入力します。
アノテーション
名前
値
アノテーション 1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port
https:443
アノテーション 2
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id
${YOUR_CERT_ID}
説明${YOUR_CERT_ID} は、手順 7 で構成した証明書の ID に置き換えます。
YAML ファイルを使用してアノテーションを追加することもできます。次の YAML ファイルは例です。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443" // service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443" service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}" // service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}" name: nginx namespace: default spec: ports: - name: https port: 443 protocol: TCP targetPort: 80 - name: http port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: LoadBalancer
説明targetPort を 80 に設定します。これにより、HTTPS ポート 443 へのリクエストは HTTP ポート 80 にリダイレクトされます。
ブラウザのアドレスバーに
https://<slb-instance-ip>
と入力して、HTTPS 経由で NGINX アプリケーションにアクセスします。
Ingress で証明書情報を指定する
この方法を使用する場合は、次の点に注意してください。
利点:SLB 構成を変更する必要はありません。Ingress を使用して、異なるアプリケーションの証明書を個別に管理できます。
シナリオ:クラスタ内の各アプリケーションに個別の証明書が必要な場合、またはクラスタ内のアプリケーションに証明書を使用してのみアクセスできる場合。
準備:
Tomcat アプリケーションがクラスタに作成されます。ClusterIP サービスを使用してアプリケーションにアクセスできます。この例では、Ingress を使用して HTTPS 経由の外部アクセスを有効にします。詳細については、「デプロイメントを使用してステートレスアプリケーションを作成する」をご参照ください。
例:
次のコマンドを実行して、前提条件で作成した証明書を使用してシークレットを作成します。
説明有効なドメイン名を指定する必要があります。そうしないと、HTTPS 経由でアプリケーションにアクセスしたときにエラーが発生します。
kubectl create secret tls secret-https --key tls.key --cert tls.crt
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のペインで、 を選択します。
[Ingress] ページで、[Ingress の作成] をクリックします。
[Ingress の作成] ダイアログボックスで、HTTPS 経由でアクセスできる Ingress を構成し、[OK] をクリックします。
詳細については、「NGINX Ingress を作成する」をご参照ください。この例では、次のパラメータを設定します。
[名前]:Ingress の名前を入力します。
[ドメイン名]:前の手順で指定したドメイン名を入力します。このドメイン名は、SSL 証明書で指定されたドメイン名と同じである必要があります。
[サービス]:Tomcat アプリケーションに関連付けられているサービスを選択します。ポート番号は 8080 です。
[TLS 設定]:TLS を有効にした後、作成した [シークレット] を選択します。
YAML ファイルを使用して Ingress を作成することもできます。次の YAML テンプレートは例です。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tomcat-https spec: tls: - hosts: - foo.bar.com secretName: secret-https rules: - host: foo.bar.com http: paths: - path: / backend: serviceName: tomcat-svc servicePort: 8080
[Ingress] ページに戻り、新しく作成された Ingress を確認します。Ingress のエンドポイントとドメイン名もページに表示されます。この例では、ドメイン名は
foo.bar.com
です。これらの詳細は、Ingress の詳細ページでも表示できます。説明この例では、
foo.bar.com
がテストドメイン名として使用されています。 hosts ファイルにマッピングを追加する必要があります。47.110.119.203 foo.bar.com # IP アドレスは Ingress のエンドポイントです。
ブラウザのアドレスバーに
https://foo.bar.com
と入力します。説明TLS 証明書が作成され、Ingress 用に構成されています。したがって、HTTPS 経由でドメイン名にアクセスする必要があります。この例では、
foo.bar.com
はローカル DNS サーバーで解決されます。インターネットコンテンツプロバイダー(ICP)番号を持つドメイン名を使用する必要があります。