更新集群

创建集群后,您可以更改集群配置的某些方面。例如,您可以执行以下操作:

  • 添加、移除或替换节点。
  • 为集群添加或移除注解。
  • 修改集群和节点池资源中的可变字段的值。
  • 修改其他自定义资源。

您可以使用 bmctl 或 Google Cloud CLI 更新集群。如果您使用 Terraform 创建了管理员集群或用户集群,则可以使用 Terraform 来更新集群。请注意以下几点:

  • 创建集群后,集群配置的许多方面是不可变的,且无法更新。如需查看可变字段和不可变字段的完整列表,请参阅集群配置字段参考。字段参考是一个可排序的表格。点击列标题可更改排列顺序。点击字段名称可查看其说明。

  • gcloud CLI 和 Terraform 仅支持更新管理员集群和用户集群。您必须使用 bmctl 更新其他集群类型。

  • gcloud CLI 和 Terraform 仅支持对集群和节点池资源进行更改。您必须使用 kubectlbmctl 更新影响集群的其他自定义资源。

如何更新集群

通常,您需要执行以下一系列操作来更新集群:

bmctl

  1. 更改集群配置文件中适用字段的值,该文件默认位于此处:
    bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml

  2. 通过运行 bmctl update 命令来更新集群:

    bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG
    

    请替换以下内容:

    • CLUSTER_NAME:您要更新的集群的名称。
    • KUBECONFIG:对于管理员集群、混合集群或独立集群,输入集群的 kubeconfig 文件的路径。对于用户集群,输入admin集群的 kubeconfig 文件的路径。

gcloud CLI

  1. 仅为要修改的配置指定标志。

  2. 运行适用的更新命令:

Terraform

  1. 更改用于创建集群或节点池的 Terraform 配置文件中适用字段的值。如需详细了解字段说明,请参阅 Terraform 参考文档:

  2. 通过运行 terraform apply 命令更新配置。

以下部分概述了更新现有集群的一些常见示例。

在集群中添加或移除节点

节点池是集群中具有相同配置的一组节点。请注意,节点始终属于节点池。要向集群添加新节点,您需要将其添加到特定节点池。从节点池中移除节点相当于从集群中完全移除该节点。

Google Distributed Cloud 中有三种节点池:控制平面、负载平衡器和工作器节点池。以下部分介绍了如何在每种类型的节点池中添加或移除节点。

bmctl

如需在节点池中添加或移除节点,您可以在集群配置文件的特定部分中添加或移除节点的 IP 地址。以下列表显示了给定节点池要修改的部分:

  • 工作器节点池:在 NodePool 规范的 spec.nodes 部分中添加或移除节点的 IP 地址。
  • 控制平面节点池:在 Cluster 规范的 spec.controlPlane.nodePoolSpec.nodes 部分中添加或移除节点的 IP 地址。
  • 负载均衡器节点池:在 Cluster 规范的 spec.loadBalancer.nodePoolSpec.nodes 部分中添加或移除节点的 IP 地址。

示例:移除工作器节点

以下示例集群配置文件展示了两个工作器节点的规范:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: nodepool1
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  nodes:
  - address: 192.0.2.1
  - address: 192.0.2.2

如需移除节点,请执行以下操作:

  1. (可选)如果要移除的节点正在运行关键 Pod,请先将该节点置于维护模式

    您可以通过查看 NodePool 资源上的 status.nodesDrainedstatus.nodesDraining 字段来监控工作器节点的节点排空过程。

  2. 修改集群配置文件以删除节点的 IP 地址条目。

  3. 更新集群:

    bmctl update cluster1 \
        --kubeconfig=ADMIN_KUBECONFIG
    

gcloud CLI

您可以使用 update 命令添加或移除节点。您使用的 update 命令以及用于指定 IP 地址的标志取决于要更新的节点池类型:

  • 工作器节点池:运行 gcloud container bare-metal node-pools update 并在 --node-configs 'node-ip=IP_ADDRESS' 标志中指定 IP 地址。

  • 管理员集群上的控制平面节点池:运行 gcloud container bare-metal admin-clusters update 并在 --control-plane-node-configs 'node-ip=IP_ADDRESS' 标志中指定 IP 地址。

  • 用户集群上的控制平面节点池:运行 gcloud container bare-metal clusters update 并在 --control-plane-node-configs 'node-ip=IP_ADDRESS' 标志中指定 IP 地址。

  • 负载均衡器节点池:运行 gcloud container bare-metal clusters update 并在以下标志中指定 IP 地址 - --metal-lb-load-balancer-node-configs 'node-ip=IP_ADDRESS'
    --bgp-load-balancer-node-configs 'node-ip=IP_ADDRESS'

您用于指定 IP 地址的标志仅接受一个 node-ip。您可以在节点池中添加每个 IP 地址的标志。

update 命令会将所有 IP 地址替换为您指定的 IP 地址。如需添加节点,请在 update 命令中添加现有节点的 IP 地址和新节点的 IP 地址。同样,您可以通过仅添加要保留的节点的 IP 地址来移除节点。

示例:移除工作器节点

本部分使用示例数据介绍如何从节点池中移除工作器节点。其他可能有用的 gcloud CLI 命令也包括在以下步骤中。

  1. (可选)如果要移除的节点正在运行关键 Pod,请先将该节点置于维护模式

    您可以通过查看 NodePool 资源上的 status.nodesDrainedstatus.nodesDraining 字段来监控工作器节点的节点排空过程。

  2. 运行 list 命令以列出集群中的所有节点池:

    gcloud container bare-metal node-pools list \
        --cluster=abm-user-cluster1 \
        --project=example-project-12345 \
        --location=us-central1
    

    输出类似于以下内容:

    NAME         LOCATION     STATE
    node-pool-1  us-central1  RUNNING
    node-pool-2  asia-east1   RUNNING
    
  3. 运行 describe 命令以列出节点池中的所有 IP 地址:

    gcloud container bare-metal node-pools describe node-pool-1 \
        --cluster=abm-user-cluster1 \
        --project=example-project-12345 \
        --location=us-central1
    

    为了便于阅读,以下示例输出已被截断:

    annotations:
      ...
      baremetal.cluster.gke.io/version: 1.29
    ...
    name: projects/example-project-12345/locations/us-central1/bareMetalClusters/abm-user-cluster1/bareMetalNodePools/node-pool-1
    nodePoolConfig:
      nodeConfigs:
      - nodeIp: 192.0.2.1
      - nodeIp: 192.0.2.2
      operatingSystem: LINUX
    state: RUNNING
    ...
    

    请注意示例输出中的以下内容:

    • name 字段包含节点池的完全限定名称。在命令中指定节点池名称时,您可以指定完全限定名称,也可以指定节点池名称(例如 node-pool-1)以及 --cluster--project 标志和 --location 标志。

    • nodeConfigs 部分包含两个带节点 IP 地址的 nodeIp 字段。

  4. 运行以下命令以移除 IP 地址为 192.0.2.1 的节点:

    gcloud container bare-metal node-pools update node-pool-1 \
        --cluster=abm-user-cluster1 \
        --project=example-project-12345 \
        --location=us-central1 \
        --node-configs='node-ip=192.0.2.2'
    

    update 命令会将所有 IP 地址替换为您指定的 IP 地址。由于未包含 192.0.2.1,因此该节点已被移除。

    此命令的输出类似如下所示:

    Waiting for operation [projects/example-project-12345/locations/us-central1/operations/operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9] to complete
    

    在示例输出中,字符串 operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9 是长时间运行的操作的 OPERATION_ID。您可以通过在另一个终端窗口中运行以下命令来了解操作的状态:

    gcloud container bare-metal operations describe operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9 \
        --project= example-project-12345 \
        --location=us-central1
    

    您可以经常重复运行该命令以检查状态。

如果节点移除失败,您可以强制将其从集群中移除。如需了解详情,请参阅强制移除损坏的节点

替换高可用性控制平面节点

bmctl

您可以使用 bmctl 替换所有集群类型中的高可用性 (HA) 控制平面节点。

您可以通过执行以下步骤来替换集群中的节点:

  1. 从集群配置文件中移除节点的 IP 地址。
  2. 更新集群。
  3. 检查集群中节点的状态。
  4. 将新节点的 IP 地址添加到同一集群配置文件中。
  5. 更新集群。

示例:替换高可用性控制平面节点

以下示例集群配置文件展示了用户集群中的三个控制平面节点:

---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: user-cluster
namespace: cluster-user-cluster
spec:
  controlPlane:
  nodePoolSpec:
    nodes:
    - address: 192.0.2.11
    - address: 192.0.2.12
    - address: 192.0.2.13

如需替换 spec.controlPlane.nodePoolSpec.nodes 部分中列出的最后一个节点,请执行以下步骤:

  1. 通过在集群配置文件中删除节点的 IP 地址条目来移除节点。进行此更改后,集群配置文件应如下所示:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
    name: user-cluster
    namespace: cluster-user-cluster
    spec:
      controlPlane:
      nodePoolSpec:
        nodes:
        - address: 192.0.2.11
        - address: 192.0.2.12
    
  2. 通过运行以下命令来更新集群:

    bmctl update cluster -c CLUSTER_NAME \
      --kubeconfig=KUBECONFIG
    

    进行以下更改:

    • CLUSTER_NAME 替换为要更新的集群的名称。
    • 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群(如本示例所示),请将 KUBECONFIG 替换为admin集群的 kubeconfig 文件的路径。
  3. bmctl update 命令成功执行后,需要一些时间来完成 machine-preflightmachine-init 作业。您可以通过运行本文档的验证更新部分中所述的命令查看节点及其各自节点池的状态。节点池和节点处于就绪状态后,您可以继续执行下一步。

  4. 通过将新控制平面节点的 IP 地址添加到集群配置文件的 spec.controlPlane.nodePoolSpec.nodes 部分,将新控制平面节点添加到节点池中。进行此更改后,集群配置文件应如下所示:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
    name: user-cluster
    namespace: cluster-user-cluster
    spec:
      controlPlane:
      nodePoolSpec:
        nodes:
        - address: 192.0.2.11
        - address: 192.0.2.12
        - address: 192.0.2.14
    
  5. 通过运行以下命令来更新集群:

    bmctl update cluster -c CLUSTER_NAME \
      --kubeconfig=KUBECONFIG
    

gcloud CLI

您可以使用 gcloud CLI 替换管理员集群和用户集群中的高可用性 (HA) 控制平面节点。

您可以通过执行以下步骤来替换集群中的节点:

  1. 通过运行适用的 update 命令移除节点的 IP 地址:

    • 用户集群:gcloud container bare-metal clusters update
    • 管理员集群:gcloud container bare-metal admin-clusters update
  2. 通过运行 gcloud container bare-metal operations describe OPERATION_ID 来检查集群中的节点移除状态。

  3. 通过运行适用的 update 命令添加新节点的 IP 地址。

示例:替换高可用性控制平面节点

本部分使用示例数据介绍如何替换集群中的控制平面。其他可能有用的 gcloud CLI 命令也包括在以下步骤中。

  1. 运行 list 命令以列出 Google Cloud 项目中的所有用户集群:

    gcloud container bare-metal clusters list \
        --project=example-project-12345 \
        --location=-
    

    设置 --location=- 时,意味着列出所有区域中的所有集群。如果您需要缩小列表范围,请将 --location 设置为特定区域

    输出类似于以下内容:

    NAME                 LOCATION      VERSION   ADMIN_CLUSTER        STATE
    abm-user-cluster1a   us-central1   1.29      abm-admin-cluster1   RUNNING
    abm-user-cluster1b   europe-west1  1.29      abm-admin-cluster1   RUNNING
    
  2. 在集群上运行 describe 命令:

    gcloud container bare-metal clusters describe abm-user-cluster1  \
        --project=example-project-12345 \
        --location=us-central1
    

    为了便于阅读,示例输出已被截断:

    ...
    controlPlane:
      controlPlaneNodePoolConfig:
        nodePoolConfig:
          nodeConfigs:
          - nodeIp: 192.0.2.11
          - nodeIp: 192.0.2.12
          - nodeIp: 192.0.2.13
          operatingSystem: LINUX
    ...
    name: projects/example-project-1234567/locations/us-central1/bareMetalClusters/abm-user-cluster1a
    ...
    

    请注意示例输出中的以下内容:

    • name 字段包含集群的完全限定名称。在命令中指定集群名称时,您可以指定完全限定名称,也可以指定集群名称(例如 abm-user-cluster1a)以及 --project--location flags

    • nodeConfigs 部分包含三个 nodeIp 字段,各字段包含控制平面节点 IP 地址。

  3. 移除 IP 地址为 192.0.2.13 的节点:

    gcloud container bare-metal cluster update abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --control-plane-node-configs 'node-ip=192.0.2.11'
        --control-plane-node-configs 'node-ip=192.0.2.12'
    

    此命令的输出类似如下所示:

    Waiting for operation [projects/example-project-12345/locations/us-central1/operations/operation-1956154681749-6078d9def4030-76686d6e-9fcb1d7] to complete
    

    在示例输出中,字符串 operation-1956154681749-6078d9def4030-76686d6e-9fcb1de7 是长时间运行的操作的 OPERATION_ID。您可以通过在另一个终端窗口中运行以下命令来了解操作的状态:

    gcloud container bare-metal operations describe operation-1956154681749-6078d9def4030-76686d6e-9fcb1de7 \
        --project= example-project-12345 \
        --location=us-central1
    

    您可以经常重复运行该命令以检查状态。

  4. 添加 IP 地址为 192.0.2.14 的新节点:

    gcloud container bare-metal cluster update abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --control-plane-node-configs 'node-ip=192.0.2.11'
        --control-plane-node-configs 'node-ip=192.0.2.12'
        --control-plane-node-configs 'node-ip=192.0.2.14'
    

验证更新

kubectl

您可以使用 kubectl get 命令查看节点及其各自的节点池的状态。

例如,以下命令会显示集群命名空间 cluster-my-cluster 中的节点池的状态:

kubectl -n cluster-my-cluster get nodepools.baremetal.cluster.gke.io

系统会返回类似于以下内容的结果:

NAME                    READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
cluster-my-cluster      3       0             0         0                  0
cluster-my-cluster-lb   2       0             0         0                  0
np1                     3       0             0         0                  0

Reconciling=1 表示协调步骤仍在进行中。您应该等待状态更改为 Reconciling=0

您还可以通过运行以下命令来检查集群中节点的状态:

kubectl get nodes --kubeconfig=KUBECONFIG

gcloud CLI

如前所述,运行 update 命令后,您可以使用 gcloud container bare-metal operations describe OPERATIONS_ID 检查操作的状态。该命令的输出提供了节点的状态,例如:

  ...
  metrics:
  - intValue: '1'
    metric: NODES_RECONCILING
  - intValue: '2'
    metric: NODES_HEALTHY
  - intValue: '0'
    metric: NODES_FAILED
  - intValue: '0'
    metric: NODES_IN_MAINTENANCE
  - intValue: '3'
    metric: NODES_TOTAL
  stage: HEALTH_CHECK
...

无论使用哪个工具更新节点池,您都可以通过运行适用的 describe 命令来获取节点池的当前状态,如上所示。

如需详细了解如何诊断集群,请参阅创建快照以诊断集群

负载均衡器地址池

bmctl

addressPools 部分包含用于为 MetalLB 和边界网关协议 (BGP) 捆绑式负载均衡器指定负载均衡池的字段。您可以随时添加更多负载均衡地址池,但无法移除任何现有地址池。从 Google Distributed Cloud 1.16.0 版开始,您可以随时修改 addressPools.avoidBuggyIPsaddressPools.manualAssign 的值。

addressPools:
- name: pool1
  addresses:
  - 198.51.100.0-198.51.100.4
  - 198.51.100.240/28
- name: pool2
  addresses:
  - 198.51.100.224/28

gcloud CLI

您可以随时为捆绑式负载均衡器添加更多负载均衡地址池,但无法移除任何现有地址池。您在 gcloud container bare-metal clusters update 中指定的用于添加地址池的标志取决于捆绑式负载均衡器的类型:

  • MetalLB(第 2 层):使用 --metal-lb-address-pools 标志。
  • 边界网关协议 (BGP):使用 --bgp-address-pools 标志。

这些标志的值采用以下格式:

'pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \

该值的各部分以关键字 poolavoid-buggy-ipmanual-assignaddresses 开头。每个部分之间用英文逗号分隔。

  • pool:您为池选择的名称。

  • avoid-buggy-ips:如果将其设置为 True,则 IP 地址管理 (IPAM) 控制器不会将以 .0.255 结尾的 IP 地址分配给 Service。这样可以避免有问题的用户设备错误地丢弃发送到这些特殊 IP 地址的流量。如果未指定,则默认为 False。从 Google Distributed Cloud 1.16.0 版开始,您可以在现有地址池中修改此值。

  • manual-assign:如果您不希望 IPAM 控制器自动将此池中的 IP 地址分配给 Service,请将其设置为 True。之后,开发者便可以创建 LoadBalancer 类型的 Service 并手动指定池中的一个地址。如果未指定,则 manual-assign 设置为 False。从 Google Distributed Cloud 1.16.0 版开始,您可以在现有地址池中修改此值。

  • addresses 列表中:每个地址都必须是采用 CIDR 或带连字符的范围格式的范围。如需指定池中的单个 IP 地址(例如对于入站流量 VIP),请在 CIDR 表示法中使用 /32(例如 192.0.2.1/32)。

请注意以下语法规则:

  • 用英文单引号将整个值括起来。
  • 不允许使用空格。
  • 用英文分号分隔每个 IP 地址范围。

您可以指定多个标志实例,如以下示例所示:

--metal-lb-address-pools='pool=pool2,avoid-buggy-ips=False,manual-assign=True,addresses=198.51.100.0/30;198.51.100.64-198.51.100.72'
--metal-lb-address-pools='pool=pool3,avoid-buggy-ips=True,manual-assign=True,addresses=203.0.113.0/28'

如需详细了解负载均衡器地址池,请参阅“配置捆绑式负载均衡”中的 loadBalancer.addressPools

防止意外删除集群

bmctl

如果您向集群配置文件添加 baremetal.cluster.gke.io/prevent-deletion: "true" 注解,则无法删除集群。例如,运行 kubectl delete clusterbmctl reset cluster 会产生错误。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: ci-10c3c6f4d9c698e
  namespace: cluster-ci-10c3c6f4d9c698e
  annotations:
    baremetal.cluster.gke.io/prevent-deletion: "true"
spec:
  clusterNetwork:

gcloud CLI

如果您指定值为 baremetal.cluster.gke.io/prevent-deletion="true"--add-annotations 标志,则将无法删除集群。例如:

  1. 添加注解以防止意外删除集群:

    gcloud container bare-metal clusters update abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --add-annotations=baremetal.cluster.gke.io/prevent-deletion="true"
    
  2. 尝试删除用户集群:

    gcloud container bare-metal clusters delete abm-user-cluster1a \
        --project=example-project-12345 \
        --location=us-central1 \
        --force \
        --allow-missing
    

    此命令的响应类似如下所示:

    ERROR: (gcloud.container.bare-metal.clusters.delete) INVALID_ARGUMENT:
    invalid request: admission webhook "vcluster.kb.io" denied the request:
    annotations[baremetal.cluster.gke.io/prevent-deletion]: Invalid value:
    "true": Annotation "baremetal.cluster.gke.io/prevent-deletion" should be
    removed in order to delete this cluster
    

    如需移除注解,请在 update 命令中指定 --remove-annotations=baremetal.cluster.gke.io/prevent-deletion="true"

绕过预检检查

此功能仅适用于 bmctl update

bypassPreflightCheck 字段的默认值为 false。如果您在集群配置文件中将此字段设置为 true,则在将资源应用于现有集群时系统会忽略内部预检检查。

  apiVersion: baremetal.cluster.gke.io/v1
  kind: Cluster
  metadata:
    name: cluster1
    namespace: cluster-cluster1
    annotations:
      baremetal.cluster.gke.io/private-mode: "true"
  spec:
    bypassPreflightCheck: true

添加或移除集群管理员

bmctl

您可以通过在集群配置文件的 clusterSecurity.authorization.clusterAdmin.gcpAccounts 部分中指定电子邮件地址,添加或移除作为用户集群的集群管理员的用户或服务账号。这些账号将被授予集群上的 cluster-admin 角色,向该用户提供对集群的完整访问权限。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  clusterSecurity:
    authorization:
      clusterAdmin:
        gcpAccounts:
        - alex@example.com
        - hao@example.com
        - my-sa@example-project-12345.iam.gserviceaccount.com

更新用户集群以添加账号时,请务必将列表中的所有账号(现有账号和新账号)都包括在内,因为 bmctl update 会使用您在配置文件中指定的内容覆盖列表。如需移除账号,请从集群配置文件中移除该账号并运行 bmctl update

gcloud CLI

您可以通过在 --admin-users 标志中指定电子邮件地址,添加或移除作为集群管理员的用户或服务账号。该标志只接受一个电子邮件地址。如需添加多个用户,请在每个标志中指定一个账号,例如:

gcloud container bare-metal clusters update abm-user-cluster1a \
    --project=example-project-12345 \
    --location=us-central1 \
    --admin-users=alex@example.com \
    --admin-users=hao@example.com
    --admin-users=my-sa@example-project-12345.iam.gserviceaccount.com

update 命令会覆盖整个授权列表。指定要作为集群管理员的所有现有用户和新用户。

设置登录用户

您可以指定要用于对集群中的节点机器进行无密码 sudo 访问时使用的非根用户名。您的 SSH 密钥 sshPrivateKeyPath 必须对指定的用户有效。集群创建和更新操作会检查是否可以使用指定的用户和 SSH 密钥访问节点机器。

bmctl

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    baremetal.cluster.gke.io/private-mode: "true"
spec:
  nodeAccess:
    loginUser: abm

gcloud CLI

您可以在 --login-user 标志中指定要用于访问节点机器的用户,例如:

gcloud container bare-metal clusters update abm-user-cluster1a \
    --project=example-project-12345 \
    --location=us-central1 \
    --login-user=abm

如需为用户启用无密码 sudo 访问权限,请在每个集群节点机器上执行以下步骤:

  1. 使用 sudo visudo 打开 sudoers 文件以进行编辑:

    sudo visudo -f /etc/sudoers
    

    visudo 命令会锁定 sudoers 文件,以防止同时编辑,并在保存时验证文件的语法。

  2. 对于登录用户,在 sudoers 文件中添加一个条目,如下所示:

    USERNAME ALL=(ALL) NOPASSWD: ALL
    
  3. 关闭并保存该文件。

  4. 要使用登录用户的权限运行命令,请运行以下命令:

    su - USERNAME
    
  5. 如需验证您的登录用户无需密码即可运行 sudo 命令,请运行以下 sudo 命令:

    sudo ip a
    

高级网络设置

您可以在创建集群后在各种自定义资源中配置高级网络设置功能。如需使用自定义资源和相关的网络设置功能,您必须在创建集群时启用高级网络设置。

bmctl

创建集群时,在集群配置中将 clusterNetwork.advancedNetworking 设置为 true

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  clusterNetwork:
    ...
    advancedNetworking: true
    ...

gcloud CLI

在创建集群时,在 gcloud container bare-metal clusters create 命令中添加 --enable-advanced-networking 标志。

创建启用了高级网络设置的集群后,您可以使用 kubectl apply 配置本部分中所述的自定义资源。

NetworkGatewayGroup

NetworkGatewayGroup 自定义资源用于为高级网络功能(例如出站 NAT 网关使用 BGP 的捆绑式负载均衡功能)提供浮动 IP 地址。

apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
  name: default
  namespace: cluster-bm
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.2.100

BGP 负载均衡

您可以在集群资源和其他自定义资源中配置边界网关协议 (BGP) 负载均衡。gcloud container bare-metal clusters createupdate 命令支持在集群资源中配置 BGP,但不支持自定义资源。

使用 BGP 配置捆绑式负载均衡器时,默认情况下,数据平面负载均衡使用为控制平面对等互连指定的相同外部对等连接。或者,您可以使用 BGPLoadBalancer 自定义资源和 BGPPeer 自定义资源单独配置数据平面负载均衡。如需了解详情,请参阅使用 BGP 配置捆绑式负载均衡器

BGPLoadBalancer

apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
  name: default
  namespace: cluster-bm
spec:
  peerSelector:
    cluster.baremetal.gke.io/default-peer: "true"

BGPPeer

apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm
  labels:
    cluster.baremetal.gke.io/default-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

扩大服务网络范围

如需创建超出初始限制的服务,您可以缩小 IPv4 服务 CIDR 掩码以扩大集群的服务网络。缩小掩码(“/”之后的值)会生成更大的网络范围。您只能扩大 IPv4 服务 CIDR 的范围。网络范围无法缩小,这意味着无法增大掩码(“/”之后的值)。

bmctl

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
spec:
  ...
  clusterNetwork:
    services:
      cidrBlocks:
        - 192.0.2.0/14
  ...

gcloud CLI

如需扩大用户集群上的 IPv4 服务 CIDR 的范围,请在 --island-mode-service-address-cidr-blocks 标志中指定新范围。

gcloud container bare-metal clusters update cluster1 \
    --project=example-project-12345 \
    --location=us-central1 \
    --island-mode-service-address-cidr-blocks=192.0.2.0/14

配置 kubelet 映像拉取设置

kubelet 在集群的每个节点上运行。kubelet 负责监控节点上的容器并确保它们健康状况良好。需要时,kubelet 会从 Container Registry 中查询和拉取映像。

手动更新 kubelet 配置并使其在所有集群节点之间保持同步可能会很困难。更糟糕的是,升级集群时,节点上的手动 kubelet 配置更改将会丢失。

为了帮助简化同步更新并使其保持永久有效,Google Distributed Cloud 允许您为每个集群节点池(控制平面节点、负载均衡器节点和工作器节点)指定一些 kubelet 设置。这些设置适用于给定池中的所有节点,并且在集群升级过程中保持不变。这些设置的字段是可变的,因此您可以随时更新它们,而不仅仅是在创建集群时进行更新。

bmctl

以下受支持的字段用于控制 kubelet 的 Container Registry 拉取操作:

  • registryBurst(默认值:10)
  • registryPullQPS(默认值:5)
  • serializeImagePulls(默认值:true)

如需详细了解每个 kubelet 配置字段,请参阅集群配置字段参考文档

您可以在以下节点池的 Cluster 规范和 NodePool 规范的 kubeletConfig 部分中指定这些字段:

以下示例展示了集群配置文件中添加的字段及其默认值。请注意,注解 preview.baremetal.cluster.gke.io/custom-kubelet: "enable" 为必填项。

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: cluster1
  namespace: cluster-cluster1
  annotations:
    preview.baremetal.cluster.gke.io/custom-kubelet: "enable"
spec:
  ...
  controlPlane:
    nodePoolSpec:
      kubeletConfig:
        registryBurst: 10
        registryPullQPS: 5
        serializeImagePulls: true
  ...
  loadBalancer:
    nodePoolSpec:
      kubeletConfig:
        registryBurst: 10
        registryPullQPS: 5
        serializeImagePulls: true
  ...
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
  name: node-pool-new
  namespace: cluster-cluster1
spec:
  clusterName: cluster1
  ...
  kubeletConfig:
    registryBurst: 10
    registryPullQPS: 5
    serializeImagePulls: true

在每种情况下,该设置都适用于池中的所有节点。

gcloud CLI

以下标志用于控制 kubelet 的 Container Registry 拉取操作:

使用方法

以下是调整映像拉取的一些注意事项:

  • 由于映像默认是按顺序拉取的,因此耗时很长时间的映像拉取可能会延迟节点上调度的所有其他映像拉取。延迟映像拉取可能会阻止升级过程(尤其是当需要在节点上部署新的 Google Distributed Cloud 映像时)。如果您受到映像拉取延迟的影响,则可以停用序列化映像拉取,以允许并行映像拉取。

  • 如果您遇到映像拉取限制错误(例如 pull QPS exceeded),则建议您增加 *-registry-pull-qps*-registry-burst 以提高映像拉取吞吐量。这两个字段会调整拉取速率和队列大小,可能有助于解决其他限制相关问题。不允许使用负值。

参考文档