すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:暗号化通信用のHTTPS証明書の設定

最終更新日:Nov 11, 2024

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を使用して設定されます。

  • 両方の証明書が同じドメイン名に関連付けられている場合、シークレットを使用して構成された証明書を使用することが好ましい。

  • 証明書が異なるドメイン名に関連付けられている場合、ALB Ingressコントローラは各ドメイン名にそれぞれの証明書を使用します。

証明書は自動証明書検出を使用して構成され、証明書はAlbConfigで指定されます。両方の証明書は同じリスナーに関連付けられています。

リスナーは、AlbConfigで指定された証明書のみを使用します。

証明書はKubernetes Secretを使用して設定され、証明書はAlbConfigで指定されます。

両方の証明書が使用されます。

前提条件

(オプション) ステップ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つのリソースを作成します。

  1. 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
  2. (オプション) AlbConfigでHTTPリスナーとHTTPSリスナーの両方が設定されている場合は、Ingressにannotationsフィールドを追加して、Ingressが複数のリスナーに関連付けられるようにします。 次のコードは、設定を示しています。

    複数のリスナーを使用する場合の注釈の追加

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # Add annotations when you use multiple listeners for ALB Ingress to work properly 
    spec:
      #...
  3. 次のコマンドを実行してリソースを作成します。

    kubectl apply -f https-quickstart.yaml

手順3: 証明書の設定

自動証明書検出の使用

証明書をcertificate Management Serviceコンソールにアップロードした後、Ingressのtlsフィールドに証明書に関連付けられたドメイン名を入力して、ALB Ingressがアップロードされた証明書を自動的に検出して使用できるようにします。

  1. 証明書管理サービスコンソールに自己署名証明書をアップロードします。 詳細については、「SSL証明書のアップロードと共有」をご参照ください。

  2. Ingress設定を変更します。

    1. 次のコマンドを実行して、Ingressを編集します。

      kubectl edit ingress https-ingress
    2. 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で使用できます。

  1. 次のコマンドを実行して、Base64を使用して証明書と秘密鍵をエンコードします。

    echo -n 'cat albtop-key.pem '| base64# albtop-key.pemを秘密鍵ファイル

    に置き換える

    echo -n 'cat albtop-cert.pem' | base64# albtop-cert.pemを証明書ファイルに置き換える
  2. シークレットを作成します。

    1. 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。
    2. 次のコマンドを実行して、シークレットを作成します。

      kubectl apply -f https-secret.yaml
  3. Ingressの設定を変更します。

    1. 次のコマンドを実行して、Ingressを編集します。

      kubectl edit ingress https-ingress
    2. 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を入力して、アップロードされた証明書をリスナーに関連付けます。

説明

リスナーに証明書が設定されている場合、自動証明書検出機能は使用されなくなります。

  1. 証明書管理サービスコンソールに自己署名証明書をアップロードします。 詳細については、「SSL証明書のアップロードと共有」をご参照ください。

  2. 証明書IDを取得します。

    1. にログインします。Certificate Management Serviceコンソール.

    2. 左側のナビゲーションウィンドウで、証明書の管理 > SSL証明書管理.

    3. SSL証明書管理ページで、アップロード証明書の管理タブをクリックします。 表示する証明書を見つけて、[操作] 列の 图标 > [詳細] を選択します。

      [証明書の詳細] パネルで、CertIdentifierを表示できます。

  3. 証明書をAlbConfigで指定します。

    1. 次のコマンドを実行して、AlbConfigを変更します。

      kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME> をAlbConfigの名前に置き換えます。
    2. リスナーに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経由でサービスにアクセスして、証明書が設定されているかどうかを確認できます。

  1. 次のコマンドを実行して、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の下の値をコピーして、後で使用します。

  2. 次のコマンドを実行して、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

関連ドキュメント