如何在Terraform CDK中为Helm Chart与Kubernetes资源添加依赖
如何确保Terraform在Helm Chart安装完成后再创建CRD实例?
我正在安装一个会创建CRD的Helm Chart,之后想要实例化该Chart中定义的CRD。请问如何正确声明两者间的依赖关系,确保Terraform不会在Helm Chart安装完成前尝试创建该CRD实例?希望doppler-kubernetes-operator这个Kubernetes Manifest资源仅在Helm Chart安装完成后再创建,相关代码如下:
new helm.Release(this, "doppler-kubernetes-operator-helm-chart", { chart: "doppler-kubernetes-operator", name: "doppler", repository: "https://helm.doppler.com", version: "1.2.0" }) const dopplerOperatingSystemNamespace = "doppler-operator-system"; // 创建CRD引用的Secret const dopplerApiServerProjectServiceTokenSecret = new kubernetes.Secret(this, "doppler-api-server-project-service-token", { metadata: { name: "doppler-api-server-project-service-token", namespace: dopplerOperatingSystemNamespace }, data: { "serviceToken": "<some secret>" } }) // 创建CRD实例 <------------- 如何让它依赖Helm Chart? new kubernetes.Manifest(this, "doppler-kubernetes-operator", { manifest: { apiVersion: "secrets.doppler.com/v1alpha1", kind: "DopplerSecret", metadata: { name: "doppler-secret-default", namespace: dopplerOperatingSystemNamespace, }, spec: { tokenSecret: { name: dopplerApiServerProjectServiceTokenSecret.metadata.name }, managedSecret: { name: "doppler-api-server-managed-secret", namespace: "default" } } } })
解决方法
在Terraform CDK中,需要显式声明资源间的依赖关系——因为Terraform默认无法自动感知「Helm创建CRD后才能创建对应CR实例」的逻辑。具体操作步骤如下:
保存Helm Release实例到变量
先将Helm Chart的Release对象存入变量,方便后续引用依赖:const dopplerHelmRelease = new helm.Release(this, "doppler-kubernetes-operator-helm-chart", { chart: "doppler-kubernetes-operator", name: "doppler", repository: "https://helm.doppler.com", version: "1.2.0" });给CR实例添加Helm依赖
针对doppler-kubernetes-operator这个Manifest资源,调用addDependency()方法,指定它依赖上面的Helm Release实例。这样就能确保只有Helm Chart安装完成(CRD已被Kubernetes API Server注册)后,才会创建这个CR实例:const dopplerSecretManifest = new kubernetes.Manifest(this, "doppler-kubernetes-operator", { manifest: { apiVersion: "secrets.doppler.com/v1alpha1", kind: "DopplerSecret", metadata: { name: "doppler-secret-default", namespace: dopplerOperatingSystemNamespace, }, spec: { tokenSecret: { name: dopplerApiServerProjectServiceTokenSecret.metadata.name }, managedSecret: { name: "doppler-api-server-managed-secret", namespace: "default" } } } }); // 声明依赖:CR实例必须等待Helm Chart安装完成后再创建 dopplerSecretManifest.addDependency(dopplerHelmRelease);可选:给Secret添加依赖(若namespace由Helm创建)
如果doppler-operator-system这个namespace是由Helm Chart自动创建的,那么你的Secret资源也需要依赖Helm Release,避免出现「Secret创建时namespace还不存在」的错误:dopplerApiServerProjectServiceTokenSecret.addDependency(dopplerHelmRelease);
内容的提问来源于stack exchange,提问作者Paymahn Moghadasian
相关产品推荐
相关产品推荐

