最新:获取项目更新,请访问TwitterMastodon

CA 注射器

cainjector 帮助配置以下内容的 CA 证书:变动式 Webhook验证式 Webhook 转换 WebhookAPI 服务

特别是,cainjector 会填充四种 API 类型的 caBundle 字段:ValidatingWebhookConfigurationMutatingWebhookConfiguration CustomResourceDefinitionAPIService。前三种资源类型用于配置 Kubernetes API 服务器如何连接到 Webhook。这个 caBundle 数据由 Kubernetes API 服务器加载,并用于验证 Webhook API 服务器的服务证书。 APIService 用于表示一个 扩展 API 服务器caBundle of APIService 可以填充 CA 证书,该证书可用于验证 API 服务器的服务证书。

我们将把这四种 API 类型称为可注入 资源。

可注入 资源必须具有以下注释之一:cert-manager.io/inject-ca-fromcert-manager.io/inject-ca-from-secretcert-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 作为可注入的,但你可以用 MutatingWebhookConfigurationCustomResourceDefinition 定义代替。

从证书资源注入 CA 数据

以下是一个使用注释 cert-manager.io/inject-ca-from 配置的 ValidatingWebhookConfiguration 示例,它将使 cainjector 使用来自 cert-manager Certificate 的 CA 数据填充 caBundle 字段。

注意:此示例不部署 Webhook 服务器,它只部署部分 Webhook 配置,但它应该足以帮助您理解 cainjector 的作用

apiVersion: v1
kind: Namespace
metadata:
name: example1
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: webhook1
annotations:
cert-manager.io/inject-ca-from: example1/webhook1-certificate
webhooks:
- name: webhook1.example.com
admissionReviewVersions:
- v1
clientConfig:
service:
name: webhook1
namespace: example1
path: /validate
port: 443
sideEffects: None
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: webhook1-certificate
namespace: example1
spec:
secretName: webhook1-certificate
dnsNames:
- webhook1.example1
issuerRef:
name: selfsigned
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: selfsigned
namespace: example1
spec:
selfSigned: {}

您应该会发现 caBundle 值现在与 CertificateSecret 中的 CA 值相同

kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io webhook1 -o yaml | grep caBundle
kubectl -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: v1
kind: Namespace
metadata:
name: example2
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: webhook2
annotations:
cert-manager.io/inject-ca-from-secret: example2/example-ca
webhooks:
- name: webhook2.example.com
admissionReviewVersions:
- v1
clientConfig:
service:
name: webhook2
namespace: example2
path: /validate
port: 443
sideEffects: None
---
apiVersion: v1
kind: Secret
metadata:
name: example-ca
namespace: example2
annotations:
cert-manager.io/allow-direct-injection: "true"
type: kubernetes.io/tls
data:
ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM5akNDQWQ2Z0F3SUJBZ0lRTkdJZ24yM3BQYVpNbk9MUjJnVmZHakFOQmdrcWhraUc5dzBCQVFzRkFEQVYKTVJNd0VRWURWUVFERXdwRmVHRnRjR3hsSUVOQk1CNFhEVEl3TURreU5ERTFOREEwTVZvWERUSXdNVEl5TXpFMQpOREEwTVZvd0ZURVRNQkVHQTFVRUF4TUtSWGhoYlhCc1pTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnRVBBRENDQVFvQ2dnRUJBS2F3RzVoMzlreHdyNEl0WCtHaDNYVWQrdTVJc2ZlSFdoTTc4TTRQTmZFeXhQMXoKRmNLN1d0MHJFMkwwNUppYmQ4ZjNpb3k5OXNnQ3I4OEw2SWxYZTB0RnkzNysxenJ4TFluR2hDQnZzZjltd0hLbgpIVTEvNERwQjROZkhPbFllNE9tbHVoNE9HdmZINU1EbDh5OWZGMjhXRXVBQ2dwdmpCUWxvRDNlVjJ5UmJvQ2kyCmtSTDJWYTFZL0FQZEpWK21VYkFvZmg0bllmUmNLRTJsSUg0RG5ZdXFPU3JaaituZUQ2M2RTSktxcHQ5K2luN2YKNHljZ2pQYU93MmdyKzhLK291QTlSQTV1VDI3SVNJcUJDcEV6elRqbVBUUWNvUTYxZGF0aDZkc1lsTEU4aWZWUwp4RWZuVEdQKy94M0FXQXR4eU5lanVuZGFXbVNFL3h5OHh0K0FxblVDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvCkJBUURBZ0trTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkowNkc5eEc2V1VBTHB6T3JYaHAKV2dsTm5qMkFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUI3ZG9CZnBLR3o4VlRQSnc0YXhpdisybzJpMHE1SQpSRzU2UE81WnhKQktZQlRROElHQmFOSm1yeGtmNTJCV0ttUGp4cXlNSGRwWjVBU00zOUJkZVUzRGtEWHp4RkgwCjM5RU12UnhIUERyMGQ4cTFFbndQT0xZY1hzNjJhYjdidE11cTJUMFNNZzRYMkY5VmNKTW5YdjlrNnA0VGZNR3MKVThCQnJhVGhUZm53ejBsWXMyblFjdzNmZjZ1bG1wWlk4K3BTak1aVDNJZHZOMFA4Y2hOdUlmUFRHWDJmSlo2NQpxcUUrelRoU3hIeXFTOTVoczhsd1lRRUhGQlVsalRnMCtQZThXL0hOSXZBOU9TYWw1U3UvdlhydmcxN04xdHVyCk5XcWRyZU5OVm1ubXMvTFJodmthWTBGblRvbFNBRkNXWS9GSDY5ZzRPcThiMHVyK3JVMHZOZFFXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
tls.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: v1
kind: Namespace
metadata:
name: example3
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: webhook3
annotations:
cert-manager.io/inject-apiserver-ca: "true"
webhooks:
- name: webhook3.example.com
admissionReviewVersions:
- v1
clientConfig:
service:
name: webhook3
namespace: example3
path: /validate
port: 443
sideEffects: None

您应该会发现 caBundle 值现在与 KubeConfig 文件中使用的 CA 相同

kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io webhook3 -o yaml | grep caBundle
kubectl config view --minify --raw | grep certificate-authority-data

并且在很短的时间内,Kubernetes API 服务器将读取新的 caBundle 值,并用它来验证与 Webhook 服务器的 TLS 连接。

注意:在这种情况下,您必须确保您的 Webhook 配置为服务一个由 Kubernetes 集群 CA 签名的 TLS 证书。此机制的缺点是:您将需要访问 Kubernetes 集群 CA 的私钥,并且您需要手动轮换 Webhook 证书。