部署与测试
在测试转换之前,我们需要在 CRD 中启用它:
Kubebuilder 会在 config 目录下生成 Kubernetes 清单,默认禁用 webhook 相关内容。要启用它们,我们需要:
-
在
config/crd/kustomization.yaml文件中启用patches/webhook_in_<kind>.yaml与patches/cainjection_in_<kind>.yaml -
在
config/default/kustomization.yaml的bases段落下启用../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 依然会持续进行调谐。
