HTTPSリスナーを追加するときに、リスナーとクライアント間の接続が暗号化されるように、Secure Sockets Layer (SSL) またはTransport Layer Security (TLS) 証明書を設定する必要があります。 このトピックでは、Application Load Balancer (ALB) Ingressを使用して証明書を設定する方法について説明します。
証明書の設定方法の比較
ALB Ingressを使用すると、自動証明書検出、Secretsとして保存された証明書、AlbConfigsで証明書の指定を設定できます。 次の表は、3つの設定方法を比較しています。
項目 | 自動証明書検出の使用 | AlbConfigsでの証明書の指定 | 証明書をKubernetes Secretsとして管理 |
証明書の格納場所 | 証明書管理サービスにアップロードされました。 | クラスターにSecretsとして保存されます。 | |
証明書の検出方法 | ALBインスタンスは、ドメイン名に基づいて証明書を自動的に検出します。 | ALBインスタンスは、certificate Management Serviceによって生成された証明書IDに基づいて証明書を検出します。 | ALBインスタンスは、クラスターでシークレットを指定して証明書を検出します。 |
シナリオ | この機能は、Certificate Management Serviceコンソールで購入またはアップロードされた証明書に適しています。 | この機能は、cert-managerなどの管理ツールを使用する場合など、クラスターで管理される証明書に適しています。 | |
名前空間全体で証明書を使用する | 対応 | サポートされていません。 シークレットの名前空間に制限されます。 | |
証明書を更新する方法 | [certificate Management Serviceコンソール] で、新しい証明書をアップロードするか、証明書を更新する必要があります。 次に、Ingress設定を手動で変更する必要があります。 | Ingressに関連付けられているシークレットを更新する必要があります。 |
ALBインスタンスは、最大25の追加証明書をサポートします。 ALBインスタンスによって管理される証明書の数は、通常、ALBインスタンスのすべてのリスナーに追加される証明書の総数に等しくなります。 ALBクォータの計算方法の詳細については、「ALBクォータの計算方法」をご参照ください。
異なる方法で構成された証明書の互換性
次の表に、さまざまな証明書設定方法の互換性を示します。
証明書の設定方法 | 説明 |
証明書は自動証明書検出を使用して設定され、証明書はKubernetes Secretを使用して設定されます。 |
|
証明書は自動証明書検出を使用して構成され、証明書はAlbConfigで指定されます。両方の証明書は同じリスナーに関連付けられています。 | リスナーは、AlbConfigで指定された証明書のみを使用します。 |
証明書はKubernetes Secretを使用して設定され、証明書はAlbConfigで指定されます。 | 両方の証明書が使用されます。 |
前提条件
HTTPSリスナーが設定されたAlbConfigが作成されます。 詳細については、「ALB Ingressの作成」をご参照ください。
kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
信頼できる証明書が取得されます。 次のいずれかの方法を使用して取得できます。
証明書管理サービスコンソールで証明書を購入します。 詳細については、「SSL証明書の購入」をご参照ください。
別の認証局 (CA) によって発行された証明書を購入します。
(オプション) 手順1: 自己署名証明書の作成の手順に従って、自己署名証明書を作成します。
(オプション) ステップ1: 自己署名証明書の作成
次のOpenSSLコマンドを実行して、自己署名証明書を作成できます。
信頼性の高いCA認証がないため、デフォルトではブラウザやクライアントで自己署名証明書が信頼されず、アクセス中にユーザーにセキュリティ警告が表示されることがよくあります。 このトピックで生成された自己署名証明書は参照用であり、本番環境では使用しないでください。
openssl genrsa -out albtop-key.pem 4096
openssl req -subj "/CN=demo.alb.ingress.top" -sha256 -new -key albtop-key.pem -out albtop.csr # demo.alb.ingress.top can be replaced with your domain name
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf # demo.alb.ingress.top can be replaced with your domain name
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
コマンドのdemo.alb.ingress.top
は、作成された自己署名証明書に関連付けられたドメイン名です。 ドメイン名に置き換えます。
手順2: 必要なリソースの作成
ALB Ingressは、デプロイメント、サービス、IngressClasses、およびIngressが期待どおりに機能する必要があります。 次のYAMLテンプレートを使用して、これら4つのリソースを作成します。
https-quickstart.yamlという名前のファイルを作成し、次の内容をファイルにコピーして保存します。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: https-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb # Change to the name of the AlbConfig resource --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # Replace demo.alb.ingress.top with the domain name associated with the certificate http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix --- apiVersion: apps/v1 kind: Deployment metadata: name: https-deploy spec: replicas: 1 selector: matchLabels: app: https-deploy template: metadata: labels: app: https-deploy spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest imagePullPolicy: IfNotPresent name: https-deploy ports: - containerPort: 80 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: https-svc spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 80 selector: app: https-deploy sessionAffinity: None type: ClusterIP
(オプション) AlbConfigでHTTPリスナーとHTTPSリスナーの両方が設定されている場合は、Ingressに
annotations
フィールドを追加して、Ingressが複数のリスナーに関連付けられるようにします。 次のコードは、設定を示しています。次のコマンドを実行してリソースを作成します。
kubectl apply -f https-quickstart.yaml
手順3: 証明書の設定
自動証明書検出の使用
証明書をcertificate Management Serviceコンソールにアップロードした後、Ingressのtls
フィールドに証明書に関連付けられたドメイン名を入力して、ALB Ingressがアップロードされた証明書を自動的に検出して使用できるようにします。
証明書管理サービスコンソールに自己署名証明書をアップロードします。 詳細については、「SSL証明書のアップロードと共有」をご参照ください。
Ingress設定を変更します。
次のコマンドを実行して、Ingressを編集します。
kubectl edit ingress https-ingress
tls
フィールドを追加し、証明書に関連付けられたドメイン名を入力します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top http: #... tls: - hosts: - demo.alb.ingress.top # Must be consistent with the domain name in the "rules: host" field and the domain name associated with the certificate
に関連付けられたドメイン名と一致している必要があります
証明書をKubernetes Secretsとして管理する
証明書をシークレットとしてクラスターに保存し、Ingressで使用できます。
次のコマンドを実行して、Base64を使用して証明書と秘密鍵をエンコードします。
echo -n 'cat albtop-key.pem '| base64# albtop-key.pemを秘密鍵ファイル
に置き換える
echo -n 'cat albtop-cert.pem' | base64# albtop-cert.pemを証明書ファイルに置き換える
シークレットを作成します。
https-secret.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: v1 kind: 秘密 メタデータ: 名前: https-secret タイプ: kubernetes.io/tls データ: tls.key: | {base64 albtop-key.pem} # Base64エンコードalbtop-cert.pem。 tls.crt: | {base64 albtop-cert.pem} # Base64エンコードalbtop-key.pem。
次のコマンドを実行して、シークレットを作成します。
kubectl apply -f https-secret.yaml
Ingressの設定を変更します。
次のコマンドを実行して、Ingressを編集します。
kubectl edit ingress https-ingress
tls
フィールドを追加し、証明書に関連付けられたドメイン名とシークレットの名前を入力します。apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: https-ingress namespace: デフォルト spec: ingressClassName: alb rules: -host: demo.alb.ingress.top http: #... tls: - hosts: -demo.alb.ingress.top# "rules: host" フィールドのドメイン名と証明書に関連付けられたドメイン名と一致している必要があります secretName: https-secret
AlbConfigsで証明書を指定する
証明書をcertificate Management Serviceコンソールにアップロードした後、AlbConfigのリスナーのCertificateId
フィールドに証明書IDを入力して、アップロードされた証明書をリスナーに関連付けます。
リスナーに証明書が設定されている場合、自動証明書検出機能は使用されなくなります。
証明書管理サービスコンソールに自己署名証明書をアップロードします。 詳細については、「SSL証明書のアップロードと共有」をご参照ください。
証明書IDを取得します。
にログインします。Certificate Management Serviceコンソール.
左側のナビゲーションウィンドウで、.
SSL証明書管理ページで、アップロード証明書の管理タブをクリックします。 表示する証明書を見つけて、[操作] 列の
を選択します。[証明書の詳細] パネルで、CertIdentifierを表示できます。
証明書をAlbConfigで指定します。
次のコマンドを実行して、AlbConfigを変更します。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> をAlbConfigの名前に置き換えます。
リスナーに
certificates
フィールドを追加し、前の手順で取得したCertIdentifierを入力します。apiVersion: alibabacloud.com/v1 kind: AlbConfig メタデータ: 名前: alb spec: config: #... リスナー: - port: 443 protocol: HTTPS 証明書: -CertificateId: 756 ****-cn-hangzhou # CertIdentifier of the certificate IsDefault: true# デフォルトの証明書かどうか -ポート: #... protocol: #...
ステップ4: 結果を確認する
HTTPS経由でサービスにアクセスして、証明書が設定されているかどうかを確認できます。
次のコマンドを実行して、Ingress情報を表示します。
kubectl get ingress
期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE https-ingress https-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80, 443 83m
HOSTS
およびADDRESS
の下の値をコピーして、後で使用します。次のコマンドを実行して、ALB Ingressを介してHTTPSを使用してバックエンドサービスにアクセスします。
demo.alb.ingress.top
およびalb-******** .alb.aliyuncs.com
を前の手順で取得した値に置き換えます。curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com
次の出力が返されると、証明書が設定されます。
old
関連ドキュメント
HTTP/3を使用してクライアントアクセスを有効にする方法の詳細については、「QUICリスナーを使用してHTTP/3をサポートする」をご参照ください。
HTTPSリスナーで相互認証を設定する方法の詳細については、「HTTPS相互認証を使用してサービスセキュリティを強化する」をご参照ください。