Cert-Manager は K8s サービスドメイン名証明書の自動更新を実装します

Cert-Manager は K8s サービスドメイン名証明書の自動更新を実装します

導入

Cert-Manager [1]は、Kubernetesクラスター内のTLS証明書の管理を自動化するためのオープンソースツールです。 Kubernetes カスタム リソース定義 (CRD) メカニズムを使用して、証明書の作成、更新、削除を簡単にします。

デザインコンセプト

Cert-Manager は、Kubernetes API を使用して管理できる Pod、Service、Deployment と同様に、TLS 証明書をリソースとして扱います。カスタム リソース定義 (CRD) メカニズムを使用して、Kubernetes API を拡張することで証明書のライフサイクルを管理するための標準化された方法を提供します。

建築デザイン

Cert-Manager のアーキテクチャは、制御層とデータ層の 2 つの層に分かれています。

制御層: 証明書の作成、更新、削除など、証明書の管理を担当します。

データ層: 証明書の秘密キー、証明書要求、証明機関などの証明書関連データを保存します。

Cert-Manager は、**自己署名証明書**、Let's Encrypt、HashiCorp Vault、Venafi など、複数の証明機関をサポートしています。また、HTTP 認証、DNS 認証、TLS-SNI 認証など、複数の認証方法もサポートしています。これらの検証方法は、証明書の発行機関が信頼できるものであり、証明書の秘密鍵が漏洩していないことを確認するのに役立ちます。

使用シナリオ

Cert-Manager には、次のような幅広い使用シナリオがあります。

  1. HTTPS アクセス: Cert-Manager を使用すると、Kubernetes クラスター内のサービスと Ingress の TLS 証明書を簡単に作成し、HTTPS アクセスを有効にすることができます。
  2. デプロイメントのセキュリティ: Cert-Manager は、Kubernetes クラスター内の Pod に対して TLS 証明書を作成し、Pod 間の通信が暗号化されることを保証できます。
  3. サービス間認証: Cert-Manager は、Kubernetes クラスター内のサービスに対して TLS 証明書を作成し、サービス間の通信が暗号化されることを保証できます。
  4. その他のアプリケーション シナリオ: Cert-Manager は、通信が暗号化されていることを確認するために、他のアプリケーションの TLS 証明書を作成するためにも使用できます。

実用的な問題を解決

  1. 自動証明書管理: Cert-Manager は、手動介入なしで TLS 証明書を自動的に管理し、証明書を自動的に発行し、有効期限前に証明書を更新することで、証明書管理の複雑さとエラーを回避します。
  2. セキュリティ: Cert-Manager は、証明書の発行機関が信頼できるものであり、証明書の秘密鍵が漏洩していないことを保証し、通信のセキュリティを向上させるのに役立ちます。
  3. 管理コスト: Cert-Manager は、証明書の管理方法を標準化することで、証明書管理のコストとプロセスを簡素化できます。

cert-managerを使用して証明書を作成するプロセス

Kubernetes では、cert-manager は次のプロセスを通じて証明書を発行するためのリソース オブジェクトを作成します。

  1. 証明書名、ドメイン名などの証明書関連の情報が含まれる CertificateRequest オブジェクトを作成します。このオブジェクトは、使用する Issuer または ClusterIssuer と、証明書の発行後に保存される Secret の名前を指定します。
  2. Issuer または ClusterIssuer は、証明書要求の関連情報に基づいて Order オブジェクトを作成し、証明書を発行する必要があることを示します。このオブジェクトには、証明書を発行するために必要なドメイン名リストや証明書発行機関の名前などの情報が含まれています。
  3. 証明書発行機関は、Order オブジェクトの情報に基づいて 1 つ以上の Challenge オブジェクトを作成し、証明書申請者のドメイン名に対する制御を確認します。チャレンジ オブジェクトには、ドメイン名の所有権を証明する DNS レコードまたは HTTP サービスが含まれています。
  4. cert-manager は、Challenge オブジェクトの ChallengeResponse 応答を受信すると、それを解決済みの状態に更新します。証明書発行機関はすべてのチャレンジ オブジェクトをチェックし、すべてが検証に合格した場合に証明書を発行します。
  5. 証明書が発行されると、証明書発行機関は証明書情報を Secret オブジェクトに書き込み、Order オブジェクトを完了としてマークします。証明書情報は、他の展開オブジェクトでも使用できるようになりました。

cert-manager が k8s で証明書を作成するプロセス全体は、次のフローチャートで説明できます。

 +-------------+
| |
|イングレス/ |
|注釈|
| |
+------+------+
|
|イングレスの変更を監視する
|

+-------------+
| |
|発行者/ |
|クラスター発行者|
| |
+------+------+
|
|証明書リクエストの作成
|

+------+------+
| |
|証明書リクエスト|
| |
+------+------+
|
|注文を作成
|

+------+------+
| |
|注文|
| |
+------+------+
|
|チャレンジを作成する
|

+------+------+
| |
|チャレンジ|
| |
+------+------+
|
|挑戦応える
|

+------+------+
| |
|チャレンジレスポンス|
| |
+------+------+
|
|証明書を発行する
|

+------+------+
| |
|秘密|
| |
+------+------+

実際に手動で練習すると、次のコマンドで各プロセスの情報を表示できます。

 kubectl は証明書リクエスト注文チャレンジを取得します

この時点で、設計コンセプト、アーキテクチャ設計、使用シナリオ、および cert-manager によって解決される実際の問題を理解した後、cert-manager を使用して実際のプロジェクトの証明書を作成できます。

インストールと設定

cert-manager をインストールします。

 kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml

名前準備完了ステータス再起動年齢
cert - manager - 5 d495db6fc - 6 rtxx 1 / 1実行中0 9 m56s
cert - manager - cainjector - 5f 9 c9d977f - bxchd 1 / 1実行中0 9 m56s
cert - manager - webhook - 57 bd45f9c - 89 q87 1 / 1実行中0 9分56秒

cmctl コマンドライン ツールを使用して、cert-manager が正常かどうかを確認します。

醸造インストールcmctl
cmctlチェックAPI

インストールが完了すると、Cert-manager は CRD (カスタム リソース定義) と、証明書やキーなどの関連リソースを自動的に作成します。

cert-manager webhook が正常かどうかを確認します。

 cat << EOF > 02 -テスト-リソース.yaml
APIバージョン: v1
種類:名前空間
メタデータ:
名前:証明書-マネージャー-テスト
---
apiバージョン: cert-manager.io/v1
種類:発行者
メタデータ:
名前:テスト-自己署名
名前空間: cert - manager - test
仕様:
自己署名: {}
---
apiバージョン: cert-manager.io/v1
種類:証明書
メタデータ:
名前:自己署名証明
名前空間: cert - manager - test
仕様:
dns名:
-com
secretName :自己署名-証明書- TLS
発行者参照:
名前:テスト-自己署名
終了

kubectl適用- f 02 -テスト-リソース.yaml
kubectl削除- f 02 -テスト-リソース.yaml

cert-manager の証明書発行エンティティ オブジェクトを作成する

cert-manager の Issuer と ClusterIssuer はどちらも、証明書の発行先のエンティティを定義するために使用されるリソース オブジェクトです。

  • 発行者は、名前空間内で証明書を発行するために使用される名前空間レベルのリソースです。たとえば、自己署名証明書を使用してサービスを保護する必要がある場合や、Let's Encrypt などのパブリック証明機関を使用して証明書を発行する必要がある場合に、Issuer を使用できます。
  • ClusterIssuer は、クラスター全体に証明書を発行するために使用されるクラスター レベルのリソースです。たとえば、会社の内部 CA を使用して証明書を発行する必要がある場合は、ClusterIssuer を使用できます。

両者の違いを理解した上で、使用状況に応じて発行者のタイプを決定できます。よく使用される発行者テンプレートをいくつか示します。

  • ステージング環境用の証明書発行者を作成します。
 apiバージョン: cert-manager.io/v1
種類:発行者
メタデータ:
名前: letsencrypt -ステージング
仕様:
アクメ
# ACMEサーバーURL
サーバー: https://acme-staging-v02.api.letsencrypt.org/directory
# ACME登録使用するメールアドレス
メール: [email protected] #ここにメールアドレスを入力してください
# ACMEアカウントの秘密保存するために使用するシークレット名前
秘密鍵シークレット参照:
名前: letsencrypt -ステージング
# HTTP - 01チャレンジプロバイダー有効にする
ソルバー:
- http01 :
入口:
クラス: nginx


ステージング環境を使用して発行された証明書は、パブリック ネットワークでは通常使用できないため、信頼されたルート証明書をローカルに追加する必要があります。


  • prod 環境用の証明書発行者を作成します。
 apiバージョン: cert-manager.io/v1
種類:発行者
メタデータ:
名前: letsencrypt - prod
仕様:
アクメ
# ACMEサーバーURL
サーバー: https://acme-v02.api.letsencrypt.org/directory
# ACME登録使用するメールアドレスクラウドネイティブエコシステムをフォローする
メールアドレス: [email protected]
# ACMEアカウントの秘密保存するために使用するシークレット名前
秘密鍵シークレット参照:
名前: letsencrypt - prod
# HTTP - 01チャレンジプロバイダー有効にする
ソルバー:
- http01 :
入口:
クラス: nginx
  • ステージング環境用の証明書発行者 ClusterIssuer を作成します。
 apiバージョン: cert-manager.io/v1
種類: ClusterIssuer
メタデータ:
名前: letsencrypt -ステージング
仕様:
アクメ
# ACMEサーバーURL
サーバー: https://acme-staging-v02.api.letsencrypt.org/directory
# ACME登録使用するメールアドレスクラウドネイティブエコシステムをフォローする
メールアドレス: [email protected]
# ACMEアカウントの秘密保存するために使用するシークレット名前
秘密鍵シークレット参照:
名前: letsencrypt -ステージング
# HTTP - 01チャレンジプロバイダー有効にする
ソルバー:
- http01 :
入口:
クラス: nginx
  • Prod 環境用の証明書発行者 ClusterIssuer を作成します。
 apiバージョン: cert-manager.io/v1
種類: ClusterIssuer
メタデータ:
名前: letsencrypt - prod
仕様:
アクメ
# ACMEサーバーURL
サーバー: https://acme-v02.api.letsencrypt.org/directory
# ACME登録使用するメールアドレスクラウドネイティブエコシステムをフォローする
メールアドレス: [email protected]
# ACMEアカウントの秘密保存するために使用するシークレット名前
秘密鍵シークレット参照:
名前: letsencrypt - prod
# HTTP - 01チャレンジプロバイダー有効にする
ソルバー:
- http01 :
入口:
クラス: nginx

実際のアプリケーションでテストする

ここで、cert-manager を使用して証明書に署名するための準備作業は基本的にすべて完了しました。簡単な例で証明書をテストしてみましょう。ここでは、小さなオープンソースプロジェクトのファイル転送キャビネットを展開します。

 APIバージョン: v1
種類:永続ボリューム
メタデータ:
名前: filecodebox - pv
ラベル:
タイプ:ローカル
仕様:
ストレージクラス名:手動
容量
ストレージ: 5 Gi
アクセスモード:
-ReadWriteOnce
ホストパス:
パス: "/data/filecodebox"
---
APIバージョン: v1
種類: PersistentVolumeClaim
メタデータ:
名前:ファイルコードボックス- pvc
名前空間:ブログ
仕様:
ストレージクラス名:手動
アクセスモード:
-ReadWriteOnce
リソース
リクエスト:
ストレージ: 5 Gi
---
apiバージョン:アプリ/ v1
種類:デプロイメント
メタデータ:
名前:ファイルコードボックス
名前空間:ブログ
ラベル:
アプリ:ファイルコードボックス
仕様:
レプリカ1
テンプレート
メタデータ:
名前:ファイルコードボックス
ラベル:
アプリ:ファイルコードボックス
仕様:
コンテナ:
-名前:ファイルコードボックス
画像: lanol / filecodebox :最新
imagePullPolicy : IfNotPresent
ボリュームマウント:
-マウントパス: / app / data
名前:ファイルコードボックスデータ
-マウントパス: / etc / localtime
名前:タイムゾーン
読み取り専用: true
再起動ポリシー:常に
巻数:
-名前:ファイルコードボックスデータ
永続ボリュームクレーム:
クレーム名:ファイルコードボックス- pvc
-名前:タイムゾーン
ホストパス:
パス/ usr / share / zoneinfo /アジア/上海
セレクター:
マッチラベル:
アプリ:ファイルコードボックス
---
APIバージョン: v1
種類:サービス
メタデータ:
名前: filecodebox - svc
名前空間:ブログ
仕様:
セレクター:
アプリ:ファイルコードボックス
ポート:
-ポート: 12345
タイプ: ClusterIP
---
apiバージョン:ネットワークk8sio / v1
種類:イングレス
メタデータ:
名前: filecodebox - ingress
名前空間:ブログ
ラベル:
公開元:イングレス
注釈:
cert-manager.io/cluster-issuer : " letsencrypt-prod" #ここでは発行者基づいてprod証明書を発行します
仕様:
イングレスクラス名: nginx
TLS :
-ホスト:
-ファイル開発者中国語
secretName :ファイルコードボックス- tls
ルール:
-ホスト:ファイル.devopsman .cn
http://www.google.com/dp ...
パス:
-パスタイプ:プレフィックス
パス"/"
バックエンド:
サービス
名前: filecodebox - svc
ポート:
番号: 12345

作成後、証明書の有効期間を確認して有効かどうかを確認できます。

ルート#エコー | openssl s_client -servername file.devopsman.cn -connect file.devopsman.cn:443 2>/dev/null | openssl x509 -noout -dates
notBefore=2023年3月1日 04:02:01 GMT
notAfter=2023年5月30日 04:02:00 GMT

ここで、生成された証明書を kubectl 経由で確認することで確認することもできます。

 APIバージョン: cert-manager.io/v1
種類: 証明書
メタデータ:
作成タイムスタンプ: "2023-03-01T05:01:18Z"
世代: 1
ラベル:
公開元: イングレス
名前: filecodebox-tls
名前空間: ブログ
所有者参照:
- APIバージョン: networking.k8s.io/v1
ブロック所有者削除: true
コントローラー: true
種類: イングレス
名前: filecodebox-ingress
uid: 3e2972a3-934b-431f-afee-4f649f5e1df3
リソースバージョン: "26802670"
uid: 3d58d600-87aa-4119-bbdd-6566a8a0331b
仕様:
dns名:
- ファイル.devopsman.cn
発行者参照:
グループ: cert-manager.io
種類: ClusterIssuer
名前:letsencrypt-prod
シークレット名: filecodebox-tls
使用法:
-デジタル署名
- キー暗号化
状態:
条件:
- 最終遷移時間: "2023-03-01T05:02:03Z"
メッセージ: 証明書は最新であり、期限切れではありません
観測世代: 1
理由: 準備完了
ステータス: "True"
タイプ: 準備完了
それ以降: "2023-05-30T04:02:00Z"
以前: "2023-03-01T04:02:01Z"
更新時間: "2023-04-30T04:02:00Z"
改訂: 1

上記の証明書発行から発行までのプロセスを理解した後、次のコマンドでプロセス全体の大まかな詳細を表示できます。

 kubectl は証明書リクエスト注文チャレンジを取得します

この時点で、cert-manager が証明書要求に署名する方法を基本的に理解できました。何か興味深い話題があれば、一緒に話し合うこともできます。次回の記事では、cert-manager を使って社内 LAN 内に自己署名発行者を作成し、コストをできるだけ抑えながら実環境をシミュレートするために必要な証明書を発行する方法について記録する予定です。

<<:  DockerのエントリポイントとCMDの違い

>>:  クラウドストレージを最大限に活用する最良の方法

推薦する

PR の低下はウェブサイトのコンテンツの質に関係しているのでしょうか?

ある日、偶然 SEO 愛好家を訪ねて、次のような記事を目にしました。「PR の低下は、ウェブサイトの...

これらのマーケティングチャネルをご存知ですか?

現代のインターネットは、ポータル時代、検索時代、ソーシャル時代を経て、現在はコンテンツ時代となってい...

実践的な共有: 完全なウェブサイト最適化計画を作成する方法

ウェブサイトの最適化をうまく行うには、自分に合ったウェブサイトの最適化プランを作成する必要があります...

firstbyte: トラフィック無制限、最低月額9.8元のシンガポールVPSの簡単なレビュー

Firstbyte は 2009 年に設立されたロシアのホスティング会社で、世界中の 7 つのデータ...

海外メディア:米国防総省はマイクロソフトとの100億ドルのクラウドコンピューティング契約の解除を検討中

海外メディアの報道によると、アマゾンが起こした訴訟により、米国防総省はマイクロソフトとの100億ドル...

百度のサイトリンク機能の廃止はブランドプロモーションに支障をきたす恐れ

サイトリンク機能は、検索エンジンの重みが十分に高い場合にのみ使用できるため、SEO 専門家によって常...

Docker と Kubernetes を保護する 7 つのコンテナ セキュリティ ツール

[51CTO.com クイック翻訳] Docker コンテナは、ソフトウェア開発者がアプリケーション...

ユーザーエクスペリエンス分析: インターフェースデザインにおける構造設計

インターフェースの視覚的な階層を構築する要素には、色の目立ち具合、画像とテキストのサイズ、そして最も...

Kingsoft Cloud Edge Computing KENC: ユニバーサルコンピューティングパワーとネットワークをより近く、より深く

「5G時代はエッジコンピューティングの時代です。」 12月10日、2020エッジコンピューティング業...

サーバーレスクラウドコンピューティングが次の大きなトレンド

クラウドでのサーバーレス コンピューティングは素晴らしいアイデアですが、サーバーレス コンピューティ...

Baiduの公式ツールを使用してウェブサイトを合理的にレイアウトする

ウェブサイトを構築する前に、まずユーザーのニーズと検索習慣を分析し、合理的なレイアウトを作成する必要...

vpsrus-3.5 USD/Windows/2 GB RAM/20 GB HDD/1 TB Flow/シカゴ

皆さんに安価な Windows シリーズ VPS を紹介したいと思います。vpsrus.com は、...

クラウド コンピューティングはなぜそれほど重要なのでしょうか。また、今後の動向はどうなるのでしょうか。

クラウド コンピューティングとは、簡単に言えばコンピューティング サービスの提供です。これらのサービ...

百度と中国の検索:検索の科学と芸術を学ぶ人々

10年前、私はインターネット製品を作り、それが成功しました。同様のインターネット製品は 10 年後に...

825のBaiduの「事故による負傷」からBaiduの更新メカニズムを分析

Baidu をフォローしているウェブマスターとして、Baidu の数々のアップデートは常に私たちを心...