Cert-Managerは、Kubernetesクラスター内の証明書のプロビジョニングを自動化します。証明書を発行してサービスに添付するための一連のカスタムリソースを提供します。
最も一般的な使用例の1つは、Let’sEncryptのSSL証明書を使用してWebアプリとAPIを保護することです。 Cert-Managerをクラスターに追加し、Let’s Encrypt証明書発行者を設定し、Ingressを介して公開されたポッドの証明書を取得する方法は次のとおりです。
Cert-Managerのインストール
Cert-Managerは、Helmを使用してインストールするのが最も簡単です。 HelmはKubernetesパッケージマネージャーであり、事前に作成されたチャートのリポジトリを使用してクラスターにアプリケーションを追加できます。 Helmがインストールされ、Kubernetesクラスターに接続してセットアップされていることを確認してください。
まず、JetstackリポジトリをHelmインストールに追加します。 Jetstackは、CNCFに寄付される前にCert-Managerを最初に開発しました。
helm repo add jetstack https://charts.jetstack.io helm repo update
次に、Cert-Managerをクラスターにインストールします。
helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.5.3 --set installCRDs=true
上記のバージョン番号を、Cert-Managerのドキュメントに示されている最新のリリースに置き換えます。
このコマンドは、cert-managerと呼ばれる新しいKubernetes名前空間にCert-Managerをインストールします 。 installCRDs 設定すると、インストール中にCert-ManagerのカスタムKubernetesリソースが追加されます。これは、Helmバージョン3.2以降でのみ機能します。古いバージョンを使用している場合は、Kubectlを使用してリソース定義を手動で追加する必要があります。
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
Kubectlプラグインの追加
Cert-Managerには、いくつかの一般的な管理タスクを簡素化するKubectlプラグインがあります。また、Cert-Managerが稼働していて、リクエストを処理する準備ができているかどうかを確認することもできます。
アーカイブをダウンロードして正しいディレクトリに抽出することにより、プラグインをインストールします。
curl -L -o kubectl-cert-manager.tar.gz https://github.com/jetstack/cert-manager/releases/latest/download/kubectl-cert_manager-linux-amd64.tar.gz tar xzf kubectl-cert-manager.tar.gz sudo mv kubectl-cert_manager /usr/local/bin
次に、プラグインを使用して、Cert-Managerのインストールが機能していることを確認します。
kubectl cert-manager check api
次の出力が表示されます。
The cert-manager API is ready
これで、Let’sEncryptから証明書を取得するための発行者を追加する準備が整いました。
発行者とクラスター発行者は、クラスターに証明書を提供するリソースです。これまでに作成された基本的なCert-Managerインストールでは、証明書を発行できません。 Let’s Encryptを使用するように構成された発行者を追加すると、クラスター内のサービスの新しい証明書を動的に取得できます。
作業ディレクトリにYAMLファイルを作成し、issuer.ymlという名前を付けます 。次のコンテンツを追加します:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- http01:
ingress:
class: nginx メールアドレスを自分の連絡先メールに置き換える必要があります。これは証明書に含まれます。 Let's Encryptは、証明書に関するアラートを送信する必要がある場合、そのアドレスにメールを送信することもあります。
ClusterIssuerを作成しています これらは、名前空間に関係なく、クラスター内のすべてのリソースで使用できるためです。標準のIssuer は、独自の名前空間内でのみ証明書を提供できる名前空間リソースです。
発行者の構成は、Cert-ManagerにLet’sEncryptステージングサーバーから証明書を取得するように指示します。 Let's Encryptの厳しい本番レートの制限に達しないように、統合をセットアップするときにステージング環境を使用することをお勧めします。
kubectlを使用する 発行者をクラスターに追加するには:
kubectl create -f issuer.yml
これで、発行者を使用して、Ingressリソースを介して公開されたサービスの証明書を取得できます。 Cert-Managerは、Ingressリソースを自動的に監視し、tlsの構成を使用して証明書を作成します。 分野。使用する発行者またはクラスター発行者に名前を付ける注釈を追加するだけです。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: wordpress:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
port: 80
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-staging
spec:
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
tls:
- hosts:
- example.com
このYAMLファイルは、ポッド、サービス、およびサービスを公開するIngressを定義します。 nginx-ingressの使用を前提としています Ingressコントローラーとして。ポッドは、example.comでHTTPS経由でアクセスできるWordPressコンテナを実行します 。
cert-manager.io/cluster-issuerの存在 Ingressリソースの注釈は、Cert-Managerによって検出されます。 letsencrypt-stagingを使用します Ingressのtls.hostsで定義されたホスト名をカバーする証明書を取得するために以前に作成されたクラスター発行者 フィールド。
ステージング証明書を正常に取得したら、Let’sEncryptの実稼働サーバーに移行できます。ステージング証明書は有効ですが、ブラウザによって信頼されていないため、サイトを公開する前に本番環境の代替品を入手する必要があります。
本番サーバー用に別のクラスター発行者を追加することをお勧めします。その後、本番環境に対応しているかどうかに応じて、各Ingressリソースで適切な発行者を参照できます。
上記の発行者構成をコピーして、nameを変更します letsencrypt-productionへのフィールド 。次に、サーバーのURLを次の値に置き換えます。
https://acme-v02.api.letsencrypt.org/directory
クラスタに新しい発行者を作成します:
kubectl create -f issuer-production.yml
cert-manager.io/cluster-issuerの値を変更して、Ingressリソースを更新して本番証明書をリクエストします letsencrypt-productionへのアノテーション (または自分のプロダクション発行者に割り当てた名前)。 kubectlを使用する 変更を適用するには:
kubectl apply -f my-ingress.yaml
これで、Ingressリソースに対して完全に機能するHTTPSが有効になっているはずです。 Cert-Managerは証明書を自動的に管理し、有効期限が切れる前に更新します。
Cert-Managerリリースは通常、Helmを使用したインプレースアップグレードをサポートします:
helm repo update helm upgrade --version <new version> cert-manager jetstack/cert-manager
アップグレード中も証明書は引き続き利用できますが、更新プロセスは停止されます。
アップグレードは通常簡単ですが、リリースノートを常に確認して、必要な変更の可能性を特定する必要があります。これは、Kubernetesをアップグレードする場合、またはいくつかのCert-Managerバージョンを移行する場合に特に重要です。古いKubernetesリリースをまだ使用している場合は、最新の状態にするにはかなりの手動介入が必要な、廃止されたCert-Managerバージョンを使用している可能性があります。
Let’s Encryptは、Cert-Managerを使用してKubernetesクラスターに簡単に追加できます。 Helmを使用してCert-Managerをインストールし、Let’s Encrypt APIを使用する発行者を作成してから、その発行者をIngressリソースで参照する必要があります。
より高度なユースケースのために、Cert-Managerに独自の構成を提供できます。証明書の有効期間を指定できます(cert-manager.io/durationを使用) 入力アノテーション)、証明書の共通名(cert-manager.io/common-name)を手動で宣言します )、HTTPの代わりにDNSチャレンジを使用します。後者のオプションは、ワイルドカード証明書を取得する場合など、特定のシナリオで役立ちます。
WebアプリとAPIを保護するための簡単な使用法は、上記のリソースを使用してそのまま機能する必要があります。 HTTP検証は、Ingressコントローラーを操作して一時的な.well-knownを提供することで機能します Let’sEncryptがアクセスできるURL。ドメインがそのURLで正しい値を提供している場合、Let’s Encryptはあなたが管理していることを信頼し、証明書を発行します。