記事ディレクトリ
1 はじめに
Cert-manager は、Kubernetes 上の証明書管理コントローラーであり、証明書の発行と更新のプロセスを自動化できます。Kubernetes のカスタム リソース定義 (CRD) を使用して、証明書の要求と発行、および秘密キーや証明書チェーンなどの関連リソースを定義します。Cert-manager は、Let's Encrypt、Venafi、HashiCorp Vault などを含むさまざまな認証局 (CA) をサポートしています。
Cert-manager を Kubernetes Ingress コントローラーと統合して、HTTPS 証明書の発行と更新を自動化できます。Ingress リソースを作成すると、Cert-manager は自動的に証明書リクエストを作成し、そのリクエストを認証局に送信できます。認証局が証明書に署名すると、Cert-manager は自動的に証明書を対応する Ingress リソースにインストールし、TLS 終端を構成します。
Cert-manager は、Let's Encrypt が主導するオープン標準である自動証明書発行プロトコルである ACME プロトコル (Automatic Certificate Management Environment) もサポートしています。ACME プロトコルを使用すると、証明書の発行および更新プロセスを手動で管理することなく、Let's Encrypt によって発行された無料の証明書を使用して HTTPS を有効にすることができます。
Cert-manager は、カスタム認証局を Cert-manager に統合して Cert-manager を通じて管理できる Webhook API も提供します。
全体として、Cert-manager は証明書管理のプロセスを簡素化し、アプリケーションが常に最新の証明書を使用できるようにし、Kubernetes での証明書管理を簡単に自動化するのに役立ちます。
2. アーキテクチャ
証明書マネージャーは、Kubernetes のカスタム リソース定義 (CRD) を通じて、証明書の要求と発行、および秘密キーや証明書チェーンなどの関連リソースを定義します。Cert-manager は Kubernetes クラスター内で Deployment または StatefulSet として実行され、次の 3 つの主要コンポーネントが含まれています。
-
cert-manager コントローラー: 証明書発行要求 (CertificateRequest) および発行機関 (Issuer または ClusterIssuer) の変更を監視し、証明書発行要求を対応する発行機関に発行のために送信する責任を負います。認証局が証明書に署名すると、コントローラーはその証明書を Kubernetes の対応するリソースに自動的にインストールします。
-
認証局: 証明書発行のための構成および認証情報を構成するために使用されます。Cert-manager は、Let's Encrypt、Venafi、HashiCorp Vault など、さまざまな認証局をサポートしています。
-
Webhook サービス: Cert-manager をカスタム認証局に拡張できるようにします。Webhook サービスを使用すると、カスタム認証局を Cert-manager に統合し、Cert-manager を通じて管理できるようになります。
Cert-manager は、Kubernetes の Ingress コントローラーと統合して、HTTPS 証明書の発行と更新を自動化することもできます。Ingress リソースを作成すると、Cert-manager は自動的に証明書リクエストを作成し、そのリクエストを認証局に送信できます。認証局が証明書に署名すると、Cert-manager は自動的に証明書を対応する Ingress リソースにインストールし、TLS 終端を構成します。
3. インストール
インストール後Cert-manager
、無料の証明書が自動的に発行されLet’s Encrypt HTTPS
、有効期限が切れる前に自動的に更新されます。まず、helm repo add
コマンドを実行して公式 Helm リポジトリを追加します。
$ helm repo add jetstack https://charts.jetstack.io
"jetstack" has been added to your repositories
次に、helm repo update を実行してローカル キャッシュを更新します。
$ helm repo update
...Successfully got an update from the "jetstack" chart repository
次に、helm install
を実行してインストールしますCert-manager
。
$ helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.12.0 --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer --set ingressShim.defaultIssuerGroup=cert-manager.io --set installCRDs=true
NAME: cert-manager
LAST DEPLOYED: Mon Oct 17 21:26:44 2022
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
cert-manager v1.12.0 has been deployed successfully!
ステータスを確認する
$ kubectl get all -n cert-manager
NAME READY STATUS RESTARTS AGE
pod/cert-manager-6c4f5bb68f-7q762 1/1 Running 0 53s
pod/cert-manager-cainjector-f5c6565d4-8vpc4 1/1 Running 0 53s
pod/cert-manager-webhook-5f44bc85f4-9b7nz 1/1 Running 0 53s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/cert-manager ClusterIP 10.96.3.160 <none> 9402/TCP 53s
service/cert-manager-webhook ClusterIP 10.96.3.178 <none> 443/TCP 53s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/cert-manager 1/1 1 1 53s
deployment.apps/cert-manager-cainjector 1/1 1 1 53s
deployment.apps/cert-manager-webhook 1/1 1 1 53s
NAME DESIRED CURRENT READY AGE
replicaset.apps/cert-manager-6c4f5bb68f 1 1 1 53s
replicaset.apps/cert-manager-cainjector-f5c6565d4 1 1 1 53s
replicaset.apps/cert-manager-webhook-5f44bc85f4 1 1 1 53s
さらに、発行権限を提供するためにCert-manager
作成する必要があります。ClusterIssuer
以下の内容を として保存しますcluster-issuer.yaml
。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: "[email protected]"
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
ここでは、実際の電子メール アドレスに置き換える必要があることに注意してくださいspec.acme.email
。次に、kubectl apply
クラスターへの送信を実行します。
$ kubectl apply -f cluster-issuer.yaml
clusterissuer.cert-manager.io/letsencrypt-prod created
この時点で、Cert-manager
すでに構成されています。
4. テスト
少し
5.削除
helm list -n cert-manager
helm delete cert-manager -n cert-manager
cert-manager 名前空間を削除する
$ k delete ns cert-manager
$ cat delete-ns.sh
#!/bin/bash
NAMESPACE=$1
kubectl proxy --port=8002 &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8002/api/v1/namespaces/$NAMESPACE/finalize
参考: