导入k8s集群到rancher报错no Secret Assigned to Service Account Cattle System
背景:
在导入外部集群到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。