我一直试图在GCP上创建一个托管实例组,该组由托管自定义docker映像的实例组成。然而,我正在努力想办法和普留米一起做到这一点。
阅读谷歌的GCP文档,可以通过实例模板在托管实例组中部署托管docker容器的实例。
实际上,与gcloud这看起来像:
gcloud compute instance-templates create-with-container TEMPLATE_NAME --container-image DOCKER_IMAGE
然而,在阅读Pulumi的实例模板文档时,还不清楚如何创建一个与上面的命令相同的实例模板。
在Pulumi中,是否可以创建一个托管实例组,其中实例承载自定义docker映像,或者我是否必须手动创建一个实例模板,并在我的Pulumi脚本中引用它?
这里有一种同时使用gcloud和Pulumi的混合方法。
处于高级别:
- 创建一个docker容器并上传到Google容器注册表
- 使用gcloud创建实例模板
- 创建一个托管实例组,引用Pulumi脚本中的实例模板
#1创建Docker容器
使用CloudBuild检测Git repo中的更改,创建一个docker容器,并将其上传到Google container Registry。
在我的repo中,我有一个Dockerfile文件,其中包含如何构建将用于我的实例的容器的说明。我使用Supervisord来启动和监视我的应用程序。
它看起来是这样的:
# 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容器并上传到Google container Registry。我通过CloudBuild来实现这一点。以下是相应的Pulumi代码(构建Golang应用程序(:
注意:请确保您首先通过GCP网站的CloudBuild部分连接了回购
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 SDK。
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完成,但我还没有完成这一部分