部署与测试

在测试转换之前,我们需要在 CRD 中启用它:

Kubebuilder 会在 config 目录下生成 Kubernetes 清单,默认禁用 webhook 相关内容。要启用它们,我们需要:

  • config/crd/kustomization.yaml 文件中启用 patches/webhook_in_<kind>.yamlpatches/cainjection_in_<kind>.yaml

  • config/default/kustomization.yamlbases 段落下启用 ../certmanager../webhook 目录

  • config/default/kustomization.yaml 文件中启用 CERTMANAGER 段落下的全部变量

此外,如果 Makefile 中存在 CRD_OPTIONS 变量,我们需要将其设置为仅 "crd",去掉 trivialVersions 选项(这确保我们确实为每个版本生成校验,而不是告诉 Kubernetes 它们相同):

CRD_OPTIONS ?= "crd"

现在代码修改与清单都已就位,让我们把它部署到集群并进行测试。

除非你有其他证书管理方案,否则你需要安装 cert-manager(版本 0.9.0+)。Kubebuilder 团队已经用版本 0.9.0-alpha.0 验证过本教程中的步骤。

当证书相关内容准备就绪后,我们可以像平常一样运行 make install deploy,将所有组件(CRD、controller-manager 部署)部署到集群。

测试

当所有组件在集群上运行且已启用转换后,我们可以通过请求不同版本来测试转换。

我们基于 v1 版本创建一个 v2 版本(放在 config/samples 下)

apiVersion: batch.tutorial.kubebuilder.io/v2
kind: CronJob
metadata:
  labels:
    app.kubernetes.io/name: project
    app.kubernetes.io/managed-by: kustomize
  name: cronjob-sample
spec:
  schedule:
    minute: "*/1"
  startingDeadlineSeconds: 60
  concurrencyPolicy: Allow # explicitly specify, but Allow is also default.
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

然后在集群中创建它:

kubectl apply -f config/samples/batch_v2_cronjob.yaml

如果一切正确,应能创建成功,并且我们应当能使用 v2 资源来获取它:

kubectl get cronjobs.v2.batch.tutorial.kubebuilder.io -o yaml
apiVersion: batch.tutorial.kubebuilder.io/v2
kind: CronJob
metadata:
  labels:
    app.kubernetes.io/name: project
    app.kubernetes.io/managed-by: kustomize
  name: cronjob-sample
spec:
  schedule:
    minute: "*/1"
  startingDeadlineSeconds: 60
  concurrencyPolicy: Allow # explicitly specify, but Allow is also default.
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

以及 v1 资源:

kubectl get cronjobs.v1.batch.tutorial.kubebuilder.io -o yaml
apiVersion: batch.tutorial.kubebuilder.io/v1
kind: CronJob
metadata:
  labels:
    app.kubernetes.io/name: project
    app.kubernetes.io/managed-by: kustomize
  name: cronjob-sample
spec:
  schedule: "*/1 * * * *"
  startingDeadlineSeconds: 60
  concurrencyPolicy: Allow # explicitly specify, but Allow is also default.
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
  

两者都应被正确填充,并分别与我们的 v2 与 v1 示例等价。注意它们的 API 版本不同。

最后,稍等片刻,你会注意到即便我们的控制器是基于 v1 API 版本编写的,CronJob 依然会持续进行调谐。

故障排查

排查步骤