証明書の自動検出、Secret、または AlbConfig を使用して、ALB Ingress の HTTPS 証明書を設定します。
証明書設定方法の選択
証明書の管理ニーズに基づいて方法を選択します。
-
証明書の自動検出:証明書がすでに証明書管理サービスに存在する場合に最適です。Secret は不要で、名前空間をまたいだアクセスをサポートしています。
-
Secret で管理される証明書:cert-manager などのクラスター内ツールとの連携に最適です。Secret を更新すると自動的に更新されます。
-
AlbConfig で指定された証明書:明示的な証明書 ID を使用し、リスナーレベルで証明書を一元管理する場合に最適です。
| 証明書の自動検出 | Secret で管理される証明書 | AlbConfig で指定された証明書 | |
|---|---|---|---|
| 証明書のストレージ | 証明書管理サービス | Kubernetes Secret | 証明書管理サービス |
| 証明書の検出 | 証明書にバインドされたドメイン名による | 証明書を格納する Secret による | 証明書 ID による |
| 最適なケース | 証明書管理サービスで購入またはアップロードされた証明書 | cert-manager などのクラスター内ツールで管理される証明書 | リスナーレベルでの一元的な証明書管理 |
| 名前空間をまたいだサポート | はい | いいえ — Secret はその名前空間内でのみアクセス可能です | N/A |
| 証明書の更新 | 新しい証明書を証明書管理サービスにアップロードし、Ingress 設定を更新します | 証明書を格納する Secret を更新します | 新しい証明書をアップロードし、AlbConfig を更新します |
ALB インスタンスは、Ingress 経由で設定されたものを含め、すべてのリスナーで最大 25 個の証明書をサポートします。「ALB クォータの計算方法」をご参照ください。
証明書の互換性
複数の方法が同じリスナーに適用される場合、以下のルールによって有効になる証明書が決まります。
| 設定 | 動作 |
|---|---|
| 証明書の自動検出 + Secret、同じドメイン | Secret ベースの証明書が優先されます。 |
| 証明書の自動検出 + Secret、異なるドメイン | 各証明書が、対応するドメインで使用されます。 |
| 証明書の自動検出 + AlbConfig、同じリスナー | AlbConfig で指定された証明書のみが使用されます。 |
| Secret + AlbConfig、同じリスナー | 両方の証明書が使用されます。 |
前提条件
以下を確認してください。
-
信頼できる SSL/TLS 証明書。次のいずれかの方法で取得します。
-
「証明書管理サービスコンソール」から証明書を購入します。詳細については、「公式証明書の購入」をご参照ください。
-
サードパーティの CA から証明書を購入します。
-
(オプション) テスト用に自己署名証明書を作成します。詳細については、後述の「自己署名証明書の作成」をご参照ください。
-
仕組み
AlbConfig には、デフォルトでポート 80 の HTTP リスナーのみが含まれています。HTTPS リスナーを作成して証明書を設定する必要があります。設定しない場合、HTTPS リスナーは利用できず、ALB Ingress コントローラーがエラーを報告します。
手順 1:AlbConfig での HTTPS リスナーの作成
ポート 443 の HTTPS リスナーを AlbConfig に追加します。
ACK コンソール
-
ACK コンソールにログインします。左側メニューで、[クラスター] をクリックします。
-
[クラスター] ページで、対象のクラスター名をクリックします。左側メニューで、[ワークロード] > [カスタムリソース] を選択します。
-
[リソースオブジェクト] タブで、
AlbConfigを検索し、結果をクリックします。 -
[AlbConfig] パネルで、
albという名前のリソースを見つけ、[操作] 列の [YAML の編集] をクリックします。 -
[YAML で表示] パネルで、
spec.listenersの下にport: 443とprotocol: HTTPSを追加し、[OK] をクリックします。
kubectl
-
AlbConfig を編集用に開きます。
kubectl edit albconfig <Albconfig_Name> -
spec.listenersの下に HTTPS リスナーを追加します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: addressAllocatedMode: Fixed addressType: Internet zoneMappings: - vSwitchId: vsw-bp19sXXXXXXX176iv - vSwitchId: vsw-bp1boXXXXXXXu74xz listeners: - port: 80 protocol: HTTP - port: 443 # HTTPS 用にこのリスナーを追加します。 protocol: HTTPS # 有効な値: HTTP、HTTPS、QUIC。
手順 2:自己署名証明書の作成 (オプション)
信頼できる証明書が既にある場合は、この手順をスキップしてください。自己署名証明書は信頼できないため、テストにのみ適しています。
demo.alb.ingress.top ドメインの自己署名証明書を生成します。ドメインはご自身のものに置き換えてください。
openssl genrsa -out albtop-key.pem 4096
openssl req -subj "/CN=demo.alb.ingress.top" -sha256 -new -key albtop-key.pem -out albtop.csr
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
証明書と秘密鍵を表示します。
cat albtop-key.pem # 秘密鍵
cat albtop-cert.pem # 証明書
両方のファイルを Base64 でエンコードします (Kubernetes Secret で必要です)。
cat albtop-key.pem | base64 # Base64 でエンコードされた秘密鍵
cat albtop-cert.pem | base64 # Base64 でエンコードされた証明書
手順 3:サンプルリソースの作成
ALB Ingress に必要な 4 つの Kubernetes リソース (Deployment、Service、IngressClass、Ingress) を作成します。
ACK コンソール
-
ACK コンソールにログインします。左側メニューで、[クラスター] をクリックします。
-
[クラスター] ページで、対象のクラスター名をクリックします。左側メニューで、[ワークロード] > [Deployments] を選択します。
-
[YAML から作成] をクリックします。
-
[サンプルテンプレート]:[カスタム] を選択します。
-
[テンプレート]:この YAML をエディターにコピーします。
-
-
[作成] をクリックします。
-
リソースが作成されたことを確認します。
-
左側メニューで、[ワークロード] > [Deployments] を選択します。
https-deployが実行中であることを確認します。 -
[ネットワーク] > [Services] を選択します。
https-svcが作成されたことを確認します。 -
[ネットワーク] > [Ingresses] を選択します。
https-ingressが作成されたことを確認します。
-
kubectl
-
次の内容で
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 # お使いの AlbConfig の名前に設定します。 --- 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 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix -
設定を適用します。
kubectl apply -f https-quickstart.yaml
手順 4:証明書の設定
以下の 3 つの方法から 1 つを選択します。
方法 1:証明書の自動検出
ALB Ingress コントローラーは、Ingress の tls フィールドのドメインを、証明書管理サービス内の証明書と照合します。この方法を使用するには、secretName を空白のままにします。
ACK コンソール
-
証明書を「証明書管理サービスコンソール」にアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
-
ACK コンソールにログインし、クラスターに移動します。左側メニューで、[ネットワーク] > [Ingresses] を選択します。
-
https-ingressを見つけ、[操作] 列の [更新] をクリックします。 -
[Ingress の変更] パネルで、以下のパラメーターを設定します。
パラメーター 説明 例 [TLS 設定] > [ドメイン名] 証明書にバインドされているドメイン名。 rules.hostと一致している必要があります。demo.alb.ingress.top[TLS 設定] > [Secret] 証明書の自動検出を使用するには、空白のままにします。 (空白) [アノテーション] (オプション) HTTP と HTTPS の両方でリッスンする必要がある場合は、 alb.ingress.kubernetes.io/listen-portsを追加します。名前: alb.ingress.kubernetes.io/listen-ports、値:[{"HTTP": 80},{"HTTPS": 443}]
kubectl
-
証明書を証明書管理サービスコンソールにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
-
Ingress を編集します。
kubectl edit ingress https-ingress -
tlsフィールドを追加します。hostsを証明書にバインドされたドメイン名に設定します。この値はrules[].hostと一致している必要があります。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: # annotations: # alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # HTTP と HTTPS の両方でリッスンする場合は、コメントを解除します。 name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # ご自身のドメイン名に置き換えてください。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix tls: - hosts: - demo.alb.ingress.top # rules[].host と一致する必要があります。コントローラーはこのドメインを使用して証明書を検索します。
方法 2:Secret で管理される証明書
kubernetes.io/tls タイプの Kubernetes Secret に証明書を格納し、Ingress の tls フィールドで参照します。cert-manager などのクラスター内ツールで証明書を管理する場合は、この方法を使用します。
ACK コンソール
-
ACK コンソールにログインし、クラスターに移動します。左側メニューで、[ネットワーク] > [Ingresses] を選択します。
-
https-ingressを見つけ、[操作] 列の [更新] をクリックします。 -
[Ingress の変更] パネルで、以下のパラメーターを設定します。
パラメーター 説明 例 [TLS 設定] > [ドメイン名] 証明書にバインドされているドメイン名。 demo.alb.ingress.top[TLS 設定] > [Secret] 証明書を格納する Secret。作成するには、フィールドの横にある [作成] をクリックします。[Secret の作成] ダイアログボックスで、[名前]、[証明書] (Base64 エンコード不要)、[キー] (Base64 エンコード不要) を設定し、[OK] をクリックします。 Secret 名: https-secret[アノテーション] (オプション) HTTP と HTTPS の両方でリッスンするには、 alb.ingress.kubernetes.io/listen-portsを追加します。名前: alb.ingress.kubernetes.io/listen-ports、値:[{"HTTP": 80},{"HTTPS": 443}]
kubectl
-
Secret を作成します。
https-secret.yamlという名前のファイルを作成します。プレースホルダーを、Base64 でエンコードされた証明書とキーのコンテンツに置き換えます。エンコード方法については、「手順 2」をご参照ください。apiVersion: v1 kind: Secret metadata: name: https-secret type: kubernetes.io/tls data: tls.key: | # albtop-key.pem の Base64 でエンコードされたコンテンツ。 {base64 albtop-key.pem} tls.crt: | # albtop-cert.pem の Base64 でエンコードされたコンテンツ。 {base64 albtop-cert.pem}Secret を適用します。
kubectl apply -f https-secret.yaml -
Ingress を編集します。
kubectl edit ingress https-ingresstlsフィールドにhostsとsecretNameの両方を追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: # annotations: # alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # HTTP と HTTPS の両方でリッスンする場合は、コメントを解除します。 name: https-ingress namespace: default spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # ご自身のドメイン名に置き換えてください。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix tls: - hosts: - demo.alb.ingress.top # rules[].host と一致する必要があります。コントローラーはこのドメインを使用して証明書を検索します。 secretName: https-secret # 証明書を格納する Secret。
方法 3:AlbConfig で指定された証明書
AlbConfig のリスナーで CertificateId を使用して証明書を指定します。これにより、証明書がリスナーレベルでバインドされ、そのリスナーの証明書の自動検出が無効になります。
ACK コンソール
-
証明書 ID を取得します。まだアップロードしていない場合は、証明書を証明書管理サービスにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。証明書 ID を見つけるには、以下の手順を実行します。
-
証明書管理サービスコンソールにログインします。
-
左側メニューで、[証明書管理] > [SSL 証明書管理] を選択します。
-
[アップロード済み証明書の管理] タブで、証明書を見つけ、[操作] 列の [詳細] をクリックします。
-
[証明書の詳細] パネルで、[CertIdentifier] の値をコピーします。
-
-
証明書を AlbConfig に追加します。
-
ACK コンソールにログインし、クラスターに移動します。[ワークロード] > [カスタムリソース] を選択します。
-
AlbConfigを検索し、albという名前のリソースを見つけ、[操作] 列の [YAML の編集] をクリックします。 -
[YAML で表示] パネルで、HTTPS リスナーに以下のフィールドを追加します。
フィールド
説明
例
certificates証明書設定ブロック
—
CertificateId証明書管理サービスの
CertIdentifierの値756****-cn-hangzhouIsDefaultリスナーのデフォルト証明書として設定するかどうかを指定します。
true
-
-
HTTPS リスナーにトラフィックをルーティングするように Ingress を更新します。
-
左側メニューで、[ネットワーク] > [Ingresses] を選択します。
-
https-ingressを見つけ、[操作] 列の [更新] をクリックします。 -
alb.ingress.kubernetes.io/listen-portsアノテーションを追加します。パラメーター
値
[名前]
alb.ingress.kubernetes.io/listen-ports値
[{"HTTPS": 443}]— HTTP でもリッスンする場合は[{"HTTP": 80},{"HTTPS": 443}]に変更します
-
kubectl
AlbConfig で証明書を指定すると、そのリスナーの証明書の自動検出が無効になります。
-
証明書を証明書管理サービスにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
-
証明書 ID を取得します。
-
証明書管理サービスコンソールにログインします。
-
左側メニューで、[証明書管理] > [SSL 証明書管理] を選択します。
-
[アップロード済み証明書の管理] タブで、証明書を見つけ、[操作] 列の [詳細] をクリックします。
-
[証明書の詳細] パネルで、[CertIdentifier] の値をコピーします。
-
-
AlbConfig を編集します。
kubectl edit albconfig <ALBCONFIG_NAME>HTTPS リスナーに
certificatesフィールドを追加します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: addressType: Intranet name: xiaosha-alb-test listeners: - port: 80 protocol: HTTP - certificates: - CertificateId: 756****-cn-hangzhou # 証明書管理サービスからの CertIdentifier。 IsDefault: true # デフォルトの証明書として使用するには true に設定します。 port: 443 protocol: HTTPS -
Ingress を編集します。
kubectl edit ingress https-ingressalb.ingress.kubernetes.io/listen-portsアノテーションを追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' # HTTP でもリッスンする場合は '[{"HTTP": 80},{"HTTPS": 443}]' に変更します。 name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # ご自身のドメイン名に置き換えてください。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix
手順 5:結果の確認
-
Ingress をクエリして ALB アドレスを取得します。
kubectl get ingress期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE https-ingress https-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80, 443 83mHOSTS列とADDRESS列の値に注意してください。 -
バックエンド Service に 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 のサポート」をご参照ください。
-
相互 TLS 認証を有効にするには、「HTTPS 相互認証を使用したサービスセキュリティの強化」をご参照ください。