HTTPS リスナーを作成する場合は、クライアントとリスナー間の暗号化接続を確保するために、SSL または Transport Layer Security (TLS) 証明書を構成する必要があります。 このトピックでは、Application Load Balancer (ALB) Ingress でサポートされている証明書の構成方法について説明します。
証明書の構成方法の比較
ALB Ingress を使用すると、証明書の自動検出の構成、Kubernetes Secrets としての証明書の管理、AlbConfigs での証明書の指定を行うことができます。 次の表は、前述の方法を比較したものです。
項目 | 証明書の自動検出を構成する | AlbConfigs で証明書を指定する | Kubernetes Secrets として証明書を管理する |
証明書の保存 | 証明書は Certificate Management Service に保存されます。 | 証明書は Kubernetes Secrets として保存されます。 | |
証明書の検出 | 証明書は、証明書にバインドされているドメイン名に基づいて検出されます。 | 証明書は、その ID に基づいて検出されます。 | 証明書は、証明書が保存されているシークレットに基づいて検出されます。 |
シナリオ | この方法は、Certificate Management Service コンソールで購入した証明書、または Certificate Management Service コンソールにアップロードされた証明書に適しています。 | この方法は、クラスタ内で管理される証明書に適しています。 たとえば、cert-manager を使用して証明書を管理する場合、証明書を Secrets に保存できます。 | |
名前空間をまたがる証明書の利用 | サポートされています | サポートされていません。 Secret として保存された証明書は、その Secret の名前空間内でのみ使用できます。 | |
証明書の更新方法 | Certificate Management Service コンソール に新しい証明書をアップロードするか、元の証明書を更新する必要があります。 その後、証明書が関連付けられている Ingress の構成を手動で変更する必要があります。 | 証明書が保存されている Secret の構成を更新する必要があります。 |
ALB インスタンスは最大 25 個の証明書をサポートします。 ほとんどの場合、ALB インスタンスで使用される証明書の数は、Ingress に関連付けられた証明書を含む、インスタンスのすべてのリスナーに関連付けられた証明書の総数と等しくなります。 詳細については、「ALB クォータの計算方法」をご参照ください。
異なる方法で構成された証明書の互換性
次の表は、異なる方法で構成された証明書の互換性について説明しています。
証明書の構成方法 | 説明 |
ある証明書は証明書の自動検出を使用して構成され、別の証明書は Kubernetes Secret を使用して構成されています。 |
|
ある証明書は証明書の自動検出を使用して構成され、別の証明書は AlbConfig で指定されています。 両方の証明書は同じリスナーに関連付けられています。 | リスナーは、AlbConfig で指定された証明書のみを使用します。 |
ある証明書は Kubernetes Secret を使用して構成され、別の証明書は AlbConfig で指定されています。 両方の証明書は同じリスナーに関連付けられています。 | 両方の証明書が使用されます。 |
前提条件
信頼できる証明書を取得します。 以下のいずれかの方法で証明書を取得できます。
Certificate Management Service コンソールで証明書を購入します。 詳細については、「公式証明書を購入する」をご参照ください。
別の認証局 (CA) によって発行された証明書を購入します。
(オプション) 自己署名証明書を作成します。 詳細については、「自己署名証明書を作成する」をご参照ください。
手順
デフォルトでは、AlbConfig はポート 80 の HTTP リスナーで構成されています。HTTPS リスナーを作成し、証明書を構成する必要があります。証明書が構成されていない場合、HTTPS リスナーは使用できなくなり、証明書がないためコントローラーは失敗します。
ステップ 1: AlbConfig で HTTPS リスナーを作成する
ACK コンソールを使用する
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[リソースオブジェクト] タブで、検索ボックスに AlbConfig と入力し、表示された [AlbConfig] をクリックします。
[AlbConfig] パネルで、デフォルトで名前が alb のリソースを見つけ、[アクション] 列の [YAML を編集] をクリックします。
[YAML で表示] パネルで、
spec.listeners.port
フィールドとspec.listeners.protocol
フィールドを追加します。次に、[OK] をクリックします。
kubectl を使用する
次のコマンドを実行して、
albconfig
構成ファイルを編集します。kubectl edit albconfig <Albconfig_Name>
ビジネス要件に基づいて構成を変更します。Albconfig で
port
パラメーターとprotocol
パラメーターを構成して、対応するリスナーを作成できます。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 # 新しいフィールド protocol: HTTP # 新しいフィールド。有効な値: HTTP、 HTTPS、および QUIC。
(オプション) ステップ 2:自己署名証明書を作成する
以下の OpenSSL コマンドを実行して、自己署名証明書を作成します。
デフォルトでは、自己署名証明書はブラウザまたはクライアントによって信頼されていません。自己署名証明書を使用する場合、セキュリティ警告が表示されることがあります。この例で生成された自己署名証明書は参照用です。本番環境では証明書を使用しないでください。
上記のコマンドラインでは、
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 でエンコードするには、次のコマンドを実行します。
echo -n `cat albtop-key.pem` | base64 # 秘密鍵ファイルを Base64 でエンコードします。
echo -n `cat albtop-cert.pem` | base64 # 証明書ファイルを Base64 でエンコードします。
ステップ 3:サンプルリソースを作成する
AlbConfig に加えて、ALB Ingress が正しく機能するには、Deployment、Service、IngressClass、および Ingress の 4 つの Kubernetes リソースが必要です。次の手順を使用して、これらのリソースをすばやく作成します。
ACK コンソールを使用する
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[YAML から作成] をクリックします。
[サンプルテンプレート]:[カスタム] を選択します。
[テンプレート]:次のコードをコードエディターにコピーします。この構成は、Deployment、Service、IngressClass、および Ingress リソースを定義します。
[作成] をクリックします。リソースの作成プロセスが開始されたことを示す確認メッセージが表示されます。
次の手順を実行して、Deployment と Service が作成されたことを確認します。
左側のナビゲーションウィンドウで、[ワークロード] > [デプロイメント] を選択します。
https-deploy
という名前の Deployment がデプロイされます。左側のナビゲーションウィンドウで、[ネットワーク] > [サービス] を選択します。
https-svc
という名前の Service がデプロイされます。左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。
https-ingress
という名前の 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
次のコマンドを実行して、上記のリソースを作成します。
kubectl apply -f https-quickstart.yaml
ステップ 4: 証明書を構成する
証明書の自動検出を構成する
ACK コンソールを使用する
自己署名証明書を Certificate Management Service にアップロードした後、Ingress 構成の tls フィールドに証明書にバインドされているドメイン名を指定できます。このようにして、ALB Ingress はアップロードされた証明書を自動的に検出して使用できます。
自己署名証明書を Certificate Management Service コンソールにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[Ingress] ページで、更新する Ingress を見つけ、[アクション] 列の [更新] をクリックします。[Ingress の変更] パネルで、パラメーターを構成します。次の表にパラメーターを示します。
パラメーター
説明
例
TLS 設定
TLS 認証を有効にするかどうかを指定します。Ingress の TLS 認証を有効にできます。
ドメイン名:カスタムドメイン名を入力します。
シークレット:使用するシークレットを選択します。
説明このパラメーターを空のままにすると、証明書の自動検出が使用されます。
シークレットを作成するには、次の手順を実行します。
[シークレット] フィールドの右側にある [作成] をクリックします。
[シークレットの作成] ダイアログボックスで、[名前]、[証明書]、および [キー] パラメーターを構成します。次に、[OK] をクリックします。
[シークレット] ドロップダウンリストから、作成したシークレットを選択します。
[+ 追加] をクリックして、さらに TLS 証明書を追加できます。
ドメイン名:demo.alb.ingress.top
シークレット:このパラメーターは空のままにします。
(オプション) アノテーション
以下のことができます。
カスタムアノテーション名と値を定義する
構成のために、名前で既存のアノテーションを選択またはフィルタリングする
Ingress アノテーションの詳細については、「Ingress でサポートされているアノテーション」をご参照ください。
[+ アノテーションを追加] をクリックして、アノテーションを追加します。ACK では、追加できる Ingress アノテーションの数に制限はありません。
構成は不要です。
説明HTTP リクエストと HTTPS リクエストの両方をリッスンする場合は、次のアノテーションを追加します。
名前:
alb.ingress.kubernetes.io/listen-ports
値:
[{"HTTP": 80},{"HTTPS": 443}]
kubectl を使用する
自己署名証明書を Certificate Management Service にアップロードした後、Ingress 構成の tls
フィールドに証明書にバインドされているドメイン名を指定できます。このようにして、ALB Ingress はアップロードされた証明書を自動的に検出して使用できます。
自己署名証明書を Certificate Management Service コンソールにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
次のコマンドを実行して、Ingress を変更します。
kubectl edit ingress https-ingress
tls
フィールドを追加し、証明書にバインドされているドメイン名を指定します。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 # 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」フィールドで指定されたドメイン名と同じである必要があります。
証明書の自動検出が構成されると、関連付けられた ALB インスタンスは自動的に HTTPS:443
リスナーを作成します。
証明書をシークレットとして管理する
ACK コンソールを使用する
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[Ingress] ページで、更新する Ingress を見つけ、[アクション] 列の [更新] をクリックします。[Ingress の変更] パネルで、パラメーターを構成します。次の表にパラメーターを示します。
パラメーター
説明
例
TLS 設定
TLS 認証を有効にするかどうかを指定します。 Ingress の TLS 認証を有効にできます。
ドメイン名:カスタムドメイン名を入力します。
シークレット:使用するシークレットを選択します。
説明このパラメーターを空のままにすると、証明書の自動検出が使用されます。
シークレットを作成するには、次の手順を実行します。
[シークレット] フィールドの右側にある [作成] をクリックします。
[シークレットの作成] ダイアログボックスで、[名前]、[証明書]、および [キー] パラメーターを構成します。次に、[OK] をクリックします。
[シークレット] ドロップダウンリストから、作成したシークレットを選択します。
[+ 追加] をクリックして、さらに TLS 証明書を追加できます。
ドメイン名:demo.alb.ingress.top
シークレット:https-secret
シークレット名:https-secret
証明書:Base64 でエンコードされていない自己署名証明書。
キー:Base64 でエンコードされていない自己署名秘密鍵。
(オプション) アノテーション
以下のことができます。
カスタムアノテーション名と値を定義する
構成のために、名前で既存のアノテーションを選択またはフィルタリングする
Ingress アノテーションの詳細については、「Ingress でサポートされているアノテーション」をご参照ください。
[+ アノテーションを追加] をクリックして、アノテーションを追加します。ACK では、追加できる Ingress アノテーションの数に制限はありません。
構成は不要です。
説明HTTP リクエストと HTTPS リクエストの両方をリッスンする場合は、次のアノテーションを追加します。
名前:
alb.ingress.kubernetes.io/listen-ports
値:
[{"HTTP": 80},{"HTTPS": 443}]
kubectl を使用する
自己署名証明書をシークレットに保存し、Ingress 構成でシークレットを指定できます。
シークレットを作成する
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}
次のコマンドを実行して、シークレットを作成します。
kubectl apply -f https-secret.yaml
Ingress を変更します。
次のコマンドを実行して、Ingress を変更します。
kubectl edit ingress https-ingress
tls
フィールドを追加し、証明書にバインドされているドメイン名と、証明書が保存されているシークレットを指定します。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: alb rules: - host: demo.alb.ingress.top # 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 # 新しいフィールド。証明書キーを作成します。
シークレットを構成した後、default-https-secret-******
という名前の証明書が Certificate Management Service コンソールの SSL 証明書管理ページに自動的にアップロードされます。関連付けられた ALB インスタンスは自動的に HTTPS:443
リスナーを作成します。
AlbConfig で証明書を指定する
ACK コンソールを使用する
自己署名証明書の CertIdentifier を取得します。
自己署名証明書を Certificate Management Service にアップロードした後、AlbConfig のリスナー構成の
CertificateId
フィールドに証明書 ID を指定できます。このようにして、証明書はリスナーに関連付けられます。説明リスナーが証明書に関連付けられている場合、Ingress は証明書の自動検出機能を使用しなくなります。
自己署名証明書を Certificate Management Service コンソールにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
証明書 ID を取得します。
Certificate Management Service コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[SSL 証明書管理] ページで、[アップロードされた証明書の管理] タブをクリックします。アップロードした証明書を選択し、[アクション] 列の [詳細] をクリックします。
[証明書の詳細] パネルで、[CertIdentifier] フィールドに証明書 ID が表示されます。
AlbConfig で証明書を指定します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[リソースオブジェクト] タブで、検索ボックスに AlbConfig と入力し、表示された [AlbConfig] をクリックします。
[AlbConfig] パネルで、デフォルトで名前が alb であるリソースを見つけ、[アクション] 列の [YAML の編集] をクリックします。
[YAML で表示] パネルで、次のフィールドを追加します。表示されるダイアログボックスで、インスタンス名を変更し、[確認] をクリックします。
フィールド
説明
例
certificates
証明書情報。
-
CertificateId
証明書の CertIdentifier です。これは、ステップ 1 で取得できます。
756****-cn-hangzhou
IsDefault
証明書をデフォルトの証明書として設定するかどうかを指定します。
true
Ingress を変更します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のウィンドウで、 を選択します。
[Ingress] ページで、更新する Ingress を見つけ、[更新] 列の [アクション] をクリックします。[Ingress の変更] パネルで、パラメーターを構成します。次の表にパラメーターを示します。
パラメーター
説明
例
アノテーション
以下のことができます。
カスタムアノテーション名と値を定義する
構成のために、名前で既存のアノテーションを選択またはフィルタリングする
Ingress アノテーションの詳細については、「Ingress でサポートされているアノテーション」をご参照ください。
[+ アノテーションを追加] をクリックして、アノテーションを追加します。ACK では、追加できる Ingress アノテーションの数に制限はありません。
名前:
alb.ingress.kubernetes.io/listen-ports
値:
[{"HTTPS": 443}]
説明HTTP リクエストと HTTPS リクエストの両方を listen する必要がある場合は、この値を
[{"HTTP": 80},{"HTTPS": 443}]
に置き換えます。
kubectl を使用する
自己署名証明書を Certificate Management Service にアップロードした後、AlbConfig のリスナー構成の CertificateId
フィールドで証明書 ID を指定できます。このようにして、証明書はリスナーに関連付けられます。
リスナーが証明書に関連付けられている場合、Ingress は自動証明書検出機能を使用しなくなります。
自己署名証明書を Certificate Management Service コンソールにアップロードします。詳細については、「SSL 証明書のアップロードと共有」をご参照ください。
証明書 ID を取得します。
Certificate Management Service コンソール にログインします。
左側のナビゲーションウィンドウで、 を選択します。
[SSL 証明書管理] ページで、[アップロード済み証明書の管理] タブをクリックします。アップロードした証明書を選択し、[アクション] 列の [詳細] をクリックします。
[証明書の詳細] パネルで、[CertIdentifier] フィールドに証明書 ID が表示されます。
AlbConfig で証明書を指定します。
次のコマンドを実行して、AlbConfig を変更します。
kubectl edit albconfig <ALBCONFIG_NAME> # AlbConfig の名前に置き換えます。
AlbConfig のリスナー構成に
certificates
フィールドを追加し、前の手順で取得した [証明書 ID] を指定します。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 # 証明書の ID IsDefault: true # 証明書がデフォルトかどうかを指定します port: 443 protocol: HTTPS
次のコマンドを実行して、Ingress を変更します。
kubectl edit ingress https-ingress
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]'
アノテーションを追加します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' # 新しいフィールド。 HTTP リクエストと HTTPS リクエストの両方をリッスンする場合は、値を '[{"HTTP": 80},{"HTTPS": 443}]' に変更します。 name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # demo.alb.ingress.top を使用するドメイン名に置き換えます。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix
AlbConfig が構成されると、関連付けられた ALB インスタンスは HTTPS:443
リスナーを自動的に作成します。
ステップ 5: 結果の確認
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 のバックエンド サービスにアクセスします。
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 相互認証を使用してサービス セキュリティを強化する」をご参照ください。