首充送50%
续费低至5折
AWS CDN 1折购
免费代充值
免费选购指南
免费协助迁移

将应用部署到 GKE 集群

2023-07-25


在本快速入门中,您需要将一个简单的网络服务器容器化应用部署到 Google Kubernetes Engine (GKE) 集群。您将了解如何创建集群以及如何将应用部署到集群以供用户访问。

本快速入门假定您对 Kubernetes 具有基本的了解。


准备工作请按照以下步骤启用 Kubernetes Engine API:

如果您刚接触 Google Cloud,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,并移除与该项目关联的所有资源。转到“项目选择器”确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。启用 Artifact Registry and Google Kubernetes Engine API。启用 API


启动 Cloud Shell

在本教程中,您将使用 Cloud Shell,这是一个用于管理 Google Cloud 上托管资源的 Shell 环境。

Cloud Shell 预安装有 Google Cloud CLIkubectl 命令行工具。gcloud CLI 为 Google Cloud 提供了主要的命令行界面,kubectl 则为 Kubernetes 集群运行命令提供了主要命令行界面。

启动 Cloud Shell:

  1. 前往 Google Cloud 控制台。Google Cloud 控制台
  2. 在控制台的右上角,点击激活 Cloud Shell 按钮:

控制台下方的框架内会打开一个 Cloud Shell 会话。您可以使用此 shell 运行 gcloudkubectl 命令。 在运行命令之前,请在 Google Cloud CLI 中使用以下命令设置默认项目:


gcloud config set project PROJECT_ID

PROJECT_ID 替换为您的项目 ID

创建 GKE 集群

一个集群包含至少一台集群控制层面机器以及多台工作器机器,这些工作器机器称为“节点”。节点是运行 Kubernetes 进程的 Compute Engine 虚拟机实例;必须有这些进程,节点才能加入到集群中。您将应用部署到集群,该应用在节点上运行。

创建名为 hello-cluster 的 Autopilot 集群:


gcloud container clusters create-auto hello-cluster     --location=us-central1
注意:集群创建过程可能需要几分钟才能完成。

获取用于集群的身份验证凭据

创建集群后,您需要获取身份验证凭据才能与该集群交互:


gcloud container clusters get-credentials hello-cluster     --location us-central1

此命令将 kubectl 配置为使用您创建的集群。

将应用部署到集群

现在您已创建了一个集群,可以向其部署容器化应用了。在本快速入门中,您可以部署我们的 hello-app 示例 Web 应用。

GKE 使用 Kubernetes 对象创建和管理集群的资源。Kubernetes 提供了 Deployment 对象,用于部署 Web 服务器等无状态应用。Service 对象则用于定义从互联网访问您的应用时需要遵循的规则和负载平衡机制。

创建 Deployment

如需在集群中运行 hello-app,您需要运行以下命令来部署应用:


kubectl create deployment hello-server     --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

此 Kubernetes 命令 kubectl create deployment 会创建名为 hello-server 的 Deployment。此 Deployment 的 Pod 运行 hello-app 容器映像。

在此命令中:

  • --image 指定了要部署的容器映像。在本示例中,该命令会从 Artifact Registry 代码库中拉取示例映像 us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 指示要拉取的特定映像版本。如果您未指定版本,则系统会使用默认标记 latest 的映像。

公开 Deployment

部署应用后,您需要将其公开到互联网,以便用户访问该应用。您可以通过创建 Service 来公开应用,这是一种 Kubernetes 资源,可以将您的应用公开给外部流量。

如需公开您的应用,请运行以下 kubectl expose 命令:


kubectl expose deployment hello-server     --type LoadBalancer     --port 80     --target-port 8080

传入 --type LoadBalancer 标志会为您的容器创建 Compute Engine 负载平衡器。--port 标志会初始化连接到互联网的公共端口 80,--target-port 标志会将流量路由到应用的端口 8080。

负载平衡器按 Compute Engine 的负载平衡器价格计费。

检查和查看应用

  1. 使用 kubectl get pods 检查正在运行的 Pod:kubectl get pods您应该会看到一个 hello-server Pod 正在您的集群上运行。
  2. 使用 kubectl get service 检查 hello-server Service:kubectl get service hello-server从此命令的输出结果的 EXTERNAL-IP 列中,复制 Service 的外部 IP 地址。注意:可能需要等待几分钟,才能看到填充的 Service 外部 IP 地址。如果应用的外部 IP 地址是 <pending>,请再次运行 kubectl get。
  3. 在您的网络浏览器中使用外部 IP 地址及公开的端口查看应用:http://EXTERNAL_IP

您刚刚向 GKE 部署了一个容器化 Web 应用。


清理

为避免因本页中使用的资源导致您的 Google Cloud 帐号产生费用,请按照以下步骤操作。

  1. 运行 kubectl delete 以删除应用的 Service:kubectl delete service hello-server此命令会删除您在公开 Deployment 时创建的 Compute Engine 负载平衡器。
  2. 运行 gcloud container clusters delete 以删除您的集群:gcloud container clusters delete hello-cluster --location us-central1

可选:hello-app 代码审核

hello-app 是一个简单的 Web 服务器应用,由两个文件组成:main.goDockerfile

hello-app 打包为 Docker 容器映像。容器映像存储在任意 Docker 映像注册表(例如 Artifact Registry)中。我们在 us-docker.pkg.dev/google-samples/containers/gke/hello-app 的 Artifact Registry 代码库中托管 hello-app

main.go

Dockerfile


main.go 是使用 Go 编程语言编写的一个 Web 服务器实现。该服务器会以一条“Hello, world!”消息响应任何 HTTP 请求。

hello-app/main.go

在 GitHub 上查看


package mainimport (        'fmt'        'log'        'net/http'        'os')func main() {        // register hello function to handle all requests        mux := http.NewServeMux()        mux.HandleFunc('/', hello)        // use PORT environment variable, or default to 8080        port := os.Getenv('PORT')        if port == '' {                port = '8080'        }        // start the web server on port and accept requests        log.Printf('Server listening on port %s', port)        log.Fatal(http.ListenAndServe(':'+port, mux))}// hello responds to the request with a plain-text 'Hello, world' message.func hello(w http.ResponseWriter, r *http.Request) {        log.Printf('Serving request: %s', r.URL.Path)        host, _ := os.Hostname()        fmt.Fprintf(w, 'Hello, world!
')        fmt.Fprintf(w, 'Version: 1.0.0
')        fmt.Fprintf(w, 'Hostname: %s
', host)