创建自定义用户集群

本主题介绍如何自定义 GKE on AWS 用户集群的配置。

您可能出于以下原因需要创建自定义用户集群:

  • 为预演环境或测试环境创建另一个集群。
  • 添加具有不同机器类型的节点池。
  • 在特定 AWS 可用性区域 (AZ) 中创建集群。

准备工作

在开始使用 GKE on AWS 之前,请确保您已执行以下任务:

  • 安装管理服务

  • 如果您想在不使用 terraform output example_cluster 的情况下创建集群,请为控制层面设置专用 AWS 子网。每个子网应属于同一 AWS 地区中的不同 AZ。路由表必须配置为允许专用子网之间的流量,并且每个子网都必须有权访问 NAT 网关。

  • 拥有 AWS 虚拟私有云 (VPC) ID。VPC ID 类似于 vpc-012345678abcde。您可以在 AWS 控制台上找到 VPC ID。

如需连接到 GKE on AWS 资源,请执行以下步骤。选择您是拥有现有 AWS VPC(或者与 VPC 的直接连接)还是在创建管理服务时创建了专用 VPC。

现有 VPC

如果您拥有与现有 VPC 的直接连接或 VPN 连接,请省略本主题的命令中的行 env HTTP_PROXY=http://localhost:8118

专用 VPC

如果您在专用 VPC 中创建管理服务,则 GKE on AWS 会在公共子网中添加一个堡垒主机。

如需连接到您的管理服务,请执行以下步骤:

  1. 切换到您的 GKE on AWS 配置所在的目录。 您在安装管理服务时创建了此目录。

    cd anthos-aws

  2. 要打开隧道,请运行 bastion-tunnel.sh 脚本。隧道会转发到 localhost:8118

    如需打开堡垒主机的隧道,请运行以下命令:

    ./bastion-tunnel.sh -N
    

    来自 SSH 隧道的消息会显示在此窗口中。准备好关闭连接后,请使用 Control+C 或关闭窗口来停止该进程。

  3. 打开新终端并切换到您的 anthos-aws 目录。

    cd anthos-aws
  4. 检查您是否能够使用 kubectl 连接到集群。

    env HTTPS_PROXY=http://localhost:8118 \
    kubectl cluster-info
    

    输出包括管理服务 API 服务器的网址。

选择控制层面实例大小

GKE on AWS 不支持调整控制层面实例的大小。在创建用户集群之前,请选择控制层面的实例大小。控制层面大小取决于集群中的节点数量。下表包含针对各种集群大小建议的控制层面实例大小

集群大小(节点数) 控制层面实例类型
1 – 10 m5.large
11 – 100 m5.xlarge
101 – 200 m5.2xlarge

使用自定义配置创建新集群

您可以使用 terraform output example_cluster 为每个管理集群创建一个用户集群的配置。如果要创建更多集群,您需要应用自定义配置。

在此示例中,您可以通过 AWSClusterAWSNodePool CRD 手动创建集群。

  1. 切换到您的 GKE on AWS 配置所在的目录。 您在安装管理服务时创建了此目录。

    cd anthos-aws

  2. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  3. 打开文本编辑器并将以下 AWSCluster 定义复制到名为 custom-cluster.yaml 的文件中。

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSCluster
    metadata:
      name: CLUSTER_NAME
    spec:
      region: AWS_REGION
      networking:
        vpcID: VPC_ID
        podAddressCIDRBlocks: POD_ADDRESS_CIDR_BLOCKS
        serviceAddressCIDRBlocks: SERVICE_ADDRESS_CIDR_BLOCKS
        ServiceLoadBalancerSubnetIDs: SERVICE_LOAD_BALANCER_SUBNETS
      controlPlane:
        version:  CLUSTER_VERSION # Latest version is 1.25.5-gke.2100
        instanceType: AWS_INSTANCE_TYPE
        keyName: SSH_KEY_NAME
        subnetIDs:
        - CONTROL_PLANE_SUBNET_IDS
        securityGroupIDs:
        - CONTROL_PLANE_SECURITY_GROUPS
        iamInstanceProfile: CONTROL_PLANE_IAM_ROLE
        rootVolume:
          sizeGiB: ROOT_VOLUME_SIZE
          volumeType: ROOT_VOLUME_TYPE # Optional
          iops: ROOT_VOLUME_IOPS # Optional
          kmsKeyARN: ROOT_VOLUME_KEY # Optional
        etcd:
          mainVolume:
            sizeGiB: ETCD_VOLUME_SIZE
            volumeType: ETCD_VOLUME_TYPE # Optional
            iops: ETCD_VOLUME_IOPS # Optional
            kmsKeyARN: ETCD_VOLUME_KEY # Optional
        databaseEncryption:
          kmsKeyARN: ARN_OF_KMS_KEY
        hub: # Optional
          membershipName: ANTHOS_CONNECT_NAME
        cloudOperations: # Optional
          projectID: YOUR_PROJECT
          location: GCP_REGION
          enableLogging: ENABLE_LOGGING
          enableMonitoring: ENABLE_MONITORING
        workloadIdentity: # Optional
          oidcDiscoveryGCSBucket: WORKLOAD_IDENTITY_BUCKET
    

    请替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • AWS_REGION:您的集群在其中运行的 AWS 地区。

    • VPC_ID:您的集群在其中运行的 VPC 的 ID。

    • POD_ADDRESS_CIDR_BLOCKS:集群的 pod 使用的 IPv4 地址范围。目前仅支持单个范围。 此范围不得与从您的网络访问的任何子网重叠。您可以放心地在多个不同的 AWSCluster 对象中使用相同的范围。例如 10.2.0.0/16

    • SERVICE_ADDRESS_CIDR_BLOCKS:集群的服务使用的 IPv4 地址范围。目前仅支持单个范围。 此范围不得与从您的网络访问的任何子网重叠。 您可以放心地在多个不同的 AWSCluster 对象中使用相同的范围。例如 10.1.0.0/16

    • SERVICE_LOAD_BALANCER_SUBNETS:GKE on AWS 可在其中创建公共或专用负载平衡器的子网 ID。

    • CLUSTER_VERSION:GKE on AWS 支持的 Kubernetes 版本。最新版本为 1.25.5-gke.2100。

    • AWS_INSTANCE_TYPE支持的 EC2 实例类型

    • SSH_KEY_NAMEAWS EC2 密钥对

    • CONTROL_PLANE_SUBNET_IDS:您的控制层面实例在其中运行的 AZ 中的子网 ID。

    • CONTROL_PLANE_SECURITY_GROUPS:在安装管理服务期间创建的 securityGroupID。您可以通过添加连接到控制层面所需的 securityGroupID 来自定义此项。

    • CONTROL_PLANE_IAM_PROFILE:分配给控制层面副本的 AWS EC2 实例配置文件的名称。

    • ROOT_VOLUME_SIZE:控制层面根卷的大小(以 GiB 为单位)。

    • ROOT_VOLUME_TYPE 替换为 EBS 卷类型。例如 gp3

    • ROOT_VOLUME_IOPS 替换为卷的每秒预配 IO 操作数 (IOPS)。仅在 volumeTypeGP3 时有效。如需了解详情,请参阅通用 SSD 卷 (gp3)

    • ROOT_VOLUME_KEY 替换为加密您的控制层面实例根卷的 AWS KMS 密钥的 Amazon 资源名称。

    • ETCD_VOLUME_SIZE:etcd 使用的卷的大小。

    • ETCD_VOLUME_TYPE 替换为 EBS 卷类型。例如 gp3

    • ETCD_VOLUME_IOPS 替换为卷的每秒预配 IO 操作数 (IOPS)。仅在 volumeTypegp3 时有效。如需了解详情,请参阅通用 SSD 卷 (gp3)

    • ETCD_VOLUME_KEY 替换为 AWS KMS 密钥的 Amazon 资源名称,以加密您的控制层面 etcd 数据卷。

    • ARN_OF_KMS_KEY:用于加密集群 Secret 的 AWS KMS 密钥。

    • ANTHOS_CONNECT_NAME:用于注册集群的 Connect 成员资格名称。成员资格名称必须是唯一的。例如 projects/YOUR_PROJECT/locations/global/memberships/CLUSTER_NAME,其中 YOUR_PROJECT 是您的 Google Cloud 项目,CLUSTER_NAME 是项目中的唯一名称。 此字段是可选字段。

    • YOUR_PROJECT:您的项目 ID。

    • GCP_REGION:您要在其中存储日志的 Google Cloud 区域。选择 AWS 区域附近的区域。 如需了解详情,请参阅全球位置 - 区域和可用区(例如 us-central1)。

    • ENABLE_LOGGINGtruefalse,是否在控制层面节点上启用 Cloud Logging。

    • ENABLE_MONITORINGtruefalse,是否在控制层面节点上启用 Cloud Monitoring。

    • WORKLOAD_IDENTITY_BUCKET:包含您的 Workload Identity 发现信息的 Cloud Storage 存储分区名称。 此字段是可选字段。

  4. 为集群创建一个或多个 AWSNodePool。打开文本编辑器并将以下 AWSCluster 定义复制到名为 custom-nodepools.yaml 的文件中。

    apiVersion: multicloud.cluster.gke.io/v1
    kind: AWSNodePool
    metadata:
      name: NODE_POOL_NAME
    spec:
      clusterName: AWSCLUSTER_NAME
      version:  CLUSTER_VERSION # latest version is 1.25.5-gke.2100
      region: AWS_REGION
      subnetID: AWS_SUBNET_ID
      minNodeCount: MINIMUM_NODE_COUNT
      maxNodeCount: MAXIMUM_NODE_COUNT
      maxPodsPerNode: MAXIMUM_PODS_PER_NODE_COUNT
      instanceType: AWS_NODE_TYPE
      keyName: KMS_KEY_PAIR_NAME
      iamInstanceProfile: NODE_IAM_PROFILE
      proxySecretName: PROXY_SECRET_NAME
      rootVolume:
        sizeGiB: ROOT_VOLUME_SIZE
        volumeType: VOLUME_TYPE # Optional
        iops: IOPS # Optional
        kmsKeyARN: NODE_VOLUME_KEY # Optional 
    

    请替换以下内容:

    • NODE_POOL_NAME:您的 AWSNodePool 的唯一名称。
    • AWSCLUSTER_NAME:您的 AWSCluster 的名称。例如 staging-cluster
    • CLUSTER_VERSION:受支持的 GKE on AWS Kubernetes 版本
    • AWS_REGION:您的 AWSCluster 所在的 AWS 区域。
    • AWS_SUBNET_ID:您的 AWSCluster 所在的区域中的 AWS 子网。
    • MINIMUM_NODE_COUNT:节点池中的节点数下限。如需了解详情,请参阅扩缩用户集群
    • MAXIMUM_NODE_COUNT:节点池中的节点数上限。
    • MAXIMUM_PODS_PER_NODE_COUNT:GKE on AWS 可以分配给一个节点的 Pod 数上限。
    • AWS_NODE_TYPEAWS EC2 实例类型
    • KMS_KEY_PAIR_NAME:分配给每个节点池工作器的 AWS KMS 密钥对。
    • NODE_IAM_PROFILE:分配给池中节点的 AWS EC2 实例配置文件的名称。
    • ROOT_VOLUME_SIZE:控制层面根卷的大小(以 GiB 为单位)。
    • VOLUME_TYPE:节点的 AWS EBS 卷类型。例如 gp3
    • IOPS:卷的每秒预配 IO 操作数 (IOPS)。仅在 volumeTypegp3 时有效。
    • NODE_VOLUME_KEY:用于对卷进行加密的 AWS KMS 密钥的 ARN。如需了解详情,请参阅使用客户管理 CMK 来加密卷
  5. 将清单应用到您的管理服务。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f custom-cluster.yaml
    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f custom-nodepools.yaml
    

创建 kubeconfig

在用户集群启动时,您可以为新用户集群创建 kubeconfig 上下文。您将使用该上下文向用户或管理集群进行身份验证。

  1. 使用 anthos-gke aws clusters get-credentials~/.kube/config 中的用户集群生成 kubeconfig

    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    

    CLUSTER_NAME 替换为您的集群的名称。例如 cluster-0

  2. 使用 kubectl 向新用户集群进行身份验证。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl cluster-info
    

    如果您的集群已准备就绪,则输出内容会包含集群中 Kubernetes 组件的网址。

查看集群的状态

如果您应用 AWSClusterAWSNodePool,则管理服务会预配 AWS 资源。

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 如需列出集群,请使用 kubectl get AWSClusters

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get AWSClusters
    

    输出包括每个集群的名称、状态、存在时间、版本和端点。

    例如,以下输出仅包含一个名为 cluster-0AWSCluster

    NAME        STATE          AGE     VERSION         ENDPOINT
    cluster-0   Provisioning   2m41s   1.25.5-gke.2100   gke-xyz.elb.us-east-1.amazonaws.com
    

查看集群事件

如需查看用户集群中的近期 Kubernetes 事件,请使用 kubectl get events

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 运行 kubectl get events

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get events
    

输出包括与您的管理服务相关的信息、警告和错误。

删除用户集群

如需删除用户集群,请执行以下步骤:

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 使用 kubectl delete 删除包含用户集群的清单。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete -f CLUSTER_FILE
    

    CLUSTER_FILE 替换为包含 AWScluster 和 AWSNodePool 对象的清单的名称。例如 cluster-0.yaml

删除所有用户集群

要删除所有用户集群,请执行以下步骤:

  1. anthos-aws 目录中,使用 anthos-gke 将上下文切换到管理服务。

    cd anthos-aws
    anthos-gke aws management get-credentials

  2. 使用 kubectl delete 从管理服务中删除 AWSNodePool 和 AWSCluster。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete AWSNodePool --all
    env HTTPS_PROXY=http://localhost:8118 \
      kubectl delete AWSCluster --all
    

如需了解详情,请参阅卸载 GKE on AWS

后续步骤