You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 tidy
    require (
        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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:35:07