Kubernetesプラットフォームプロバイダーとの互換性
以下に、cert-managerのデプロイ時に影響を受ける可能性のある、さまざまな互換性の問題や癖について詳しく説明します。何か見落としがあると思われる場合は、お気軽に問題を提起するか、詳細を記載したプルリクエストを送信してください。
AWS Fargateを使用している場合、またはホストのネットワークで実行するようにcert-managerを特別に構成している場合は、kubeletがデフォルトでポート10250
でリッスンしていることに注意してください。これは、cert-manager webhookのデフォルトポートと衝突します。
そのため、cert-managerをセットアップするときは、webhookのポートを変更する必要があります。
Helmを使用してインストールする場合、コマンドラインフラグまたはvalues.yaml
ファイルのエントリのいずれかを使用してcert-managerをインストールするときに、webhook.securePort
パラメーターを設定できます。
ポートの衝突が発生した場合、信頼されていない証明書に関する紛らわしいエラーメッセージが表示される可能性があります。詳細については、#3237を参照してください。
GKE
Googleがプライベートクラスターのコントロールプレーンを構成すると、Kubernetesクラスターのネットワークと、Googleが管理する別のプロジェクトの間で、VPCピアリングが自動的に構成されます。
クラスター内でGoogleがアクセスできるものを制限するために、構成されたファイアウォールルールによって、Kubernetesポッドへのアクセスが制限されます。これは、webhookが機能しないことを意味し、Internal error occurred: failed calling admission webhook ... the server is currently unable to handle the request
などのエラーが表示されます。
GKEプライベートクラスターでwebhookコンポーネントを使用するには、GKEコントロールプレーンがwebhookポッドにアクセスできるように、追加のファイアウォールルールを構成する必要があります。
GKEコントロールプレーンノードのファイアウォールルールの追加方法の詳細については、GKEドキュメントを参照してください。
GKE Autopilot
Kubernetes < 1.21のGKE Autopilotモードは、変更可能なアドミッションwebhookの制限のため、cert-managerをサポートしていません。
2021年10月の時点で、"rapid" AutopilotリリースチャネルのみがKubernetesマスターにバージョン1.21をロールアウトしています。helmチャートによるインストールはエラーメッセージで終了する可能性がありますが、一部のユーザーはcert-managerが動作していると報告しています。フィードバックとPRを歓迎します。
問題点: GKE Autopilotでは、kube-system
ネームスペースの変更を許可していません。
歴史的に、同じクラスターへのcert-managerの複数インストールを防ぐために、kube-system
ネームスペースを使用してきました。
デフォルト構成でこれらの環境にcert-managerをインストールすると、ブートストラップで問題が発生する可能性があります。いくつかの兆候は次のとおりです。
cert-manager-cainjector
が次のようなエラーをログに記録します。
E0425 09:04:01.520150 1 leaderelection.go:334] error initially creating leader election record: leases.coordination.k8s.io is forbidden: User "system:serviceaccount:cert-manager:cert-manager-cainjector" cannot create resource "leases" in API group "coordination.k8s.io" in the namespace "kube-system": GKEAutopilot authz: the namespace "kube-system" is managed and the request's verb "create" is denied
cert-manager-startupapicheck
が完了せず、次のようなメッセージをログに記録します。
Not ready: the cert-manager webhook CA bundle is not injected yet
解決策: 次のように、リーダー選出に別の名前空間を使用するようにcert-managerを構成します。
helm install \cert-manager jetstack/cert-manager \--namespace cert-manager \--create-namespace \--version ${CERT_MANAGER_VERSION} --set global.leaderElection.namespace=cert-manager
kubectl apply
タイプのインストールの場合、影響として「インストール前にkube-system
をcert-managerに置き換えてマニフェストを手動で更新する必要がある」または「kubectl applyを使用してcert-managerをインストールしないでください。Helmが推奨される解決策です」のいずれかになります。
AWS EKS
EKSでカスタムCNI(WeaveやCalicoなど)を使用すると、cert-managerがwebhookに到達できません。これは、EKSでコントロールプレーンをカスタムCNIで実行するように構成できないため、コントロールプレーンとワーカーノードでCNIが異なる場合に発生します。
これに対処するために、デプロイでwebhook.hostNetwork
キーをtrueに設定するか、Helmを使用している場合はvalues.yaml
ファイルで構成することにより、webhookをホストネットワークで実行して、cert-managerがwebhookに到達できるようにすることができます。
ホストネットワークで実行するには、webhookのポートを変更する必要があることに注意してください。詳細については、ページの上部にある警告を参照してください。
AWS Fargate
AWS Fargateを使用すると、ネットワーク構成があまり許可されず、#3237で確認できるように、webhookのポートがポート10250で実行されているkubeletと衝突することに注意してください。
Fargateにcert-managerをデプロイする場合は、webhookがリッスンするポートを必ず変更する必要があります。詳細については、このページの上部にある警告を参照してください。
Fargateでは、そのネットワーキングを使用する必要があるため、ネットワーキングタイプと、helmチャートのwebhook.hostNetwork
などのオプションを手動で設定することはできず、cert-managerのデプロイが予期しない方法で失敗する可能性があります。