CA インジェクター
cainjector
は、次のCA証明書の設定を支援します:変更 Webhook、検証 Webhook 変換 Webhook、および API サービス
特に、cainjector
は、4つのAPIタイプ(ValidatingWebhookConfiguration
、MutatingWebhookConfiguration
、CustomResourceDefinition
、およびAPIService
)のcaBundle
フィールドに値を設定します。最初の3つのリソースタイプは、Kubernetes APIサーバーがWebhookにどのように接続するかを設定するために使用されます。このcaBundle
データはKubernetes APIサーバーによってロードされ、Webhook APIサーバーのサーバー証明書を検証するために使用されます。APIService
は、Extension API Serverを表すために使用されます。APIService
のcaBundle
には、APIサーバーのサーバー証明書の検証に使用できるCA証明書を設定できます。
これらの4つのAPIタイプを注入可能なリソースと呼びます。
注入可能なリソースには、注入のソースに応じて、cert-manager.io/inject-ca-from
、cert-manager.io/inject-ca-from-secret
、またはcert-manager.io/inject-apiserver-ca
のいずれかのアノテーションがMUSTでなければなりません。詳細については、以下で説明します。
cainjector
は、3つのソースのいずれか(KubernetesのSecret
、cert-managerのCertificate
、またはKubernetes APIサーバーのCA証明書(cainjector
自体がKubernetes APIサーバーへのTLS接続を検証するために使用するもの))からCAデータをコピーします。
ソースがKubernetesのSecret
である場合、そのリソースにはcert-manager.io/allow-direct-injection: "true"
のアノテーションもMUSTでなければなりません。3つのソースタイプについては、以下で詳しく説明します。
例
以下に、3つのcainjector
のソースの使用方法を示す例を示します。各ケースでは、注入可能なリソースとしてValidatingWebhookConfiguration
を使用していますが、代わりにMutatingWebhookConfiguration
またはCustomResourceDefinition
定義を代用できます。
CertificateリソースからCAデータを注入する
以下は、cert-manager.io/inject-ca-from
アノテーションで構成されたValidatingWebhookConfiguration
の例です。これにより、cainjector
は、cert-managerのCertificate
からのCAデータを使用してcaBundle
フィールドを設定します。
注: この例ではWebhookサーバーはデプロイせず、部分的なWebhook構成のみをデプロイしますが、cainjector
の動作を理解するのに十分なはずです。
apiVersion: v1kind: Namespacemetadata:name: example1---apiVersion: admissionregistration.k8s.io/v1kind: ValidatingWebhookConfigurationmetadata:name: webhook1annotations:cert-manager.io/inject-ca-from: example1/webhook1-certificatewebhooks:- name: webhook1.example.comadmissionReviewVersions:- v1clientConfig:service:name: webhook1namespace: example1path: /validateport: 443sideEffects: None---apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: webhook1-certificatenamespace: example1spec:secretName: webhook1-certificatednsNames:- webhook1.example1issuerRef:name: selfsigned---apiVersion: cert-manager.io/v1kind: Issuermetadata:name: selfsignednamespace: example1spec:selfSigned: {}
caBundle
の値が、Certificate
のSecret
のCAの値と同一になっているはずです。
kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io webhook1 -o yaml | grep caBundlekubectl -n example1 get secret webhook1-certificate -o yaml | grep ca.crt
そして、しばらくすると、Kubernetes APIサーバーはその新しいcaBundle
値を読み取り、それを使用してWebhookサーバーへのTLS接続を検証します。
SecretリソースからCAデータを注入する
以下は、cert-manager.io/inject-ca-from-secret
アノテーションで構成されたValidatingWebhookConfiguration
の別の例です。これにより、cainjector
は、KubernetesのSecret
からのCAデータを使用してcaBundle
フィールドを設定します。
注: この例ではWebhookサーバーはデプロイせず、部分的なWebhook構成のみをデプロイしますが、cainjector
の動作を理解するのに十分なはずです。
apiVersion: v1kind: Namespacemetadata:name: example2---apiVersion: admissionregistration.k8s.io/v1kind: ValidatingWebhookConfigurationmetadata:name: webhook2annotations:cert-manager.io/inject-ca-from-secret: example2/example-cawebhooks:- name: webhook2.example.comadmissionReviewVersions:- v1clientConfig:service:name: webhook2namespace: example2path: /validateport: 443sideEffects: None---apiVersion: v1kind: Secretmetadata:name: example-canamespace: example2annotations:cert-manager.io/allow-direct-injection: "true"type: kubernetes.io/tlsdata:ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRTkdJZ24yM3BQYVpNbk9MUjJnVmZHakFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwRmVHRnRjR3hsSUVOQk1CNFhEVEl3TURreU5ERTFOREEwTVZvWERUSXdNVEl5TXpFMQpOREEwTVZvd0ZURVRNQkVHQTFVRUF4TUtSWGhoYlhCc1pTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBS2F3RzVoMzlreHdyNEl0WCtHaDNYVWQrdTVJc2ZlSFdoTTc4TTRQTmZFeXhQMXoKRmNLN1d0MHJFMkwwNUppYmQ4ZjNpb3k5OXNnQ3I4OEw2SWxYZTB0RnkzNysxenJ4TFluR2hDQnZzZjltd0hLbgpIVTEvNERwQjROZkhPbFllNE9tbHVoNE9HdmZINU1EbDh5OWZGMjhXRXVBQ2dwdmpCUWxvRDNlVjJ5UmJvQ2kyCmtSTDJWYTFZL0FQZEpWK21VYkFvZmg0bllmUmNLRTJsSUg0RG5ZdXFPU3JaaituZUQ2M2RTSktxcHQ5K2luN2YKNHljZ2pQYU93MmdyKzhLK291QTlSQTV1VDI3SVNJcUJDcEV6elRqbVBUUWNvUTYxZGF0aDZkc1lsTEU4aWZWUwp4RWZuVEdQKy94M0FXQXR4eU5lanVuZGFXbVNFL3h5OHh0K0FxblVDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkowNkc5eEc2V1VBTHB6T3JYaHAKV2dsTm5qMkFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUI3ZG9CZnBLR3o4VlRQSnc0YXhpdisybzJpMHE1SQpSRzU2UE81WnhKQktZQlRROElHQmFOSm1yeGtmNTJCV0ttUGp4cXlNSGRwWjVBU00zOUJkZVUzRGtEWHp4RkgwCjM5RU12UnhIUERyMGQ4cTFFbndQT0xZY1hzNjJhYjdidE11cTJUMFNNZzRYMkY5VmNKTW5YdjlrNnA0VGZNR3MKVThCQnJhVGhUZm53ejBsWXMyblFjdzNmZjZ1bG1wWlk4K3BTak1aVDNJZHZOMFA4Y2hOdUlmUFRHWDJmSlo2NQpxcUUrelRoU3hIeXFTOTVoczhsd1lRRUhGQlVsalRnMCtQZThXL0hOSXZBOU9TYWw1U3UvdlhydmcxN04xdHVyCk5XcWRyZU5OVm1ubXMvTFJodmthWTBGblRvbFNBRkNXWS9GSDY5ZzRPcThiMHVyK3JVMHZOZFFXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0Ktls.key: ""tls.crt: ""
caBundle
の値が、Secret
のca.crt
の値と同一になっているはずです。
kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io webhook2 -o yaml | grep caBundle
そして、しばらくすると、Kubernetes APIサーバーはその新しいcaBundle
値を読み取り、それを使用してWebhookサーバーへのTLS接続を検証します。
このSecret
ベースの注入メカニズムは、前述のCertificate
ベースのメカニズムとは独立して動作できます。cert-manager CRDがインストールされていなくても、またcert-manager CRDと関連付けられたWebhookサーバーがまだ構成されていなくても動作します。
注: このため、cert-managerは、独自のWebhookサーバーをブートストラップするためにSecret
ベースの注入メカニズムを使用します。cert-managerのWebhookサーバーは、独自の秘密鍵と自己署名証明書を生成し、起動時にSecret
に配置します。
Kubernetes APIサーバーCAを注入する
以下は、cert-manager.io/inject-apiserver-ca: "true"
アノテーションで構成されたValidatingWebhookConfiguration
の別の例です。これにより、cainjector
は、Kubernetes APIサーバーで使用されているのと同じCA証明書を使用して、caBundle
フィールドを設定します。
注: この例ではWebhookサーバーはデプロイせず、部分的なWebhook構成のみをデプロイしますが、cainjector
の動作を理解するのに十分なはずです。
apiVersion: v1kind: Namespacemetadata:name: example3---apiVersion: admissionregistration.k8s.io/v1kind: ValidatingWebhookConfigurationmetadata:name: webhook3annotations:cert-manager.io/inject-apiserver-ca: "true"webhooks:- name: webhook3.example.comadmissionReviewVersions:- v1clientConfig:service:name: webhook3namespace: example3path: /validateport: 443sideEffects: None
caBundle
の値が、KubeConfig
ファイルで使用されているCAと同一になっているはずです。
kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io webhook3 -o yaml | grep caBundlekubectl config view --minify --raw | grep certificate-authority-data
そして、しばらくすると、Kubernetes APIサーバーはその新しいcaBundle
値を読み取り、それを使用してWebhookサーバーへのTLS接続を検証します。
注: この場合、WebhookがKubernetesクラスターCAによって署名されたTLS証明書を提供するように構成されていることを確認する必要があります。このメカニズムの欠点は、KubernetesクラスターCAの秘密鍵へのアクセスが必要になることと、Webhook証明書を手動でローテーションする必要があることです。