CDK 为地表解析器
这个 CdkTfResolver 能够解决任何 TerraformOutput
由您的 CDKTF 应用程序定义。 在这个例子中,我们创建一个S3 Bucket 与 CDKTF 连接,并传递其(所生成的部署时间)
名称为 Kubernetes 的环境变量 CronJob 资源.
import * as tf from "cdktf";
import * as aws from "@cdktf/provider-aws";
import * as k8s from 'cdk8s';
import * as kplus from 'cdk8s-plus-26';
import { CdkTfResolver } from '@cdk8s/cdktf-resolver';
const awsApp = new tf.App();
const stack = new tf.TerraformStack(awsApp, 'aws');
const k8sApp = new k8s.App({ resolvers: [new resolver.CdktfResolver({ app: awsApp })] });
const manifest = new k8s.Chart(k8sApp, 'Manifest', { resolver });
const bucket = new aws.s3Bucket.S3Bucket(stack, 'Bucket');
const bucketName = new tf.TerraformOutput(constrcut, 'BucketName', {
value: bucket.bucket,
});
new kplus.CronJob(manifest, 'CronJob', {
schedule: k8s.Cron.daily(),
containers: [{
image: 'job',
envVariables: {
// directly passing the value of the `TerraformOutput` containing
// the deploy time bucket name
BUCKET_NAME: kplus.EnvValue.fromValue(bucketName.value),
}
}]
});
awsApp.synth();
k8sApp.synth();
在cdk8s合成过程中,自定义解析器会检测到 bucketName.value 这不是一个具体的价值,
但它是一个价值 TerraformOutput。然后将进行 cdktf 要获取 CLI 命令
实际价值来自您账户中部署的基础设施。 这意味着,按照顺序
页:1 cdk8s synth 要成功,必须执行 之后 cDKTF资源已经部署.
因此,你的部署工作流程(概念上)应该是:
cdktf deploycdk8s synth
注意
CdkTfResolver实值 仅限 能够获取具有TerraformOutput为他们定义.
权限
自运行以来 cdk8s synth 现在需要读取三角形输出,它必须有这样做的权限.
如果使用远程状态文件,这意味着为可以访问的账户提供一套证书
到州所贮. 这取决于云提供商的不同, 但在大多数情况下,将涉及给予
读取 blob 存储设备上的权限(例如 S3 桶).
注意 cdk8 所需的权限比通常所需的权限要小得多
部署 CDKTF 应用程序。 因此建议不重复使用同样的一套全权证书,
转而建立一个缩小范围 ReadOnly 用于 cdk8s 解析器的角色.
解析器将执行的命令如下:
交叉仓库工作流程
正如我们所看到的,你的 cdk8s 应用程序需要访问您云应用程序中定义的对象。 如果两个申请
定义在同一文件中,这是微不足道的实现。 如果放在不同的文件里 很简单 import 说明就够了.
然而,如果这些应用程序在两个单独的储存库中管理,怎么办? 这使得它有点狡猾,但仍有可能.
在这种情况下, cdktf.ts 在 CDKTF 应用程序中,存储在一个专用仓库中.
import * as tf from "cdktf";
import * as aws from "@cdktf/provider-aws";
import { CdkTfResolver } from '@cdk8s/cdktf-resolver';
const awsApp = new tf.App();
const stack = new tf.TerraformStack(awsApp, 'aws');
const bucket = new aws.s3Bucket.S3Bucket(stack, 'Bucket');
const bucketName = new tf.TerraformOutput(constrcut, 'BucketName', {
value: bucket.bucket,
});
awsApp.synth();
为了 cdk8s 应用程序具有交叉寄存器访问, CDKTF 对象实例
我们想要曝光的,需要通过一个软件包存储库提供。 要做到这一点,分手
CDKTF 应用到以下文件中 :
app.ts
import * as tf from "cdktf";
import * as aws from "@cdktf/provider-aws";
import { CdkTfResolver } from '@cdk8s/cdktf-resolver';
// export the app so we can pass it to the cdk8s resolver
export const awsApp = new tf.App();
const stack = new tf.TerraformStack(awsApp, 'aws');
const bucket = new aws.s3Bucket.S3Bucket(stack, 'Bucket');
// export the thing we want to have available for cdk8s applications
export const bucketName = new tf.TerraformOutput(constrcut, 'BucketName', {
value: bucket.bucket,
});
// note that we don't call awsApp.synth here
main.ts
import { awsApp } from './app.ts'
awsApp.synth();
现在,发表 app.ts 文件到软件包管理器,以便您 cdk8s 应用程序可以安装并导入.
这种方法可能有些反常, 因为通常我们只公布课程 给软件包管理者,
非实例。 实际上,这些类型的应用程序引入了一个新的使用案例,需要共享实例.
从概念上来说,这和写作状态没什么不同* 联合国 它允许我们留下
在我们的编程语言的边界, 和它的打字保证.
* 联合国 事实上,我们只是发布指令 获取状态,而不是国家本身.
假设 app.ts 发表于 my-cdktf-app 包,我们 cdk8s 应用程序现在看起来是这样:
import * as k8s from 'cdk8s';
import * as kplus from 'cdk8s-plus-27';
// import the desired instance from the CDKTF app.
import { bucketName, awsApp } from 'my-cdktf-app';
import { CdkTfResolver } from '@cdk8s/cdktf-resolver';
const k8sApp = new k8s.App({ resolvers: [new resolver.CdktfResolver({ app: awsApp })] });
const manifest = new k8s.Chart(k8sApp, 'Manifest');
new kplus.CronJob(manifest, 'CronJob', {
schedule: k8s.Cron.daily(),
containers: [{
image: 'job',
envVariables: {
// directly passing the value of the `TerraformOutput` containing
// the deploy time bucket name
BUCKET_NAME: kplus.EnvValue.fromValue(bucketName.value),
}
}]
});
k8sApp.synth();