CA 注射器
cainjector
帮助配置以下内容的 CA 证书:变动式 Webhook、验证式 Webhook 转换 Webhook 和 API 服务
特别是,cainjector
会填充四种 API 类型的 caBundle
字段:ValidatingWebhookConfiguration
、MutatingWebhookConfiguration
CustomResourceDefinition
和 APIService
。前三种资源类型用于配置 Kubernetes API 服务器如何连接到 Webhook。这个 caBundle
数据由 Kubernetes API 服务器加载,并用于验证 Webhook API 服务器的服务证书。 APIService
用于表示一个 扩展 API 服务器。 caBundle
of APIService
可以填充 CA 证书,该证书可用于验证 API 服务器的服务证书。
我们将把这四种 API 类型称为可注入 资源。
可注入 资源必须具有以下注释之一:cert-manager.io/inject-ca-from
、cert-manager.io/inject-ca-from-secret
或 cert-manager.io/inject-apiserver-ca
,具体取决于注入源。这将在下面详细说明。
cainjector
从三个源之一复制 CA 数据:Kubernetes Secret
、cert-manager Certificate
或来自 Kubernetes API 服务器 CA 证书(cainjector
本身用于验证其与 Kubernetes API 服务器的 TLS 连接)。
如果源是 Kubernetes Secret
,那么该资源还必须具有一个 cert-manager.io/allow-direct-injection: "true"
注释。三种源类型将在下面详细说明。
示例
以下是一些演示如何使用三种 cainjector
源的示例。在每种情况下,我们都使用 ValidatingWebhookConfiguration
作为可注入的,但你可以用 MutatingWebhookConfiguration
或 CustomResourceDefinition
定义代替。
从证书资源注入 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 使用 Secret
注入机制来引导它自己的 Webhook 服务器。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 证书。