2023-07-25
在本快速入门中,您需要将一个简单的网络服务器容器化应用部署到 Google Kubernetes Engine (GKE) 集群。您将了解如何创建集群以及如何将应用部署到集群以供用户访问。
本快速入门假定您对 Kubernetes 具有基本的了解。
如果您刚接触 Google Cloud,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有的项目。完成本教程介绍的步骤后,您可以删除所创建的项目,并移除与该项目关联的所有资源。转到“项目选择器”确保您的 Google Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。启用 Artifact Registry and Google Kubernetes Engine API。启用 API
在本教程中,您将使用 Cloud Shell,这是一个用于管理 Google Cloud 上托管资源的 Shell 环境。
Cloud Shell 预安装有 Google Cloud CLI 和 kubectl 命令行工具。gcloud CLI 为 Google Cloud 提供了主要的命令行界面,kubectl
则为 Kubernetes 集群运行命令提供了主要命令行界面。
启动 Cloud Shell:
控制台下方的框架内会打开一个 Cloud Shell 会话。您可以使用此 shell 运行 gcloud
和 kubectl
命令。 在运行命令之前,请在 Google Cloud CLI 中使用以下命令设置默认项目:
gcloud config set project PROJECT_ID
将 PROJECT_ID
替换为您的项目 ID。
一个集群包含至少一台集群控制层面机器以及多台工作器机器,这些工作器机器称为“节点”。节点是运行 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 对象则用于定义从互联网访问您的应用时需要遵循的规则和负载平衡机制。
如需在集群中运行 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
的映像。部署应用后,您需要将其公开到互联网,以便用户访问该应用。您可以通过创建 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 的负载平衡器价格计费。
您刚刚向 GKE 部署了一个容器化 Web 应用。
为避免因本页中使用的资源导致您的 Google Cloud 帐号产生费用,请按照以下步骤操作。
可选:hello-app 代码审核
hello-app
是一个简单的 Web 服务器应用,由两个文件组成:main.go
和 Dockerfile
。
hello-app
打包为 Docker 容器映像。容器映像存储在任意 Docker 映像注册表(例如 Artifact Registry)中。我们在 us-docker.pkg.dev/google-samples/containers/gke/hello-app
的 Artifact Registry 代码库中托管 hello-app
。
main.go
是使用 Go 编程语言编写的一个 Web 服务器实现。该服务器会以一条“Hello, world!”消息响应任何 HTTP 请求。
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)