NetScaler Ingress Controllerとcert-managerを使用して、Kubernetes上にHTTPSウェブアプリケーションをLet`s Encryptでデプロイする

最終公開日 : Oct 02, 2026
Let's Encrypt とACME (Automatic Certificate Management Environment) プロトコルを使用すると、HTTPSサーバーをセットアップし、ブラウザが信頼する証明書を自動的に取得できます。Let's Encryptからウェブサイトのドメインの証明書を取得するには、特定のチャレンジを達成してドメインの制御を証明する必要があります。チャレンジとは、ドメインを制御する者だけが達成できる、指定されたタスクのリストの1つです。
現在、チャレンジには2つのタイプがあります。
  • HTTP-01チャレンジ:HTTP-01チャレンジは、ウェブサイト上の指定された場所に指定されたファイルを投稿することで完了します。Let's Encrypt CAは、HTTP URIに対してHTTPリクエストを行うことでファイルを検証し、チャレンジを達成します。
  • DNS-01チャレンジ:DNS-01チャレンジは、DNS TXTレコードに存在する計算されたキーを提供することで完了します。このTXTレコードがインターネット全体に伝播されると、ACMEサーバーはDNSルックアップを介してこのキーを正常に取得できます。ACMEサーバーは、クライアントが要求された証明書のドメインを所有していることを検証できます。適切な権限があれば、cert-managerは指定されたDNSプロバイダーに対してこのTXTレコードを自動的に提示します。
チャレンジの検証が成功すると、そのドメインの証明書が付与されます。
このトピックでは、以下を使用してKubernetesクラスターにHTTPSウェブアプリケーションを安全にデプロイする方法に関する情報を提供します。
  • ネットスケーラー イングレス コントローラー
  • JetStackのcert-managerを使用して、Let's Encrypt projectからTLS証明書をプロビジョニングします。

前提条件

以下を確認してください。
  • 証明書が要求されるドメインが公開アクセス可能であること。
  • KubernetesクラスターでRBACが有効になっていること。
  • Tier 1またはTier 2デプロイメントモデルでNetScaler MPX、VPX、またはCPXがデプロイされていること。
    Tier 1デプロイメントモデルでは、NetScaler MPXまたはVPXがアプリケーションデリバリーコントローラー (ADC) として使用されます。Kubernetesクラスターで実行されているNetScaler Ingress Controllerは、Kubernetesクラスターで実行されているサービス用の仮想サービスを構成します。NetScalerは、公開ルーティング可能なIPアドレスで仮想サービスを実行し、Let's Encryptによって生成された証明書を使用してクライアントトラフィックのSSLをオフロードします。
    Tier 2デプロイモデルでは、Kubernetesクラスターの外部で実行されているNetScaler(VPX/MPX)上にTCPサービスが構成されます。このサービスは、Kubernetesクラスター内で実行されているNetScaler CPXインスタンスにトラフィックを転送するために作成されます。NetScaler CPXはSSLセッションを終了し、実際のサービスポッドにトラフィックをロードバランスします。
  • NetScaler Ingress Controllerをデプロイしました。さまざまなデプロイシナリオについては、こちらをクリックしてください。
  • Let's Encrypt CAがHTTP01チャレンジのドメインを検証するために、ファイアウォールで仮想IPアドレスのポート80を開放しました。
  • ACME DNS01チャレンジのためにWebアプリケーションをホストする、お客様が管理するDNSドメイン。
  • すべてのデプロイ手順に対する管理者権限。権限が原因で障害が発生した場合は、管理者権限があることを確認してください。

cert-managerをインストールする

cert-managerをインストールするには、cert-managerのインストールに関するドキュメントを参照してください。
cert-managerは、マニフェストファイルまたはHelmチャートのいずれかを使用してインストールできます。
cert-managerをインストールしたら、インストールの検証で説明されているように、cert-managerが稼働していることを確認します。

サンプルWebアプリケーションをデプロイする

サンプルWebアプリケーションをデプロイするには、次の手順を実行します。
注記:
このトピックでは、KubernetesデモアプリケーションであるKuardを参考にしています。
  1. 次の構成でKuardのデプロイYAMLファイル(kuard-deployment.yaml)を作成します。

            apiVersion: apps/v1
            kind: Deployment
            metadata:
              labels:
                app: kuard
              name: kuard
            spec:
              replicas: 1
              selector:
                matchLabels:
                  app: kuard
              template:
                metadata:
                  labels:
                    app: kuard
                spec:
                  containers:
                  - image: gcr.io/kuar-demo/kuard-amd64:1
                    imagePullPolicy: Always
                    name: kuard
                    ports:
                    - containerPort: 8080
                      protocol: TCP
  2. 次のコマンドを使用して、Kuardデプロイファイル(kuard-deployment.yaml)をクラスターにデプロイします。
    % kubectl create -f kuard-deployment.yaml
    deployment.extensions/kuard created
    % kubectl get pod -l app=kuard
    NAME                     READY   STATUS    RESTARTS   AGE

    kuard-6fc4d89bfb-djljt   1/1     Running   0          24s
  3. デプロイメントのサービスを作成します。次の構成でservice.yamlというファイルを作成します。
    apiVersion: v1
    kind: Service
    metadata:
      name: kuard
    spec:
      ports:
      - port: 80
        targetPort: 8080
        protocol: TCP
      selector:
        app: kuard
  4. 次のコマンドを使用してサービスをデプロイし、検証します。
    % kubectl create -f service.yaml

    service/kuard created
    % kubectl get svc kuard
    NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    kuard   ClusterIP   10.103.49.171   <none>        80/TCP    13s
  5. NetScaler CPXまたはVPXにコンテンツスイッチング仮想サーバーとしてデプロイされるIngressを作成して、このサービスを外部に公開します。
    注記:
    NetScaler Ingress Controllerが起動しているIngressクラスに、ingressClassName: citrixの値を変更してください。
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
      name: kuard
    spec:
      ingressClassName: citrix®
      rules:
      - host: kuard.example.com
        http:
          paths:
          - backend:
              service:
                name: kuard
                port:
                  number: 80
            path: /
            pathType: Prefix
注記:
spec.rules.hostの値を、お客様が管理するドメインに変更する必要があります。NetScaler CPXまたはVPXにトラフィックをルーティングするためのDNSエントリが存在することを確認してください。
  1. 次のコマンドを使用してIngressをデプロイします。
    % kubectl apply -f ingress.yml
    ingress.extensions/kuard created

    root@ubuntu-:~/cert-manager# kubectl get ingress
    NAME    HOSTS               ADDRESS   PORTS   AGE
    kuard   kuard.example.com             80      7s
  2. 次のコマンドを使用して、IngressがNetScaler CPXまたはVPXで構成されていることを確認します。
    $ kubectl exec -it cpx-ingress-5b85d7c69d-ngd72 /bin/bash

    root@cpx-ingress-55c88788fd-qd4rg:/# cli_script.sh 'show cs vserver'
    exec: show cs vserver
    1)  k8s-192.168.8.178_80_http (192.168.8.178:80) - HTTP Type: CONTENT
      State: UP
      Last state change was at Sat Jan  4 13:36:14 2020
      Time since last state change: 0 days, 00:18:01.950
      Client Idle Timeout: 180 sec
      Down state flush: ENABLED
      Disable Primary Vserver On Down : DISABLED
      Comment: uid=MPPL57E3AFY6NMNDGDKN2VT57HEZVOV53Z7DWKH44X2SGLIH4ZWQ====
      Appflow® logging: ENABLED
      Port Rewrite : DISABLED
      State Update: DISABLED
      Default:  Content Precedence: RULE
      Vserver IP and Port insertion: OFF
      L2Conn: OFF Case Sensitivity: ON
      Authentication: OFF
      401 Based Authentication: OFF
      Push: DISABLED  Push VServer:
      Push Label Rule: none
      Persistence: NONE
      Listen Policy: NONE
      IcmpResponse: PASSIVE
      RHIstate:  PASSIVE
      Traffic Domain: 0
    Done

    root@cpx-ingress-55c88788fd-qd4rg/# exit
    exit
  3. curlコマンドを使用して要求されたときに、ウェブページが正しく提供されていることを確認します。
    % curl -sS -D - kuard.example.com -o /dev/null
    HTTP/1.1 200 OK
    Content-Length: 1458
    Content-Type: text/html
    Date: Thu, 21 Feb 2019 09:09:05 GMT

HTTPチャレンジを使用したACME証明書の発行を構成する

このセクションでは、HTTP検証を使用してACME証明書を発行する方法について説明します。DNS検証を使用する場合は、このセクションをスキップして次のセクションに進んでください。
cert-managerを使用したHTTP検証は、ドメインのLet's Encryptから証明書を取得する簡単な方法です。この方法では、特定のファイルがドメインに存在することを確認することで、ドメインの所有権を証明します。指定されたパスの下に指定されたファイルを公開できる場合、そのドメインを制御していると見なされます。

HTTP01 チャレンジプロバイダーを使用して Let's Encrypt ClusterIssuer をデプロイする

cert-manager は、構成のために2つの異なるCRDをサポートしています。単一の名前空間にスコープされた Issuer と、クラスター全体にスコープされた ClusterIssuer です。
NetScaler Ingress Controller が任意の名前空間から Ingress を使用するには、ClusterIssuer を使用します。あるいは、Ingress リソースを作成する各名前空間に対して Issuer を作成することもできます。
詳細については、cert-manager の HTTP validation ドキュメントを参照してください。
  1. issuer-letsencrypt-staging.yaml という名前のファイルを作成し、次の構成を記述します。
    apiVersion: cert-manager.io/v1alpha2
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-staging
    spec:
      acme:
        # You must replace this email address with your own.
        # Let's Encrypt will use this to contact you about expiring
        # certificates, and issues related to your account.
        email: user@example.com
        server: https://acme-staging-v02.api.letsencrypt.org/directory
        privateKeySecretRef:
          # Secret resource used to store the account's private key.
          name: example-issuer-account-key
        # Add a single challenge solver, HTTP01 using citrix
        solvers:
        - http01:
            ingress:
              class: citrix
    spec.acme.solvers[].http01.ingress.class は NetScaler Ingress Controller の Ingress クラスを指します。NetScaler Ingress Controller に Ingress クラスがない場合、このフィールドを指定する必要はありません。 注: これは cert-manager.io/v1alpha2 リソースのサンプル Clusterissuer です。詳細については、cert-manager http01 ドキュメント を参照してください。
    ステージングの Let's Encrypt サーバーは偽の証明書を発行しますが、本番サーバーの API レート制限 には拘束されません。このアプローチにより、レート制限を気にすることなく環境をセットアップおよびテストできます。Let's Encrypt の本番サーバーに対しても同じ手順を繰り返すことができます。
  2. ファイルを編集して保存したら、次のコマンドを使用してファイルをデプロイします。
    % kubectl apply -f issuer-letsencrypt-staging.yaml
    clusterissuer "letsencrypt-staging" created
  3. 発行者が作成され、ACME サーバーに登録されていることを確認します。
    % kubectl get issuer
    NAME                  AGE
    letsencrypt-staging   8d
  4. コマンド kubectl describe issuer letsencrypt-staging を使用して、ClusterIssuer が適切に登録されていることを確認します。
    % kubectl describe issuer letsencrypt-staging

    Status:
      Acme:
        Uri:  https://acme-staging-v02.api.letsencrypt.org/acme/acct/8200869
      Conditions:
        Last Transition Time:  2019-02-11T12:06:31Z
        Message:               The ACME account was registered with the ACME server
        Reason:                ACMEAccountRegistered
        Status:                True
        Type:                  Ready

Ingress オブジェクトの証明書を発行する

ClusterIssuer が正常に登録されたら、Ingress ドメイン 'kuard.example.com' の証明書を取得できます。
次の方法を使用して、指定された Ingress リソースの証明書を要求できます。
  • Ingress オブジェクトに Ingress-shim アノテーションを追加する。
  • certificate CRD オブジェクトを作成する。
最初の方法は迅速かつ簡単ですが、証明書更新に関してより多くのカスタマイズと粒度が必要な場合は、2番目の方法を選択できます。ニーズに応じて方法を選択できます。

IngressオブジェクトにIngress-shimアノテーションを追加する

このアプローチでは、ACMEサーバーから証明書を要求するIngressオブジェクトに、以下の2つのアノテーションを追加します。
certmanager.io/cluster-issuer: "letsencrypt-staging"
注:
Ingress-shim用のcert-managerがサポートするすべてのアノテーションは、supported-annotationsで確認できます。
また、シークレットを指定して、ingress.yamlがTLSを使用するように変更します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    certmanager.io/cluster-issuer: letsencrypt-staging
  name: kuard
spec:
  ingressClassName: citrix
  rules:
  - host: kuard.example.com
    http:
      paths:
      - backend:
          service:
            name: kuard
            port:
              number: 80
        pathType: Prefix
        path: /
  tls:
  - hosts:
    - kuard.example.com
    secretName: kuard-example-tls
cert-manager.io/cluster-issuer: "letsencrypt-staging"アノテーションは、cert-managerにletsencrypt-stagingクラスター全体のイシューアーを使用して、Let's Encryptのステージングサーバーから証明書を要求するように指示します。Cert-managerは、kuard.example.comの証明書のライフサイクルを管理するために使用されるcertificateオブジェクトを作成します。証明書オブジェクトのドメイン名とチャレンジメソッドの値は、Ingressオブジェクトから派生します。Ingressがクラスターに存在する限り、Cert-managerはシークレットの内容を管理します。
次のコマンドを使用して、ingress.yamlファイルをデプロイします。
% kubectl apply -f ingress.yml

ingress.extensions/kuard configured
% kubectl get ingress kuard
NAME    HOSTS               ADDRESS   PORTS     AGE
kuard   kuard.example.com             80, 443   4h39m

証明書CRDリソースを作成する

あるいは、Ingressオブジェクトとは独立して証明書CRDオブジェクトをデプロイすることもできます。「certificate」CRDのドキュメントは、HTTP validationで確認できます。
  1. 次の構成でcertificate.yamlファイルを作成します。
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: example-com
  namespace: default
spec:
  secretName: kuard-example-tls
  issuerRef:
    name: letsencrypt-staging
  commonName: kuard.example.com
  dnsNames:
  - www.kuard.example.com
spec.secretNameキーは、証明書が正常に発行されたときに証明書が保存されるシークレットの名前です。
  1. Kubernetesクラスターにcertificate.yamlファイルをデプロイします。
    kubectl create -f certificate.yaml
    certificate.cert-manager.io/example-com created
  2. Ingressで指定された証明書を表す、cert-managerによって証明書のカスタムリソースが作成されていることを確認します。数分後、ACME検証が正常に完了すると、証明書の「READY」ステータスがtrueに設定されます。
    % kubectl get certificates.cert-manager.io kuard-example-tls
    NAME                READY   SECRET              AGE
    kuard-example-tls   True    kuard-example-tls   3m44s


    % kubectl get certificates.cert-manager.io kuard-example-tls
    Name:         kuard-example-tls
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  cert-manager.io/v1alpha2
    Kind:         Certificate
    Metadata:
      Creation Timestamp:  2020-01-04T17:36:26Z
      Generation:          1
      Owner References:
        API Version:           extensions/v1beta1
        Block Owner Deletion:  true
        Controller:            true
        Kind:                  Ingress
        Name:                  kuard
        UID:                   2cafa1b4-2ef7-11ea-8ba9-06bea3f4b04a
      Resource Version:        81263
      Self Link:               /apis/cert-manager.io/v1alpha2/namespaces/default/certificates/kuard-example-tls
      UID:                     bbfa5e51-2f18-11ea-8ba9-06bea3f4b04a
    Spec:
      Dns Names:
        acme.cloudpst.net
      Issuer Ref:
        Group:      cert-manager.io
        Kind:       ClusterIssuer
        Name:       letsencrypt-staging
      Secret Name:  kuard-example-tls
    Status:
      Conditions:
        Last Transition Time:  2020-01-04T17:36:28Z
        Message:               Certificate is up to date and has not expired
        Reason:                Ready
        Status:                True
        Type:                  Ready
      Not After:               2020-04-03T16:36:27Z
    Events:
      Type    Reason        Age   From          Message
      ----    ------        ----  ----          -------
      Normal  GeneratedKey  24m   cert-manager  Generated a new private key
      Normal  Requested     24m   cert-manager  Created new CertificateRequest resource "kuard-example-tls-3030465986"
      Normal  Issued        24m   cert-manager  Certificate issued successfully
  3. シークレットリソースが作成されていることを確認します。
    % kubectl get secret  kuard-example-tls
      NAME                TYPE                DATA   AGE
      kuard-example-tls   kubernetes.io/tls   3      3m13s

DNSチャレンジを使用してACME証明書を発行する

このセクションでは、DNS検証を使用してLet'sEncrypt CAからACME証明書を取得する方法について説明します。DNS-01チャレンジでは、ドメインのDNSレコードを制御していることを証明することで、ドメインの所有権を証明します。これは、ドメインのDNSレコードを制御していることを証明する特定のコンテンツを含むTXTレコードを作成することによって行われます。DNSチャレンジの詳細な説明と、DNSチャレンジをデプロイする際のベストセキュリティプラクティスについては、A Technical Deep Dive: Securing the Automation of ACME DNS Challenge Validationを参照してください。
注記:
この手順では、route53がDNSプロバイダーとして使用されます。他のプロバイダーについては、cert-managerのDNS検証のドキュメントを参照してください。

DNS01チャレンジプロバイダーを使用してLet's Encrypt ClusterIssuerをデプロイする

DNS01チャレンジプロバイダーを使用してLet's Encrypt ClusterIssuerをデプロイするには、以下を実行します。
  1. AWS IAMユーザーアカウントを作成し、シークレットアクセスキーIDとシークレットアクセスキーをダウンロードします。
  2. 以下のIAMポリシーをユーザーに付与します。
  3. kube-system名前空間にKubernetesシークレットacme-route53を作成します。
    % kubectl create secret generic acme-route53 --from-literal secret-access-key=<secret_access_key>
  4. DNS01チャレンジプロバイダーを使用してIssuerまたはClusterIssuerを作成します。
    DNS01の下に複数のプロバイダーを指定し、証明書作成時に使用するプロバイダーを指定できます。 cert-managerがTXTレコードを作成するには、DNSプロバイダーへのアクセス権が必要です。資格情報は、spec.dns01.secretAccessKeySecretRefで指定されたKubernetesシークレットに保存されます。資格情報の取得方法の詳細については、DNSプロバイダーのドキュメントを参照してください。
    apiVersion: cert-manager.io/v1alpha2
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-staging
      spec:
        acme:
        # You must replace this email address with your own.
        # Let's Encrypt will use this to contact you about expiring
        # certificates, and issues related to your account.
          email: user@example.com
          server: https://acme-staging-v02.api.letsencrypt.org/directory
          privateKeySecretRef:
            name: example-issuer-account-key
          solvers:
          - dns01:
              route53:
                region: us-west-2
                accessKeyID: <IAMKEY>
                secretAccessKeySecretRef:
                  name: acme-route53
                  key: secret-access-key
    注記:
    user@example.comをあなたのメールアドレスに置き換えてください。DNS01スタンザで言及されている各ドメインについて、cert-managerは参照されたIssuerからのプロバイダーの資格情報を使用して、_acme-challengeというTXTレコードを作成します。このレコードはACMEサーバーによって検証され、証明書が発行されます。DNSプロバイダーの設定とサポートされているプロバイダーのリストの詳細については、DNS01リファレンスドキュメントを参照してください。
  5. ファイルを編集して保存したら、次のコマンドを使用してファイルをデプロイします。
    % kubectl apply -f acme_clusterissuer_dns.yaml
    clusterissuer "letsencrypt-staging" created
  6. 以下のコマンドを使用して、発行者が作成され、ACMEサーバーに登録されているかを確認します。
    % kubectl get issuer
    NAME                  AGE
    letsencrypt-staging   8d
  7. コマンド kubectl describe issuer letsencrypt-staging を使用して、ClusterIssuer が適切に登録されているかを確認します。
    Status:
      Acme:
        Uri:  https://acme-staging-v02.api.letsencrypt.org/acme/acct/8200869
      Conditions:
        Last Transition Time:  2019-02-11T12:06:31Z
        Message:               The ACME account was registered with the ACME server
        Reason:                ACMEAccountRegistered
        Status:                True
        Type:                  Ready

Ingressリソースの証明書を発行する

発行者が正常に登録されると、Ingressドメイン kuard.example.com の証明書を取得できます。HTTP01チャレンジと同様に、指定されたIngressリソースの証明書を要求する方法は2つあります。
  • Ingressオブジェクトに Ingress-shim アノテーションを追加する。
  • certificate CRDオブジェクトを作成する。詳細な手順については、証明書CRDリソースを作成する を参照してください。

Ingressオブジェクトに Ingress-shim アノテーションを追加する

以下の spec.tls セクションとともに、Ingressオブジェクトにアノテーションを追加します。
certmanager.io/cluster-issuer: "letsencrypt-staging"apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-staging
  name: kuard
spec:
  ingressClassName: citrix
  rules:
  - host: kuard.example.com
    http:
      paths:
      - backend:
          service:
            name: kuard
            port:
              number: 80
        pathType: Prefix
        path: /
  tls:
  - hosts:
    - kuard.example.com
    secretName: kuard-example-tls
cert-managerは、DNS01チャレンジで Certificate CRDリソースを作成します。これは、ClusterIssuer で指定された資格情報を使用して、所有するドメインのDNSサーバーにTXTレコードを作成します。その後、Let's Encrypt CAはTXTレコードの内容を検証してチャレンジを完了します。

Certificate CRDリソースを追加する**

あるいは、証明書の自動生成をトリガーするために、証明書カスタムリソース定義リソースを明示的に作成することもできます。
  1. 以下の構成で certificate.yaml ファイルを作成します。
    apiVersion: cert-manager.io/v1alpha2
    kind: Certificate
    metadata:
      name: example-com
      namespace: default
    spec:
      secretName: kuard-example-tls
      issuerRef:
        name: letsencrypt-staging
      commonName: kuard.example.com
      dnsNames:
      - www.kuard.example.com
    ドメイン名の検証が成功すると、証明書のREADYステータスがTrueに設定されます。
  2. 証明書が発行されていることを確認します。
    % kubectl get certificate kuard-example-tls

       NAME           READY   SECRET              AGE
       -example-tls   True    kuard-example-tls   10m
    以下のコマンドを使用して、証明書の発行状況を監視できます。
    % kubectl describe certificates kuard-example-tls | tail -n 6
    Not After:               2020-04-04T13:34:23Z
    Events:
    Type    Reason     Age    From          Message
    ----    ------     ----   ----          -------
    Normal  Requested  11m    cert-manager  Created new CertificateRequest resource "kuard-example-tls-3030465986"
    Normal  Issued     7m21s  cert-manager  Certificate issued successfully

NetScaler で証明書を検証する

Letsencrypt CA はドメインを正常に検証し、ドメインの新しい証明書を発行しました。Ingress の tls: フィールドで指定された secretName を持つ kubernetes.io/tls シークレットが作成されます。また、cert-manager は有効期限の 30 日前に自動的に更新を開始します。
HTTP チャレンジの場合、cert-manager は一時的な Ingress リソースを作成し、Let's Encrypt CA が生成したトラフィックを cert-manager ポッドにルーティングします。ドメインの検証が成功すると、この一時的な Ingress は削除されます。
  1. 次のコマンドを使用してシークレットが作成されたことを確認します。
    % kubectl get secret kuard-example-tls

    NAME                TYPE                DATA   AGE
    kuard-example-tls   kubernetes.io/tls   3      30m
    NetScaler Ingress Controller はシークレットを取得し、証明書を NetScaler CPX のコンテンツスイッチング仮想サーバーにバインドします。中間 CA 証明書がある場合、それは自動的にサーバー証明書にリンクされ、SSL ネゴシエーション中にクライアントに提示されます。
  2. NetScaler CPX にログオンし、証明書が SSL 仮想サーバーにバインドされていることを確認します。
    % kubectl exec -it cpx-ingress-55c88788fd-n2x9r bash -c cpx-ingress
    Defaulting container name to cpx-ingress.
    Use 'kubectl describe pod/cpx-ingress-55c88788fd-n2x9r -n default' to see all of the containers in this pod.

    % cli_script.sh 'sh ssl vs k8s-192.168.8.178_443_ssl'
    exec: sh ssl vs k8s-192.168.8.178_443_ssl

      Advanced SSL configuration for VServer k8s-192.168.8.178_443_ssl:
      DH: DISABLED
      DH Private-Key Exponent Size Limit: DISABLED Ephemeral RSA: ENABLED  Refresh Count: 0
      Session Reuse: ENABLED  Timeout: 120 seconds
      Cipher Redirect: DISABLED
      ClearText Port: 0
      Client Auth: DISABLED
      SSL Redirect: DISABLED
      Non FIPS Ciphers: DISABLED
      SNI: ENABLED
      OCSP Stapling: DISABLED
      HSTS: DISABLED
      HSTS IncludeSubDomains: NO
      HSTS Max-Age: 0
      HSTS Preload: NO
      SSLv3: ENABLED  TLSv1.0: ENABLED  TLSv1.1: ENABLED  TLSv1.2: ENABLED  TLSv1.3: DISABLED
      Push Encryption Trigger: Always
      Send Close-Notify: YES
      Strict Sig-Digest Check: DISABLED
      Zero RTT Early Data: DISABLED
      DHE Key Exchange With PSK: NO
      Tickets Per Authentication Context: 1
    , P_256, P_384, P_224, P_5216) CertKey Name: k8s-GVWNYGVZKKRHKF7MZVTLOAEZYBS Server Certificate for SNI

    7) Cipher Name: DEFAULT
      Description: Default cipher list with encryption strength >= 128bit
    Done

    % cli_script.sh 'sh certkey'
    1) Name: k8s-GVWNYGVZKKRHKF7MZVTLOAEZYBS
      Cert Path: k8s-GVWNYGVZKKRHKF7MZVTLOAEZYBS.crt
      Key Path: k8s-GVWNYGVZKKRHKF7MZVTLOAEZYBS.key
      Format: PEM
      Status: Valid,   Days to expiration:89
      Certificate Expiry Monitor: ENABLED
      Expiry Notification period: 30 days
      Certificate Type: "Client Certificate" "Server Certificate"
      Version: 3
      Serial Number: 03B2B57EA9E61A93F1D05EA3272FA95203C2
      Signature Algorithm: sha256WithRSAEncryption
      Issuer:  C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
      Validity
        Not Before: Jan  5 13:34:23 2020 GMT
        Not After : Apr  4 13:34:23 2020 GMT
      Subject:  CN=acme.cloudpst.net
      Public Key Algorithm: rsaEncryption
      Public Key size: 2048
      Ocsp Response Status: NONE
    2) Name: k8s-GVWNYGVZKKRHKF7MZVTLOAEZYBS_ic1
      Cert Path: k8s-GVWNYGVZKKRHKF7MZVTLOAEZYBS.crt_ic1
      Format: PEM
      Status: Valid,   Days to expiration:437
      Certificate Expiry Monitor: ENABLED
      Expiry Notification period: 30 days
      Certificate Type: "Intermediate CA"
      Version: 3
      Serial Number: 0A0141420000015385736A0B85ECA708
      Signature Algorithm: sha256WithRSAEncryption
      Issuer:  O=Digital Signature Trust Co.,CN=DST Root CA X3
      Validity
        Not Before: Mar 17 16:40:46 2016 GMT
        Not After : Mar 17 16:40:46 2021 GMT
      Subject:  C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
      Public Key Algorithm: rsaEncryption
      Public Key size: 2048
      Ocsp Response Status: NONE
    Done
HTTPS ウェブサーバーは、偽の LE 署名付き証明書で稼働しています。次のステップは、実際の Let's Encrypt 証明書を使用して本番環境に移行することです。

本番環境に移行する

Let's Encrypt-staging でのテストが成功した後、実際の Let's Encrypt 証明書を取得できます。
Let's Encrypt エンドポイントを https:acme-staging-v02.api.letsencrypt.org/directory から https:acme-v02.api.letsencrypt.org/directory に変更する必要があります。
次に、ClusterIssuer の名前を letsencrypt-staging から letsencrypt-production に変更します。

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # You must replace this email address with your own.
    # Let's Encrypt will use this to contact you about expiring
    # certificates, and issues related to your account.
    email: user@example.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Secret resource used to store the account's private key.
      name: example-issuer-account-key
    # Add a single challenge solver, HTTP01 using citrix
    solvers:
    - http01:
        ingress:
          class: citrix
注記:
user@example.com をメールアドレスに置き換えてください。
次のコマンドを使用してファイルをデプロイします。
% kubectl apply -f letsencrypt-prod.yaml

 clusterissuer "letsencrypt-prod" created
次に、Ingress のアノテーションを変更するか、新しい証明書の生成をトリガーする CRD 証明書を作成する手順を繰り返します。
注
cert-manager が本番 CA で新しいチャレンジを開始できるように、古いシークレットを削除してください。
% kubectl delete secret kuard-example-tls

 secret "kuard-example-tls" deleted
HTTP ウェブサイトが稼働したら、Ingress オブジェクトの ingress.citrix.com/insecure-termination: redirect アノテーションを使用して、HTTP から HTTPS へのトラフィックをリダイレクトできます。

トラブルシューティング

証明書の生成には複数のコンポーネントが関与するため、このセクションでは、障害が発生した場合に使用できるトラブルシューティング手法をまとめます。

証明書生成のステータスを確認する

証明書 CRD オブジェクトは、証明書の生成と更新のライフサイクル管理を定義します。kubectl describe コマンドを使用して、証明書のステータスを次のように表示できます。
% kubectl get certificate

NAME                READY   SECRET              AGE
kuard-example-tls   False   kuard-example-tls   9s

%  kubectl describe certificate kuard-example-tls

Status:
  Conditions:
    Last Transition Time:  2019-03-05T09:50:29Z
    Message:               Certificate does not exist
    Reason:                NotFound
    Status:                False
    Type:                  Ready
Events:
  Type    Reason        Age   From          Message
  ----    ------        ----  ----          -------
  Normal  OrderCreated  22s   cert-manager  Created Order resource "kuard-example-tls-1754626579"
また、kubectl events コマンドを使用して、主要な証明書イベントを表示することもできます。
kubectl get events

LAST SEEN   TYPE     REASON              KIND          MESSAGE
36s         Normal   Started             Challenge     Challenge scheduled for processing
36s         Normal   Created             Order         Created Challenge resource "kuard-example-tls-1754626579-0" for domain "acme.cloudpst.net"
38s         Normal   OrderCreated        Certificate   Created Order resource "kuard-example-tls-1754626579"
38s         Normal   CreateCertificate   Ingress       Successfully created Certificate "kuard-example-tls"

cert-manager からのログを分析する

障害が発生した場合、最初のステップは cert-manager コンポーネントからのログを分析することです。次のコマンドを使用して cert-manager ポッドを特定します。
% kubectl get po -n cert-manager

NAME                                    READY   STATUS      RESTARTS   AGE
cert-manager-76d48d47bf-5w4vx           1/1     Running     0          23h
cert-manager-webhook-67cfb86d56-6qtxr   1/1     Running     0          23h
cert-manager-webhook-ca-sync-x4q6f      0/1     Completed   4          23h
ここで、cert-manager-76d48d47bf-5w4vx はメインの cert-manager ポッドであり、他の2つのポッドは cert-manager ウェブフックポッドです。
次のコマンドを使用して cert-manager のログを取得します。
% kubectl logs -f cert-manager-76d48d47bf-5w4vx -n cert-manager
証明書の取得に失敗した場合、ERROR ログに失敗の詳細が示されます。

Kubernetes シークレットを確認する

kubectl describe コマンドを使用して、証明書とキーの両方がKubernetesシークレットに格納されているかを確認します。
% kubectl describe secret kuard-example-tls

Name:         kuard-example-tls
Namespace:    default
Labels:       certmanager.k8s.io/certificate-name=kuard-example-tls
Annotations:  certmanager.k8s.io/alt-names: acme.cloudpst.net
              certmanager.k8s.io/common-name: acme.cloudpst.net
              certmanager.k8s.io/issuer-kind: ClusterIssuer
              certmanager.k8s.io/issuer-name: letsencrypt-staging

Type:  kubernetes.io/tls

Data
====
tls.crt:  3553 bytes
tls.key:  1679 bytes
ca.crt:   0 bytes
tls.crt と tls.key の両方がKubernetesシークレットに格納されている場合、証明書の生成は完了しています。tls.key のみが存在する場合、証明書の生成は不完全です。問題の詳細については、cert-managerのログを分析してください。

NetScaler Ingress Controllerからのログを分析する

Kubernetesシークレットが生成され、完全であるにもかかわらずNetScalerにアップロードされていない場合、次のコマンドを使用してNetScaler Ingress Controllerからのログを分析できます。
% kubectl logs -f cpx-ingress-685c8bc976-zgz8q