使用Golang版CDKTF在GCP部署容器化前后端应用的分步操作清单
基于Golang CDKTF的GCP Kubernetes集群部署分步清单
1. 前置准备
- 安装Golang(1.18+)、CDKTF、gcloud CLI工具
- 配置GCP账号:执行
gcloud auth login完成登录,再用gcloud config set project YOUR_PROJECT_ID设置默认项目(替换YOUR_PROJECT_ID为你的GCP项目ID) - 启用GCP必需API:Container Engine API、Compute Engine API,可通过
gcloud services enable container.googleapis.com compute.googleapis.com命令完成 - 准备好前后端Docker镜像,并推送到GCP Artifact Registry或GCR,比如镜像地址为
gcr.io/YOUR_PROJECT_ID/frontend:v1、gcr.io/YOUR_PROJECT_ID/backend:v1
2. 初始化CDKTF Golang项目
- 创建项目目录并进入:
mkdir gcp-k8s-cdktf && cd gcp-k8s-cdktf - 初始化CDKTF Golang模板项目:
cdktf init --template=gcp-go --local - 安装依赖:在自动生成的
go.mod文件中确保包含以下依赖,然后执行go mod tidyrequire ( github.com/hashicorp/terraform-cdk-go/cdktf v0.20.0 github.com/hashicorp/terraform-cdk-go/cdktf/provider/google v8.1.0 )
3. 编写CDKTF基础设施代码
替换项目中的main.go为以下代码(注意替换所有占位符):
package main import ( "github.com/hashicorp/terraform-cdk-go/cdktf" "github.com/hashicorp/terraform-cdk-go/cdktf/provider/google" ) func main() { app := cdktf.NewApp(nil) stack := cdktf.NewTerraformStack(app, "gcp-k8s-stack") // 初始化GCP Provider google.NewGoogleProvider(stack, "google", &google.GoogleProviderConfig{ Project: cdktf.String("YOUR_PROJECT_ID"), Region: cdktf.String("us-central1"), // 按需修改区域 Zone: cdktf.String("us-central1-a"), }) // 创建GKE集群 cluster := google.NewContainerCluster(stack, "gke-cluster", &google.ContainerClusterConfig{ Name: cdktf.String("gke-cluster"), Location: cdktf.String("us-central1-a"), InitialNodeCount: cdktf.Number(2), NodeConfig: &google.ContainerClusterNodeConfig{ MachineType: cdktf.String("e2-medium"), // 按需调整机器规格 OauthScopes: []*string{ cdktf.String("https://www.googleapis.com/auth/cloud-platform"), }, }, }) // 生成Kubeconfig并输出 kubeconfigOutput := cdktf.NewTerraformOutput(stack, "kubeconfig", &cdktf.TerraformOutputConfig{ Value: cdktf.String(`apiVersion: v1 clusters: - cluster: certificate-authority-data: ` + cluster.MasterAuth().ClusterCaCertificate() + ` server: https://` + cluster.Endpoint() + ` name: gke_` + cluster.Project() + `_` + cluster.Location() + `_` + cluster.Name() + ` contexts: - context: cluster: gke_` + cluster.Project() + `_` + cluster.Location() + `_` + cluster.Name() + ` user: gke_` + cluster.Project() + `_` + cluster.Location() + `_` + cluster.Name() + ` name: gke_` + cluster.Project() + `_` + cluster.Location() + `_` + cluster.Name() + ` current-context: gke_` + cluster.Project() + `_` + cluster.Location() + `_` + cluster.Name() + ` kind: Config preferences: {} users: - name: gke_` + cluster.Project() + `_` + cluster.Location() + `_` + cluster.Name() + ` user: auth-provider: config: cmd-args: config config-helper --format=json cmd-path: gcloud expiry-key: '{.credential.token_expiry}' token-key: '{.credential.access_token}' name: gcp `), }) // 初始化Kubernetes Provider k8sProvider := google.NewKubernetesProvider(stack, "kubernetes", &google.KubernetesProviderConfig{ Host: cluster.Endpoint(), ClusterCaCertificate: cluster.MasterAuth().ClusterCaCertificate(), Exec: &google.KubernetesProviderExec{ ApiVersion: cdktf.String("client.authentication.k8s.io/v1beta1"), Command: cdktf.String("gcloud"), Args: []*string{ cdktf.String("config"), cdktf.String("config-helper"), cdktf.String("--format=json"), }, }, }) // 部署后端应用:Deployment + ClusterIP Service google.NewKubernetesDeployment(stack, "backend-deployment", &google.KubernetesDeploymentConfig{ Metadata: &google.KubernetesDeploymentMetadata{ Name: cdktf.String("backend"), }, Spec: &google.KubernetesDeploymentSpec{ Replicas: cdktf.Number(2), Selector: &google.KubernetesDeploymentSpecSelector{ MatchLabels: map[string]*string{ "app": cdktf.String("backend"), }, }, Template: &google.KubernetesDeploymentSpecTemplate{ Metadata: &google.KubernetesDeploymentSpecTemplateMetadata{ Labels: map[string]*string{ "app": cdktf.String("backend"), }, }, Spec: &google.KubernetesDeploymentSpecTemplateSpec{ Containers: []*google.KubernetesDeploymentSpecTemplateSpecContainers{ { Name: cdktf.String("backend"), Image: cdktf.String("gcr.io/YOUR_PROJECT_ID/backend:v1"), // 替换为你的后端镜像地址 Ports: []*google.KubernetesDeploymentSpecTemplateSpecContainersPorts{ { ContainerPort: cdktf.Number(8080), }, }, }, }, }, }, }, }, cdktf.Provider(k8sProvider)) google.NewKubernetesService(stack, "backend-service", &google.KubernetesServiceConfig{ Metadata: &google.KubernetesServiceMetadata{ Name: cdktf.String("backend"), }, Spec: &google.KubernetesServiceSpec{ Selector: map[string]*string{ "app": cdktf.String("backend"), }, Ports: []*google.KubernetesServiceSpecPorts{ { Port: cdktf.Number(80), TargetPort: cdktf.Number(8080), }, }, Type: cdktf.String("ClusterIP"), }, }, cdktf.Provider(k8sProvider)) // 部署前端应用:Deployment + LoadBalancer Service google.NewKubernetesDeployment(stack, "frontend-deployment", &google.KubernetesDeploymentConfig{ Metadata: &google.KubernetesDeploymentMetadata{ Name: cdktf.String("frontend"), }, Spec: &google.KubernetesDeploymentSpec{ Replicas: cdktf.Number(2), Selector: &google.KubernetesDeploymentSpecSelector{ MatchLabels: map[string]*string{ "app": cdktf.String("frontend"), }, }, Template: &google.KubernetesDeploymentSpecTemplate{ Metadata: &google.KubernetesDeploymentSpecTemplateMetadata{ Labels: map[string]*string{ "app": cdktf.String("frontend"), }, }, Spec: &google.KubernetesDeploymentSpecTemplateSpec{ Containers: []*google.KubernetesDeploymentSpecTemplateSpecContainers{ { Name: cdktf.String("frontend"), Image: cdktf.String("gcr.io/YOUR_PROJECT_ID/frontend:v1"), // 替换为你的前端镜像地址 Ports: []*google.KubernetesDeploymentSpecTemplateSpecContainersPorts{ { ContainerPort: cdktf.Number(80), }, }, Env: []*google.KubernetesDeploymentSpecTemplateSpecContainersEnv{ { Name: cdktf.String("BACKEND_URL"), Value: cdktf.String("http://backend.default.svc.cluster.local"), }, }, }, }, }, }, }, }, cdktf.Provider(k8sProvider)) frontendService := google.NewKubernetesService(stack, "frontend-service", &google.KubernetesServiceConfig{ Metadata: &google.KubernetesServiceMetadata{ Name: cdktf.String("frontend"), }, Spec: &google.KubernetesServiceSpec{ Selector: map[string]*string{ "app": cdktf.String("frontend"), }, Ports: []*google.KubernetesServiceSpecPorts{ { Port: cdktf.Number(80), TargetPort: cdktf.Number(80), }, }, Type: cdktf.String("LoadBalancer"), }, }, cdktf.Provider(k8sProvider)) // 输出前端服务对外IP cdktf.NewTerraformOutput(stack, "frontend-service-ip", &cdktf.TerraformOutputConfig{ Value: frontendService.Status().LoadBalancer().Ingress()[0].Ip(), }) app.Synth() }
4. 执行部署
- 生成Terraform配置文件:
cdktf synth - 预览部署计划:
cdktf plan,确认资源配置无误 - 执行部署:
cdktf deploy,终端提示确认时输入yes
5. 验证部署结果
- 导出Kubeconfig:
cdktf output kubeconfig > kubeconfig.yaml - 配置kubectl:
export KUBECONFIG=./kubeconfig.yaml - 检查Pod状态:
kubectl get pods,确保所有Pod处于Running状态 - 获取前端服务IP:
cdktf output frontend-service-ip,访问该IP验证前端页面及后端接口连通性
6. 后续操作
- 更新应用:修改代码中镜像版本,重新执行
cdktf deploy即可滚动更新 - 集群扩容:调整
ContainerCluster的InitialNodeCount或新增Node Pool - 清理资源:执行
cdktf destroy可删除所有创建的GCP和K8s资源
内容的提问来源于stack exchange,提问作者Iferrum
相关产品推荐
相关产品推荐

