Anthos clusters on Bare Metal 已知问题

安装

对照组 v2 不兼容

对照组 v2 (cgroup v2) 与 Anthos clusters on Bare Metal 1.6 不兼容。Kubernetes 1.18 不支持 cgroup v2。此外,Docker 从 20.10 版开始才提供实验性支持。在版本 247.2-2 中,systemd 默认切换为 cgroup v2。如果存在 /sys/fs/cgroup/cgroup.controllers,则表示系统使用的是 cgroup v2。

从 Anthos clusters on Bare Metal 1.6.2 开始,预检检查会验证 cgroup v2 未在集群机器上使用。

安装期间的良性错误消息

在高可用性 (HA) 集群安装期间,您可能会看到有关 etcdserver leader change 的错误。这些错误消息是良性的,可以忽略。

使用 bmctl 安装集群时,您可能会在 create-cluster.log 末尾看到 Log streamer failed to get BareMetalMachine 日志消息。此错误消息是良性的,可以忽略。

检查集群创建日志时,您可能会看到有关注册集群或调用网络钩子的暂时性故障。您可以放心地忽略这些错误,因为安装过程将重试这些操作,直到操作成功。

预检检查和服务帐号凭据

对于由管理员集群或混合集群触发的安装(也就是不使用 bmctl 创建的集群,例如用户集群),预检检查不会验证 Google Cloud Platform 服务帐号凭据或其相关权限。

应用默认凭据和 bmctl

bmctl 使用应用默认凭据 (ADC) 验证集群操作在 cluster spec 中的位置值(如果未设置为 global)。

要使 ADC 正常运行,您需要将 GOOGLE_APPLICATION_CREDENTIALS 环境变量指向服务帐号凭据文件,或运行 gcloud auth application-default login

Docker 服务

在集群节点机器上,如果 PATH 环境变量中存在 Docker 可执行文件,但 Docker 服务未处于活动状态,则预检检查将失败并报告 Docker service is not active。如需修复此错误,请移除 Docker 或启用 Docker 服务。

升级和更新

Anthos clusters on Bare Metal 1.6.x 版本不支持升级。

如果 .manifests 目录缺失,则 bmctl update cluster 会失败

如果在运行 bmctl update cluster 之前移除了 .manifests 目录,则该命令会失败,并显示如下所示的错误:

Error updating cluster resources.: failed to get CRD file .manifests/1.9.0/cluster-operator/base/crd/bases/baremetal.cluster.gke.io_clusters.yaml: open .manifests/1.9.0/cluster-operator/base/crd/bases/baremetal.cluster.gke.io_clusters.yaml: no such file or directory

如需解决此问题,请先运行 bmctl check cluster,这将重新创建 .manifests 目录。

此问题适用于 Anthos Clusters on Bare Metal 1.10 及更早版本,并在 1.11 版及更高版本中得到修复。

bmctl update 无法移除维护块

bmctl update 命令无法在集群资源配置中移除或修改 maintenanceBlocks 部分。如需了解详情(包括从维护模式中移除节点的说明),请参阅将节点置于维护模式

操作

kubeconfig Secret 被覆盖

在用户集群上运行时,bmctl check cluster 命令会使用管理员集群 kubeconfig 覆盖用户集群 kubeconfig Secret。覆盖该文件会导致受影响的用户集群的标准集群操作(例如更新和升级)失败。此问题影响 Anthos clusters on Bare Metal 1.11.1 及更早版本。

要确定用户集群是否受到此问题的影响,请运行以下命令:

kubectl --kubeconfig ADMIN_KUBECONFIG get secret -n cluster-USER_CLUSTER_NAME \
    USER_CLUSTER_NAME -kubeconfig  -o json  | jq -r '.data.value'  | base64 -d

替换以下内容:

  • ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径。
  • USER_CLUSTER_NAME:要检查的用户集群的名称。

如果输出中的集群名称(请参阅以下示例输出中的 contexts.context.cluster)是管理员集群名称,则指定的用户集群会受到影响。

user-cluster-kubeconfig  -o json  | jq -r '.data.value'  | base64 -d
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data:LS0tLS1CRU...UtLS0tLQo=
    server: https://10.200.0.6:443
  name: ci-aed78cdeca81874
contexts:
- context:
    cluster: ci-aed78cdeca81874
    user: ci-aed78cdeca81874-admin
  name: ci-aed78cdeca81874-admin@ci-aed78cdeca81874
current-context: ci-aed78cdeca81874-admin@ci-aed78cdeca81874
kind: Config
preferences: {}
users:
- name: ci-aed78cdeca81874-admin
  user:
    client-certificate-data: LS0tLS1CRU...UtLS0tLQo=
    client-key-data: LS0tLS1CRU...0tLS0tCg==

以下步骤会恢复受影响的用户集群 (USER_CLUSTER_NAME) 的功能:

  1. 找到用户集群 kubeconfig 文件。

    创建集群时,Anthos clusters on Bare Metal 会在管理员工作站上生成 kubeconfig 文件。默认情况下,该文件位于 bmctl-workspace/USER_CLUSTER_NAME 目录中。

  2. 验证该 kubeconfig 是正确的用户集群 kubeconfig:

    kubectl get nodes --kubeconfig PATH_TO_GENERATED_FILE
    

    PATH_TO_GENERATED_FILE 替换为用户集群 kubeconfig 文件的路径。响应会返回用户集群的节点的详细信息。确认集群的机器名称正确无误。

  3. 运行以下命令以删除管理员集群中的损坏的 kubeconfig 文件:

    kubectl delete secret -n USER_CLUSTER_NAMESPACE USER_CLUSTER_NAME-kubeconfig
    
  4. 运行以下命令,将正确的 kubeconfig Secret 保存回管理员集群:

    kubectl create secret generic -n USER_CLUSTER_NAMESPACE USER_CLUSTER_NAME-kubeconfig \
        --from-file=value=PATH_TO_GENERATED_FILE
    

重置/删除

用户集群凭据

bmctl reset 命令依赖于集群配置文件中的顶层凭据部分。对于用户集群,您需要手动更新文件以添加凭据部分。

装载点和 fstab

重置不会卸载 /mnt/anthos-system/mnt/localpv-share/ 下的装载点。也不会清理 /etc/fstab 中的相应条目。

命名空间删除

删除命名空间将阻止在该命名空间中创建新资源,包括用于重置机器的作业。删除用户集群时,您必须先删除集群对象,然后再删除其命名空间。否则,无法创建重置机器的作业,删除过程将跳过机器清理步骤。

安全

升级期间,集群 CA/证书将轮替。目前不支持按需轮替。

Anthos clusters on Bare Metal 自动轮替 kubelet 服务证书。当证书快要过期时,每个 kubelet 节点代理都可以发出证书签名请求 (CSR)。管理员集群中的控制器会验证并批准 CSR。

网络

具有捆绑式第 2 层负载均衡的客户端来源 IP 地址

外部流量政策设置为 Local 可能会导致捆绑式第 2 层负载均衡的路由错误,如 No route to host。外部流量政策默认设置为 Cluster (externalTrafficPolicy: Cluster)。使用此设置时,Kubernetes 会处理集群范围的流量。LoadBalancerNodePort 类型的服务可以使用 externalTrafficPolicy: Local 保留客户端来源 IP 地址。但是,使用此设置时,Kubernetes 仅处理节点本地流量。

如果要保留客户端来源 IP 地址,则可能需要其他配置,以确保服务 IP 地址可供访问。如需了解配置详情,请参阅“配置捆绑式负载均衡”中的保留客户端来源 IP 地址

Pod 连接失败和反向路径过滤

Anthos clusters on Bare Metal 会在节点上配置反向路径过滤来停用来源验证 (net.ipv4.conf.all.rp_filter=0)。如果 rp_filter 设置更改为 12,则 Pod 会因节点外通信超时而失败。

反向路径过滤是使用 IPv4 配置文件夹 (net/ipv4/conf/all) 中的 rp_filter 文件设置的。此值也可能被 sysctl 替换,后者会将反向路径过滤设置存储在网络安全配置文件(例如 /etc/sysctl.d/60-gce-network-security.conf)中。

如需恢复 Pod 连接,请手动将 net.ipv4.conf.all.rp_filter 设置回 0,或者重新启动 anetd Pod 以将 net.ipv4.conf.all.rp_filter 设置回 0。如需重启 anetd Pod,请使用以下命令定位并删除 anetd Pod,一个新的 anetd Pod 将在其位置启动:

kubectl get pods -n kube-system
kubectl delete pods -n kube-system ANETD_XYZ

ANETD_XYZ 替换为 anetd Pod 的名称。

引导(种类)集群 IP 地址和集群节点 IP 地址重叠

192.168.122.0/2410.96.0.0/27 是引导(种类)集群使用的默认 pod 和服务 CIDR。如果这些地址与集群节点机器 IP 地址重叠,预检检查将失败。为避免冲突,您可以将 --bootstrap-cluster-pod-cidr--bootstrap-cluster-service-cidr 标志传递给 bmctl 以指定不同的值。

不同集群的 IP 地址重叠

没有验证不同集群的 IP 地址是否重叠的预检检查。

Anthos clusters on Bare Metal 中的 hostport 功能

目前不支持 ContainerPort 中的 hostport 功能。

操作系统

在 CentOS 上创建或升级集群失败

2020 年 12 月,CentOS 社区和 Red Hat 宣布了 CentOS 停用。2022 年 1 月 31 日,CentOS 8 已达到服务终止 (EOL) 期限。由于服务终止 (EOL),yum 代码库不再适用于 CentOS,从而导致集群创建和集群升级操作失败。这适用于所有受支持的 CentOS 版本,并影响所有 Anthos clusters on Bare Metal 版本。

如需解决此问题,请运行以下命令,让 CentOS 使用归档 Feed:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' \
    /etc/yum.repos.d/CentOS-Linux-*

作为长期解决方案,请考虑迁移到其他受支持的操作系统,例如 UbuntuRHEL

操作系统端点限制

在 RHEL 和 CentOS 中,存在 10 万个端点的集群级层限制。Kubernetes 服务。如果两个服务引用同一组 pod,则计为两组独立的端点。RHEL 和 CentOS 中的底层 nftable 实现导致了此限制;这不是 Anthos clusters on Bare Metal 的固有限制。

配置

控制层面和负载均衡器规范

控制层面和负载均衡器节点池规范很特别。这些规范声明和控制关键集群资源。这些资源的规范来源是它们在集群配置文件中的相应部分:

  • spec.controlPlane.nodePoolSpec
  • spec.LoadBalancer.nodePoolSpec

因此,请勿直接修改顶层控制层面和负载均衡器节点池资源。请改为修改集群配置文件中的相关部分。

集群和节点池规范中的可变字段

目前,在集群创建后,集群配置文件中只有以下集群和节点池规范字段可以更新(这些字段是可变字段):

  • 对于 Cluster 对象 (kind: Cluster),以下字段是可变的:

    • spec.anthosBareMetalVersion
    • spec.bypassPreflightCheck
    • spec.controlPlane.nodePoolSpec.nodes
    • spec.loadBalancer.nodePoolSpec.nodes
    • spec.maintenanceBlocks
    • spec.nodeAccess.loginUser
  • 对于 NodePool 对象 (kind: NodePool),以下字段是可变的:

    • spec.nodes

节点显示 NotReady 状态

在特定负载情况下,由于 pod 生命周期事件生成器 (PLEG) 运行状况不佳,Anthos clusters on Bare Metal 1.6.x 节点可能会显示 NotReady 状态。节点状态将包含以下条目:

PLEG is not healthy: pleg was last seen active XXXmXXXs ago; threshold is 3m0s

如何判断我是否受到影响?

此问题可能的原因是 runc 二进制文件版本。要确认是否安装了有问题的版本,请使用 SSH 连接到其中一个集群机器,然后运行以下命令:

/usr/bin/runc -v

如果输出为 1.0.0-rc93,则说明您安装了有问题的版本。

可能的解决方法

如需解决此问题,我们建议您升级到 Anthos clusters on Bare Metal 1.7.0 或更高版本。

如果无法升级,您可以在有问题的节点机器上将 containerd.io 软件包恢复到较早版本。为此,请使用 SSH 连接到该节点机器,然后运行以下命令:

Ubuntu

apt install containerd.io=1.4.3-1

CentOS/RHEL

dnf install containerd.io-1.3.9-3.1.el8.