将容器映像中的应用部署到 GKE 集群
本页面介绍如何执行以下操作:
- 创建一个 Hello World 应用。
- 使用 Cloud Build 将该应用封装到容器映像中。
- 在 Google Kubernetes Engine (GKE) 中创建一个集群。
- 将容器映像部署到该集群。
示例以多种语言提供,但是,除了所提供的语言以外,您也可以使用其他语言。
如需在 Cloud Shell Editor 中直接遵循有关此任务的分步指导,请点击操作演示:
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
启用 Artifact Registry, Cloud Build, and Google Kubernetes Engine API。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
启用 Artifact Registry, Cloud Build, and Google Kubernetes Engine API。
- 安装 Google Cloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init
-
kubectl
用于管理 Kubernetes(即 GKE 使用的集群编排系统)。您可以使用gcloud
安装kubectl
:gcloud components install kubectl
编写示例应用
如需查看如何创建在 GKE 上运行的 Hello World 应用的说明,请点击您想用的语言:
Go
创建名为
helloworld-gke
的新目录,并转到此目录中:mkdir helloworld-gke cd helloworld-gke
创建名为
example.com/helloworld
的新模块:go mod init example.com/helloworld
创建名为
helloworld.go
的新文件,并将以下代码粘贴到其中:此代码会创建一个 Web 服务器,该服务器监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,接下来可以将其封装到一个 Docker 容器中,然后上传到 Artifact Registry。
Node.js
创建名为
helloworld-gke
的新目录,并转到此目录中:mkdir helloworld-gke cd helloworld-gke
创建一个包含以下内容的
package.json
文件:在同一目录中,创建一个
index.js
文件,并将以下行复制到此文件中:此代码会创建一个 Web 服务器,该服务器监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,接下来可以将其封装到一个 Docker 容器中,然后上传到 Artifact Registry。
Python
创建名为
helloworld-gke
的新目录,并转到此目录中:mkdir helloworld-gke cd helloworld-gke
创建名为
app.py
的文件,并将以下代码粘贴到此文件中:
Java
创建一个 Spring Boot 应用。
安装 Java SE 8 或更高版本的 JDK 和 cURL。 Java SE 和 cURL 只在下一步中创建新的 Web 项目时需要。Dockerfile(将在稍后介绍)会将所有依赖项加载到容器中。
在您的终端新建一个空 Web 项目:
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d javaVersion=1.8 \ -d type=maven-project \ -d bootVersion=2.6.6 \ -d name=helloworld \ -d artifactId=helloworld \ -d baseDir=helloworld-gke \ -o helloworld-gke.zip unzip helloworld-gke.zip cd helloworld-gke
您现在已经有了一个位于
helloworld-gke
中的新 Spring Boot 项目。在
src/main/java/com/example/helloworld/HelloworldApplication.java
文件中,添加@RestController
来更新HelloworldApplication
类,以处理/
映射。此代码会创建一个 Web 服务器,该服务器监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,接下来可以将其封装到一个 Docker 容器中,然后上传到 Artifact Registry。
C#
安装 .NET SDK。.NET SDK 只在下一步中创建新的 Web 项目时需要。
Dockerfile
(将在稍后介绍)会将所有依赖项加载到容器中。在您的终端新建一个空 Web 项目:
dotnet new web -o helloworld-gke
切换到
helloworld-gke
目录。cd helloworld-gke
更新
Program.cs
以监听端口8080
:
您的应用已编写完毕,接下来可以将其封装到一个 Docker 容器中,然后上传到 Artifact Registry。
PHP
创建名为
helloworld-gke
的新目录,并转到此目录中:mkdir helloworld-gke cd helloworld-gke
创建名为
index.php
的文件,并将以下代码粘贴到此文件中:
您的应用已编写完毕,接下来可以将其封装到一个 Docker 容器中,然后上传到 Artifact Registry。
使用 Cloud Build 将应用容器化
如需将示例应用容器化,请在与源文件相同的目录中创建一个名为
Dockerfile
的新文件,并将以下内容复制到此文件中:Go
Node.js
再添加一个
.dockerignore
文件,以确保本地文件不会影响容器的构建过程:Python
添加
.dockerignore
文件,以确保本地文件不会影响容器的构建过程:Java
C#
添加
.dockerignore
文件,以确保本地文件不会影响容器的构建过程:PHP
添加
.dockerignore
文件,以确保本地文件不会影响容器的构建过程:获取 Google Cloud 项目 ID:
gcloud config get-value project
在本快速入门中,您需要将容器存储在 Artifact Registry 中,并从注册表中将其部署到集群。运行以下命令,在集群所在的位置创建名为
hello-repo
的仓库:gcloud artifacts repositories create hello-repo \ --project=PROJECT_ID \ --repository-format=docker \ --location=us-central1 \ --description="Docker repository"
替换以下值:
PROJECT_ID
是您的 Google Cloud 项目 ID
使用 Cloud Build 构建容器映像,此行为类似于运行
docker build
和docker push
,但构建是在 Google Cloud 上进行的:gcloud builds submit \ --tag us-central1-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke .
该映像存储在 Artifact Registry 中。
创建 GKE 集群
GKE 集群是作为单个 GKE 集群运行的一组托管式 Compute Engine 虚拟机。
创建集群。
gcloud container clusters create-auto helloworld-gke \ --location us-central1
验证您有权访问该集群。以下命令会列出您的容器集群中已启动并运行的节点,并表明您有权访问该集群。
kubectl get nodes
如果您遇到了错误,请参阅 Kubernetes 问题排查指南。
部署到 GKE
如需将该应用部署到您创建好的 GKE 集群,您需要用到两个 Kubernetes 对象。
- 一个 Deployment 对象,用来定义您的应用。
- 一个 Service 对象,用来定义如何访问您的应用。
部署应用
该应用具有一个前端服务器,用于处理 Web 请求。您可以在名为 deployment.yaml
的新文件中定义运行该前端所需的集群资源。这些资源通过一个 Deployment 对象来描述。您可以使用 Deployment 来创建和更新 ReplicaSet
以及与其关联的 Pod。
在与其他文件相同的目录中创建
deployment.yaml
文件,然后复制以下内容。在文件中替换以下值:$GCLOUD_PROJECT
是您的 Google Cloud 项目 ID:$LOCATION
是代码库位置,例如us-central1
。
将资源部署到集群:
kubectl apply -f deployment.yaml
跟踪 Deployment 的状态:
kubectl get deployments
如果所有
AVAILABLE
部署都为READY
,则表示 Deployment 已完成。NAME READY UP-TO-DATE AVAILABLE AGE helloworld-gke 1/1 1 1 20s
如果 Deployment 有误,请再次运行
kubectl apply -f deployment.yaml
,更新 Deployment 以纳入任何更改。Deployment 完成后,您可以查看 Deployment 创建的 Pod:
kubectl get pods
部署 Service
Service 提供对一组 Pod 的单一访问点。尽管您可以访问单个 Pod,但 Pod 是临时性的,只有使用一个 Service 地址才能进行可靠的访问。在您的 Hello World 应用中,名为“hello”的 Service 定义了一个负载均衡器,用于通过一个 IP 地址访问多个 hello-app
Pod。此 Service 在 service.yaml
文件中定义。
请在与其他源文件相同的目录中创建一个名为
service.yaml
的文件,并在此文件中添加以下内容:这些 Pod 与使用 Pod 的 Service 是分别定义的。Kubernetes 使用标签来选择服务指向的 Pod。利用标签,您既可以让一个 Service 指向来自不同副本集的多个 Pod,也可以让多个 Service 指向同一个 Pod。
创建 Hello World Service:
kubectl apply -f service.yaml
获取服务的外部 IP 地址:
kubectl get services
分配 IP 地址最多可能需要 60 秒的时间。外部 IP 地址列在
hello
Serivce 的EXTERNAL-IP
列下。NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello LoadBalancer 10.22.222.222 35.111.111.11 80:32341/TCP 1m kubernetes ClusterIP 10.22.222.1 <none> 443/TCP 20m
查看已部署的应用
现在,您已经部署好了在 GKE 上运行 Hello World 应用所需的全部资源。
使用在上一步中获取的外部 IP 地址在网络浏览器中加载应用,并查看正在运行的应用:
http://EXTERNAL_IP
或者,您可以对 Service 的外部 IP 地址进行 curl
调用:
curl EXTERNAL_IP
输出显示以下内容:
Hello World!
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
您需要为集群中运行的 Compute Engine 实例和 Container Registry 中的容器映像付费。删除项目
删除 Google Cloud 项目后,系统会停止对该项目中使用的所有资源计费。
- 在 Google Cloud 控制台中,进入管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
删除您的集群和容器
如果您想保留项目,只删除本教程中使用的资源,请删除您的集群和映像。
如需使用 Google Cloud CLI 删除集群,请为您使用的模式运行以下命令:
gcloud container clusters delete helloworld-gke \
--location us-central1
如需删除 Artifact Registry 代码库中的映像,请运行以下命令:
gcloud artifacts docker images delete \
us-central1-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke
后续步骤
如需详细了解 Kubernetes,请参阅以下内容:
- 详细了解如何创建集群。
- 详细了解 Kubernetes。
- 阅读
kubectl
参考文档。
如需详细了解如何部署到 GKE,请参阅以下内容:
- 了解如何打包、托管和部署简单的 Web 服务器应用。
- 使用 Redis 和 PHP 创建多层 Web 应用。
- 使用 Persistent Disk 和 Cloud SQL 在 GKE 上部署 WordPress。
- 设置 Cloud Run on GKE。
如需详细了解如何使用 Cloud Code 直接从您的 IDE 在 GKE 上创建、开发和运行应用,请参阅以下内容: