快速入门

本快速入门介绍了如何使用 Google Kubernetes Engine 部署容器化应用。

您可以按照本页面中所述的步骤操作,也可以尝试将本快速入门作为 Google Cloud 培训实验室。

立即试用实验室

准备工作

请按照以下步骤启用 Kubernetes Engine API:
  1. 访问 Google Cloud Platform Console 中的 Kubernetes Engine 页面
  2. 创建或选择项目。
  3. 在 API 和相关服务启用前稍作等待。此过程可能耗时几分钟。
  4. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

选择 shell

您可以使用 Google Cloud Shell 或本地 shell 来完成此快速入门。

Google Cloud Shell 是用于管理在 Google Cloud Platform (GCP) 上托管的资源的 shell 环境。Cloud Shell 预安装有 gcloudkubectl 命令行工具。gcloud 是 GCP 的主要命令行界面,而 kubectl 提供的命令行界面用于运行 Kubernetes 集群命令。

如果您更喜欢使用本地 shell,则必须在您的环境中安装 gcloudkubectl 命令行工具。

Cloud Shell

要启动 Cloud Shell,请执行以下步骤:

  1. 转到 Google Cloud Platform Console。

    Google Cloud Platform Console

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

一个 Cloud Shell 会话随即会在控制台底部的框内打开。您可以使用此 shell 运行 gcloudkubectl 命令。

本地 Shell

要安装 gcloudkubectl,请执行以下步骤:

  1. 安装 Google Cloud SDK(其中包含 gcloud 命令行工具)。
  2. 安装 Cloud SDK 后,通过运行以下命令安装 kubectl 命令行工具:

    gcloud components install kubectl

配置 gcloud 的默认设置

开始之前,您应该使用 gcloud 配置两项默认设置:默认项目计算地区

您的项目所具有的项目 ID 是其唯一标识符。首次创建项目时,您可以使用自动生成的项目 ID,也可以创建自己的项目 ID。

计算地区是您的集群及其资源所在的大致区域位置。例如,us-west1-aus-west 区域中的一个地区。

通过配置这些默认设置可以更轻松地运行 gcloud 命令,因为 gcloud 要求指定您希望在其中工作的项目和计算地区。您还可以通过将操作标志(例如 --project--zone--cluster)传递给 gcloud 命令来指定这些设置或替换默认设置。

在配置默认项目和计算地区后创建 GKE 资源时,该项目和地区中会自动创建资源。

设置默认项目

要设置默认项目,请在 Cloud Shell 中运行以下命令:

gcloud config set project [PROJECT_ID]

[PROJECT_ID] 替换为您的项目 ID。

设置默认计算地区

要设置默认计算地区,请运行以下命令:

gcloud config set compute/zone [COMPUTE_ZONE]

其中,[COMPUTE_ZONE] 是所需的地理计算地区,例如 us-west1-a

创建 GKE 集群

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

要创建集群,请运行以下命令:

gcloud container clusters create [CLUSTER_NAME]

其中,[CLUSTER_NAME] 是您为集群选择的名称。

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

创建集群后,您需要获取身份验证凭据以便与该集群交互。

要进行该集群的身份验证,请运行以下命令:

gcloud container clusters get-credentials [CLUSTER_NAME]

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

将一个应用部署到该集群中

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

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

创建 Deployment

要在集群中运行 hello-app,请运行以下命令:

kubectl run hello-server --image gcr.io/google-samples/hello-app:1.0 --port 8080

Kubernetes 命令 kubectl run 会创建一个名为 hello-server 的新 Deployment。Deployment 的 Pod 在其容器中运行 hello-app 映像。

在此命令中:

  • --image 指定了要部署的容器映像。在本示例中,该命令会从 Google Container Registry 存储分区中拉取示例映像 gcr.io/google-samples/hello-app:1.0 指定了要拉取的特定映像版本。如果未指定版本,则使用最新版本。
  • --port 指定了该容器公开的端口。

公开 Deployment

部署应用后,您需要将其公开到互联网,以便用户可以访问该应用。您可以通过创建 Service 来公开应用;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 来检查 hello-server Service:

    kubectl get service hello-server

    在此命令的输出中,从 EXTERNAL-IP 列中复制该 Service 的外部 IP 地址。

  2. 在网络浏览器中使用外部 IP 地址及公开的端口查看应用:

    http://[EXTERNAL_IP]/

您刚刚向 GKE 部署了一个容器化网页应用!

清理

为避免系统因本快速入门中使用的资源向您的 GCP 帐号收取费用,请执行以下操作:

  1. 通过运行 kubectl delete 删除应用的 Service:

    kubectl delete service hello-server

    这将删除您在公开部署时创建的 Compute Engine 负载平衡器。

  2. 通过运行 gcloud container clusters delete 删除您的集群:

    gcloud container clusters delete [CLUSTER_NAME]

可选:hello-app 代码审核

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

hello-app 打包为 Docker 容器映像。容器映像存储在任意 Docker 映像注册表中,例如 Google Container Registry。我们在名为 gcr.io/google-samples/hello-app 的 Container Registry 存储分区中托管 hello-app

main.go

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

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
)

func main() {
	// use PORT environment variable, or default to 8080
	port := "8080"
	if fromEnv := os.Getenv("PORT"); fromEnv != "" {
		port = fromEnv
	}

	// register hello function to handle all requests
	server := http.NewServeMux()
	server.HandleFunc("/", hello)

	// start the web server on port and accept requests
	log.Printf("Server listening on port %s", port)
	err := http.ListenAndServe(":"+port, server)
	log.Fatal(err)
}

// 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!\n")
	fmt.Fprintf(w, "Version: 1.0.0\n")
	fmt.Fprintf(w, "Hostname: %s\n", host)
}

Dockerfile

Dockerfile 用于描述您希望 Docker 构建的映像(包括其所有资源和依赖项),并指定应用应该公开的网络端口。要详细了解此文件的运作方式,请参阅 Docker 文档中的 Dockerfile 参考

FROM golang:1.8-alpine
ADD . /go/src/hello-app
RUN go install hello-app

FROM alpine:latest
COPY --from=0 /go/bin/hello-app .
ENV PORT 8080
CMD ["./hello-app"]

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Kubernetes Engine 文档