首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于GCP的Pulumi -如何使用Docker容器实例创建托管实例组

关于GCP的Pulumi -如何使用Docker容器实例创建托管实例组
EN

Stack Overflow用户
提问于 2022-02-24 05:56:09
回答 1查看 360关注 0票数 1

我一直试图在GCP上创建一个托管实例组,该组由承载自定义码头映像的实例组成。然而,我很难弄清楚如何用普米来完成这个任务。

读取Google的GCP文档可以通过实例模板部署托管实例组中承载坞容器的实例。

实际上,在gcloud中,这看起来是:

代码语言:javascript
复制
gcloud compute instance-templates create-with-container TEMPLATE_NAME --container-image DOCKER_IMAGE

然而,在阅读Pulumi的实例模板文档时,还不清楚如何创建与上面的命令相同的实例模板。

在Pulumi中是否有可能创建一个托管实例组,其中实例承载一个自定义的码头映像,或者我是否必须手动创建实例模板,并在我的Pulumi脚本中引用该模板?

EN

回答 1

Stack Overflow用户

发布于 2022-02-25 08:06:27

下面是一种同时使用古云普米的混合方法。

高级别的

  1. 创建一个码头集装箱并上传到Google容器注册表
  2. 使用实例模板创建古云
  3. 创建托管实例组,从Pulumi脚本中引用实例模板

#1创建码头容器

使用CloudBuild检测Git中的更改,创建一个停靠容器,并将其上传到。

在我的repo中,我有一个Dockerfile文件,其中有关于如何构建将用于实例的容器的说明。我使用监督员d启动和监视我的应用程序。

以下是它的外观:

代码语言:javascript
复制
# my-app-repo/Dockerfile

FROM ubuntu:22.04

RUN apt update
RUN apt -y install software-properties-common

RUN apt install -y supervisor
COPY supervisord.conf /etc/supervisord.conf
RUN chmod 0700 /etc/supervisord.conf

COPY ./my-app /home/my-app
RUN chmod u+x /home/my-app

EXPOSE 443/tcp # HTTPS
EXPOSE 9001/tcp # supervisord support

CMD ["supervisord", "-c", "/etc/supervisord.conf"]

第二部分是构建docker容器并上传到。我是通过CloudBuild做的。下面是相应的Pulumi代码(构建一个Golang应用程序):

注意:首先要确保您已经通过GCP网站的https://console.cloud.google.com/cloud-build/triggers连接了回购程序。

代码语言:javascript
复制
const myImageName = pulumi.interpolate`gcr.io/${project}/my-image-name`
const buildTrigger = new gcp.cloudbuild.Trigger("my-app-build-trigger", {
  name: "my-app",
  description: "Builds My App image",
  build: {
    steps: [
      {
        name: "golang",
        id: "build-server",
        entrypoint: "bash",
        timeout: "300s",
        args: ["-c", "go build"],
      },
      {
        name: "gcr.io/cloud-builders/docker",
        id: "build-docker-image",
        args: [
          "build",
          "-t", pulumi.interpolate`${myImageName}:$BRANCH_NAME-$REVISION_ID`,
          "-t", pulumi.interpolate`${myImageName}:latest`,
          '.',
        ],
      },
    ],
    images: [myImageName]
  },
  github: {
    name: "my-app-repo",
    owner: "MyGithubUsername",
    push: {
      branch: "^main$"
    }
  },
});

#2创建实例模板

由于我还不知道如何通过Pulumi轻松地创建实例模板,所以我决定通过gcloud命令行工具使用Google。

代码语言:javascript
复制
gcloud compute instance-templates create-with-container my-template-name-01 \
--region us-central1 \
--container-image=gcr.io/my-project/my-image-name:main-e286d94217719c3be79aac1cbd39c0a629b84de3 \
--machine-type=e2-micro \
--network=my-network-name-59c9c08 \
--tags=my-tag-name \
--service-account=my-service-account@my-project.iam.gserviceaccount.com

上面的值(容器、网络名称等)我只是通过在GCP网站上浏览我的项目得到的。

#3创建托管实例组

创建了实例模板之后,现在可以在Pulumi脚本中引用该模板。

代码语言:javascript
复制
const myHealthCheck = new gcp.compute.HealthCheck("my-app-health-check", {
  checkIntervalSec: 5,
  timeoutSec: 5,
  healthyThreshold: 2,
  unhealthyThreshold: 5,
  httpHealthCheck: {
    requestPath: "/health-check",
    port: 80,
  },
});

const instanceGroupManager = new gcp.compute.InstanceGroupManager("my-app-instance-group", {
  baseInstanceName: "my-app-name-prefix",
  zone: hostZone,
  targetSize: 2,
  versions: [
    {
      name: "my-app",
      instanceTemplate: "https://www.googleapis.com/compute/v1/projects/my-project/global/instanceTemplates/my-template-name-01",
    },
  ],
  autoHealingPolicies: {
    healthCheck: myHealthCheck.id,
    initialDelaySec: 300,
  },
});

为了完整起见,我还包括了Pulumi脚本的另一部分,它创建了一个后端服务,并通过InstanceGroupManager调用将其连接到上面创建的实例组。请注意,本例中的负载均衡器使用的是TCP而不是HTTPS (我的应用程序正在处理SSL连接,因此使用了TCP网络负载均衡器)。

代码语言:javascript
复制
const backendService = new gcp.compute.RegionBackendService("my-app-backend-service", {
  region: hostRegion,
  enableCdn: false,
  protocol: "TCP",
  backends: [{
    group: instanceGroupManager.instanceGroup,
  }],
  healthChecks: defaultHttpHealthCheck.id,
  loadBalancingScheme: "EXTERNAL",
});

const myForwardingRule = new gcp.compute.ForwardingRule("my-app-forwarding-rule", {
  description: "HTTPS forwarding rule",
  region: hostRegion,
  ipAddress: myIPAddress.address,
  backendService: backendService.id,
  portRange: "443",
});

注意:理想的情况下,第2步也应该和Pulumi一起完成,但是我还没有完成这个部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71247722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档