Incubator4

Incubator4

github
steam
nintendo switch

Cert-Manager 自動管理証明書

前言#

前回の記事では、Traefik を使用して自動的に HTTPS を暗号化することができると述べました。その原理は Let's Encrypt を使用することです。
しかし、Traefik は LE を有効にするために PVC(永続ボリュームクレーム)が必要であり、PVC に依存しているため、複数のレプリカのスケーリングはサポートされていません。
そのため、より優れた HTTPS のソリューションが必要です。それが今日の主役である Cert-Manager です。

原理の紹介#

Cert-Manager は、自己署名 / CA ルート証明書 / Vault / Venafi / 外部インポート / ACME のさまざまな方法で HTTPS をサポートしています。
自動化された HTTPS が必要なので、原理的には前回と同じく ACME を使用して Let's Encrypt を自動的に設定する必要があります。

CertManage の用語#

Issuer#

Issuer は証明書を発行するための単位であり、直訳すると「発行者」となります。通常の Issuer は名前空間で分離されたリソースです。したがって、クラスタ全体で使用する場合は ClusterIssuer が必要です。

Certificate#

Certificate は証明書の概念です。証明書は Issuer を参照して発行されます。
Certificate は、同じ名前空間の Secret(存在しない場合は自動的に作成されます)を参照して X509 証明書を保存します。したがって、証明書の保存について心配する必要はありません。証明書の公開鍵と秘密鍵の機密情報を保存するために、Kubernetes のネイティブな方法を使用しています。

CertificateRequest#

CertificateRequest は、証明書が Issuer にリソースを要求するプロセスを記録するためのものです。
通常、手動で作成する必要はありません。CertificateRequest のステータスを観察することで、証明書の申請結果を判断することができます。

Traefik のインストール#

Traefik のインストール方法については、Traefik Automatic Httpsを参照してください。

Cert-Manager のインストール#

helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.11.0 \
  --set installCRDs=true

ClusterIssuer の作成#

Issuer と ClusterIssuer は、一つは名前空間の次元で、もう一つはクラスタの次元であり、ここでは簡単のために Cluster Issuer を直接作成します。

ACME の方法を使用しますので、証明書を自動的に発行できます。

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: acme
spec:
  acme:
    email: <your-emaill-address>
    preferredChain: ""
    privateKeySecretRef:
      name: acme-cert-key
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - dns01:
          cloudflare:
            apiTokenSecretRef:
              key: api-token
              name: cf-nsl-xyz-api-token

Ingress/IngressRoutes/GatewayAPI に証明書を発行する#

Ingress や GatewayAPI に関しては、Cert-Manager が統合されているため、リソースに注釈を追加するだけで済みます。以下に示すように:

Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # 発行者を使用することを示す注釈を追加します。
    cert-manager.io/cluster-issuer: nameOfClusterIssuer
  name: myIngress
  namespace: myIngress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - pathType: Prefix
            path: /
            backend:
              service:
                name: myservice
                port:
                  number: 80
  tls: # < ホストをTLS構成に配置すると、証明書のsubjectAltNamesに反映されます
    - hosts:
        - example.com
      secretName: myingress-cert # < cert-managerは、作成された証明書をこのシークレットに保存します。

Gateway

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: Gateway
metadata:
  name: example
  annotations:
    cert-manager.io/issuer: foo
spec:
  gatewayClassName: foo
  listeners:
    - name: http
      hostname: example.com
      port: 443
      protocol: HTTPS
      allowedRoutes:
        namespaces:
          from: All
      tls:
        mode: Terminate
        certificateRefs:
          - name: example-com-tls

IngressRoute の場合、Certificate を手動で作成する必要があります。以下に示すように:

IngressRoute

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: example
spec:
  entryPoints: # ポート80と443からのリクエストを受け付けます
    - web
    - websecure
  routes:
    - match: Host(`example.domain.com`)
      kind: Rule
      services:
        - name: example # リクエストはこのサービスに転送されます
          port: 80
  tls:
    secretName: example-cert

Certificate

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-cert
spec:
  dnsNames:
    - example.domain.com
  secretName: example-cert
  issuerRef:
    name: acme
    kind: ClusterIssuer
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。