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の違い

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

推薦する

ウェブマスターのためのSEOの効果的なやり方: 分業と協力で効率が100倍に

SEOを学んでから1年近く実践・運用していますが、やっていることは同じです。クライアントのウェブサイ...

検索エンジンアルゴリズムのアップデートに関する敗者ウェブマスターの予測

1. 著作権アルゴリズムの改善。多くの人は、著作権を下部に追加せずに他人の記事を転載しています。この...

SiteGround - 70% オフセール/ブラックフライデー

SiteGround.com ブラックフライデーセール、全品 70% オフ、11 月 29 日から ...

よく使われるWeiboマーケティング戦略とテクニックは何ですか?

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWeibo の使用頻度は...

WaveCom-エストニア/月額5.6ドル特別価格kvm仮想VPS(1Gメモリ)

Wavecom は、エストニアの老舗企業 (登録番号: 10756058) で、2001 年から事業...

医療電子商取引B2Cは、量の増加はあっても利益が上がらないという問題に直面している。最も速い感染拡大には3年かかるだろう。

ナンドゥコミックス:チェン・ティン医薬品電子商取引B2Cは発展の過程でどのような困難に直面してきまし...

vpsua: 高品質のウクライナ VPS、月額 6.92 ドルから、Windows、PayPal 対応

vps.ua はウクライナの商人で、2010 年に設立されました。主な事業は VPS (OpenVZ...

入札アカウントの受託を正しく理解し、プロモーション効果を合理的に定量化する

まず、入札の原則についてお話ししましょう。訪問者は購入ニーズを生み出し、検索エンジンで関連キーワード...

未知のクラウド内の未知の資産を発見

クラウド資産の検出は、ほとんどの組織のクラウド戦略の中で最も見落とされ、最も理解されていないコンポー...

アリババクラウドデータベースの責任者であるフェイフェイ・リーが、中国コンピュータ協会の2022年CCFフェローに選出されました。

11月25日、中国コンピューター学会(CCF)は2022年度のCCFフェローのリストを正式に発表した...

ウェブサイトのトラフィックが少なく、ウェブサイトの重量を増やせない3つの理由

トラフィックはウェブサイトの血液であり、重みはウェブサイトに血液が完全に補給されていることを保証する...

Renrenビデオサーバーが海外に移転

人人影視はホームページに「中国語サイトは正式に閉鎖されました。国際版を閲覧する際は、お住まいの地域の...

分散型ネットワーキングが新たなトレンドとなっているのはなぜでしょうか?

インターネットの普及は、次の 5 つの重要な要因によるものです。 1. TCP/IP TCP/IP ...

将来の検索エンジンのターゲットグループ:SEO中毒者

このような質問を知りたいです。検索エンジン最適化業者として、主にどのような企業やクライアントにサービ...

Nagarro が数兆ドルのデジタル資産を効率的に管理するために Amazon Web Services を優先クラウド プロバイダーとして選択

Amazon Web Services は、世界的な IT サービスおよびコンサルティング企業である...