我一直试图在GCP上创建一个托管实例组,该组由承载自定义码头映像的实例组成。然而,我很难弄清楚如何用普米来完成这个任务。
读取Google的GCP文档可以通过实例模板部署托管实例组中承载坞容器的实例。
实际上,在gcloud中,这看起来是:
gcloud compute instance-templates create-with-container TEMPLATE_NAME --container-image DOCKER_IMAGE然而,在阅读Pulumi的实例模板文档时,还不清楚如何创建与上面的命令相同的实例模板。
在Pulumi中是否有可能创建一个托管实例组,其中实例承载一个自定义的码头映像,或者我是否必须手动创建实例模板,并在我的Pulumi脚本中引用该模板?
发布于 2022-02-25 08:06:27
高级别的:
#1创建码头容器
使用CloudBuild检测Git中的更改,创建一个停靠容器,并将其上传到。
在我的repo中,我有一个Dockerfile文件,其中有关于如何构建将用于实例的容器的说明。我使用监督员d启动和监视我的应用程序。
以下是它的外观:
# 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连接了回购程序。
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。
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脚本中引用该模板。
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网络负载均衡器)。
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一起完成,但是我还没有完成这个部分。
https://stackoverflow.com/questions/71247722
复制相似问题