背景:

在导入外部集群到rancher时,cattle-cluster-agent报错

level=fatal msg="looking up cattle-system/cattle ca/token: no secret exists for service account cattle-system/cattle"

环境:

应用 信息
Kubernetes v1.25.7
Rancher v2.6.6

解决

经查,K8s在版本v1.24启用新测试功能特性-LegacyServiceAccountTokenNoAutoGeneration,默认是开启的。

服务账号(Service Account)是一种自动被启用的用户认证机制,使用经过签名的持有者令牌来验证请求。

服务账号通常由 API 服务器自动创建并通过 ServiceAccount 准入控制器关联到集群中运行的 Pod 上。 持有者令牌会挂载到 Pod 中可预知的位置,允许集群内进程与 API 服务器通信。 服务账号也可以使用 Pod 规约的 serviceAccountName 字段显式地关联到 Pod 上。

我们可以通过k8s 组件上指定的各种特性开关控制 - 【特性门控是描述 Kubernetes 特性的一组键值对。你可以在 Kubernetes 的各个组件中使用 –feature-gates 标志来启用或禁用这些特性。】 关闭该特性:

打开 /etc/kubernetes/manifest/kube-controller-manager.yml的 spec.container.command中增加

- --feature-gates=LegacyServiceAccountTokenNoAutoGeneration=false

修改完,例如:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    component: kube-controller-manager
    tier: control-plane
  name: kube-controller-manager
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=0.0.0.0
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=1.2.0.0/10
    - --cluster-name=kubernetes
    - --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
    - --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
    - --controllers=*,bootstrapsigner,tokencleaner
    - --feature-gates=EphemeralContainers=true
    - --kubeconfig=/etc/kubernetes/controller-manager.conf
    - --leader-elect=true
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --root-ca-file=/etc/kubernetes/pki/ca.crt
    - --service-account-private-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.88.0.0/22
    - --use-service-account-credentials=true
    - --feature-gates=LegacyServiceAccountTokenNoAutoGeneration=false
    ...

重启 kube-controller-manager,ps:如果是多个master,需要每个都修改。

小结

本文记录导入外部集群到rancher时,遇到的用户认证密钥不正确的问题。回顾k8s在1.23~1.25的更新日志,以及查阅issues,原因是1.24启用了新测试特性LegacyServiceAccountTokenNoAutoGeneration,该特性使用经过签名的持有者令牌来验证请求。可以通过k8s组件上指定的各种特性开关控制来关闭此特性来解决报错,最终正常导入到rancher。

参考