在 GKE on AWS 上部署应用

本页面提供了快速入门说明,介绍了如何创建集群和节点池,然后使用 GKE on AWS 部署示例应用。

使用 Terraform 快速设置集群

您可以使用 Terraform 创建集群和节点池。在创建集群之前,Terraform 脚本还会准备 AWS VPC。

如需详细了解 AWS 环境中的 Terraform,请参阅 Terraform 集群参考文档Terraform 节点池参考文档

使用 Terraform 创建 VPC 和集群后,请跳到将应用部署到集群以部署示例应用。

在不使用 Terraform 的情况下快速设置集群

如果您希望准备 AWS VPC 并创建不使用 Terraform 的集群和节点池,请按照以下说明操作。

准备工作

在创建集群之前,请务必满足前提条件。具体而言,您必须提供以下资源:

  • 集群将在其中运行的 AWS VPC。
  • 最多三个 AWS 子网用于三个控制平面副本。每个子网必须位于不同的 AWS 可用区中。
  • GKE on AWS 在管理集群时承担的 AWS IAM 角色。这需要一组特定的 IAM 权限
  • KMS 对称 CMK 密钥,用于静态加密集群数据 (etcd) 和配置。
  • 每个控制层面副本的 AWS IAM 实例配置文件。这需要一组特定的 IAM 权限
  • EC2 SSH 密钥对(可选),如果您需要对运行每个控制平面副本的 EC2 实例的 SSH 访问权限。

您需负责创建和管理这些资源,它们可在您的所有 GKE on AWS 集群之间共享。所有其他底层集群范围内的 AWS 资源均由 GKE on AWS 管理。

配置 gcloud CLI 的默认设置

使用 gcloud CLI 为默认项目和 Google Cloud 区域配置默认设置。

您的项目有一个项目 ID 作为唯一标识符。创建项目时,您可以使用自动生成的项目 ID,也可以创建自己的项目 ID。

Google Cloud 地区是用于管理集群的位置。例如 us-west1。如需了解详情,请参阅管理区域

配置这些默认设置后,您无需在运行 Google Cloud CLI 时添加它们。您还可以通过将 --project--location 标志传递给 Google Cloud CLI 来指定设置或替换默认设置。

在配置默认项目和位置后创建 GKE on AWS 资源时,资源会在该项目和位置自动创建。

如需设置默认值,请按以下步骤操作:

  1. 设置默认项目:

    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您的项目 ID。

  2. 设置默认管理位置:

    gcloud config set container_aws/location GOOGLE_CLOUD_LOCATION
    

    GOOGLE_CLOUD_LOCATION 替换为您的位置,例如 us-west1

为您的集群选择 CIDR 范围

Kubernetes 要求为集群提供两个 CIDR 范围。选择这些 CIDR 范围时,应确保它们与 VPC 子网使用的 CIDR 范围不重叠。它们的大小应足以满足集群的最大预期大小。

  • Pod 地址 CIDR 范围:创建新 Pod 时,系统会为其分配此范围内的 IP 地址。示例范围:192.168.208.0/20

  • 服务地址 CIDR 范围:创建新 Service 时,系统会为其分配此范围内的 IP 地址。示例范围:192.168.224.0/20。

创建集群

使用以下命令在 GKE on AWS 下创建集群。如需详细了解此命令(包括其可选参数),请参阅 gcloud container aws create 参考页面。

gcloud container aws clusters create aws-cluster-0 \
    --cluster-version 1.28.7-gke.1700 \
    --aws-region AWS_REGION \
    --fleet-project FLEET_PROJECT_ID \
    --vpc-id VPC_ID \
    --subnet-ids CONTROL_PLANE_SUBNET_1,CONTROL_PLANE_SUBNET_2,CONTROL_PLANE_SUBNET_3 \
    --pod-address-cidr-blocks POD_CIDR_BLOCK \
    --service-address-cidr-blocks SERVICE_CIDR_BLOCK \
    --role-arn API_ROLE_ARN \
    --iam-instance-profile CONTROL_PLANE_PROFILE \
    --database-encryption-kms-key-arn DB_KMS_KEY_ARN \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "google:gkemulticloud:cluster=aws-cluster-0"

替换以下内容:

  • AWS_REGION:要在其中创建集群的 AWS 区域。
  • FLEET_PROJECT_ID:将在其中注册集群的舰队宿主项目
  • VPC_ID:您在创建 VPC 先决步骤中设置的此集群的 AWS VPC 的 ID
  • CONTROL_PLANE_SUBNET_1CONTROL_PLANE_SUBNET_2CONTROL_PLANE_SUBNET_3:您在创建专用子网先决步骤中为集群创建的三个控制层面实例的子网 ID
  • POD_CIDR_BLOCK:集群的 pod 的 CIDR 地址范围
  • SERVICE_CIDR_BLOCK:集群的服务的 CIDR 地址范围
  • API_ROLE_ARN:您在创建 GKE Multi-Cloud API 角色前置步骤中创建的 GKE 多云服务的 IAM 角色的 ARN
  • CONTROL_PLANE_PROFILE:与您在创建控制层面角色先决步骤中选择的集群相关联的 IAM 实例的配置文件名称
  • DB_KMS_KEY_ARN:您在创建 AWS KMS 密钥先决步骤中创建的其中一个 AWS KMS 密钥的 Amazon 资源名称 (ARN)
  • CONFIG_KMS_KEY_ARN:您在创建 AWS KMS 密钥先决步骤中创建的其他 AWS KMS 密钥的 Amazon 资源名称 (ARN)

如果存在,--tags 参数会将给定的 AWS 标记应用于由 GKE on AWS 管理的所有底层 AWS 资源。此示例使用控制平面节点所属集群的名称来标记它们。

创建节点池

使用以下命令创建节点池:

gcloud container aws node-pools create pool-0 \
    --cluster aws-cluster-0 \
    --node-version 1.28.7-gke.1700 \
    --min-nodes 1 \
    --max-nodes 5 \
    --max-pods-per-node 110 \
    --root-volume-size 50 \
    --subnet-id NODEPOOL_SUBNET_ID \
    --iam-instance-profile NODEPOOL_PROFILE \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --ssh-ec2-key-pair EC2_KEY_PAIR \
    --tags "google:gkemulticloud:cluster=aws-cluster-0"

替换以下内容:

  • NODEPOOL_SUBNET_ID:您在创建专用子网先决步骤中创建的其中一个专用子网的 ID
  • NODEPOOL_PROFILE:您在创建节点池 IAM 角色先决步骤中选择的节点池中的 EC2 实例的 IAM 实例配置文件名称
  • CONFIG_KMS_KEY_ARN:用于加密用户数据的 AWS KMS 密钥的 Amazon 资源名称 (ARN)
  • EC2_KEY_PAIR(可选):为您在创建 SSH 密钥对先决步骤中创建的 SSH 访问(可选)所创建的 EC2 密钥对的名称

查看集群状态

创建集群和节点池后,您可以使用 Google Cloud CLI 或 Google Cloud 控制台来查看集群的状态。如需查看集群的状态,请选择您使用的是 Google Cloud CLI 还是 Google Cloud 控制台,然后按照以下步骤操作:

gcloud

使用 gcloud container aws clusters describe 命令获取有关集群的详细信息:

gcloud container aws clusters describe CLUSTER_NAME \
    --location GOOGLE_CLOUD_LOCATION

替换以下内容:

  • CLUSTER_NAME:您的集群的名称
  • GOOGLE_CLOUD_LOCATION:管理集群的 Google Cloud 位置的名称

Google Cloud 控制台

  1. 在 Google Cloud 控制台中,前往 Google Kubernetes Engine 集群概览页面。

    转到 GKE 集群

  2. 系统会按集群名称和位置列出您的集群。

  3. 点击集群的名称。此时会显示一个面板,其中包含该集群的相关信息,包括其状态和已启用的功能。

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

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

gcloud container aws clusters get-credentials aws-cluster-0

此命令将 kubectl 配置为访问您使用 Connect 网关创建的集群。您至少需要一个节点池才能使用 Connect 网关,因为它依赖于 Connect 代理,该代理在集群中作为 Deployment 运行。

将应用部署到集群

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

您可以使用 Kubernetes 对象创建和管理集群的资源。您可以使用 Deployment 对象来部署网络服务器等无状态应用。 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 标志会为您的容器创建 AWS 负载均衡器。--port 标志会初始化连接到互联网的公共端口 80,--target-port 标志会将流量路由到应用的端口 8080。

负载均衡器根据 AWS 负载均衡器价格计费。

检查和查看应用

  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 地址。

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

    http://EXTERNAL-IP
    

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

清理

  1. 删除应用的 Service 和 Deployment:

    kubectl delete service hello-server
    kubectl delete deployment hello-server
    
  2. 运行 gcloud container aws node-pools delete 以删除您的节点池:

    gcloud container aws node-pools delete pool-0 --cluster aws-cluster-0
    
  3. 运行 gcloud container aws clusters delete 以删除您的集群:

    gcloud container aws clusters delete aws-cluster-0
    

后续步骤