前言#
前回の記事では、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