背景:

在导入外部集群到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。

参考

访问Rancher后台提示“证书无效”。

排查原因是由于挂载的ssl证书失败,rancher启用了生成的默认 CA 证书。这里打算 更新为公认的 CA 签名证书,其中

  1. Rancher版本 v2.6.6
  2. Racher为Docker单节点安装

解决步骤

考虑到单机版是没有Volume的,为了保证数据不丢失。处理大致分为以下几个步骤

  1. 从你的 Rancher 服务器容器创建数据的副本
  2. 创建一个备份压缩包
  3. 使用新的证书 启动新的Rancher服务器容器

1. 从你的 Rancher 服务器容器创建数据的副本

1.1 停止当前运行 Rancher 服务器的容器。替换<RANCHER_CONTAINER_NAME>为您的 Rancher 容器的名称

运行停止RancherDocker

docker stop <RANCHER_CONTAINER_NAME>
1.2 使用以下命令替换每个占位符,从您刚刚停止的 Rancher 容器创建一个数据容器。
docker create --volumes-from <RANCHER_CONTAINER_NAME> --name rancher-data rancher/rancher:<RANCHER_CONTAINER_TAG>

2. 创建一个备份压缩包

从您刚刚创建的数据容器 ( rancher-data),创建一个备份 tarball ( rancher-data-backup-<RANCHER_VERSION>-.tar.gz)。如果升级期间出现问题,此 tarball 将用作回滚点。使用以下命令,替换每个占位符。

docker run --volumes-from rancher-data -v "$PWD:/backup" --rm busybox tar zcvf /backup/rancher-data-backup-<RANCHER_VERSION>-<DATE>.tar.gz /var/lib/rancher

3. 启动新的Rancher服务器容器

如果您选择使用由公认的 CA 签名的证书,您将添加–volumes-from rancher-data到您启动原始 Rancher 服务器容器的命令中,并且需要访问您最初安装时使用的相同证书。请记住将–no-cacerts作为参数包含在容器中以禁用 Rancher 生成的默认 CA 证书。

docker run -d --volumes-from rancher-data \
  --restart=unless-stopped \
  -p 80:80 -p 443:443 \
  -v /[your-workspace]/certs:/etc/rancher/ssl \ 
  --privileged \
  rancher/rancher:v2.6.6 \
  --no-cacerts

这里的 [your-workspace]替换为你的证书存放路径。其中包括 cert.pem 和 key.pem

再访问rancher dashboard,提示“有效证书”。

参考

问题描述:

在Rancher导入外部k8s集群 ,导入的集群一直处于“pending”状态。

这里简要记录一下排查过程和临时解决办法。

问题环境

  • rancher v2.6.6
  • kubernetes v1.24
  • vm1 ubuntu (rancer)
  • vm2-3-4 k8s集群

导入步骤:“集群”–“添加”–“集群名称”–创建–

排查&解决

Rancher 通过 CusterAgent 与集群进行通信(通过cattle-cluster-agent调用 Kubernetes API 与集群通讯),并通过cattle-node-agent与节点进行通信。如果 cattle-cluster-agent 无法连接到已有的 Rancher Server 也就是server-url,集群将保留在 Pending 状态。

1 . 在k8smaster节点上面,查看ClusterAgent的pod状态是否正常,默认的namespace为“cattle-system”

kubectl get pods -n cattle-system

root@k8s-master:~# kubectl get pods -n cattle-system
NAME                             READY   STATUS    RESTARTS   AGE
cattle-cluster-agent-79749...   1/0     Pending   0              8m52s
cattle-cluster-agent-79749...   1/0     Pending   0              5m21s

看到pod未正常启动

2. 进一步查看pod错误日志

kubectl logs -f [contariner-id] -n cattle-system

root@k8s-master:~# kubectl logs -f cattle-cluster-agent-79749... -n cattle-system
...
no secret assigned to service account cattle-system/rancher
...
3. 查找error处理办法

通过查阅官方issures有提到

2.6.6版本说明建议:

Rancher v2.6.6是v2.6.5的镜像版本,只做了一个修改,以解决以下问题:

-当Rancher试图控制来自下游集群的大量流量时,出现了一个主要的性能问题。这种机制没有正确地处理断开,并将导致无限锁定。看到# 37250。

所以我猜他们没有在这个版本中添加K8S 1.24兼容性,因为v2.6.6中的兼容版本是:

  • v1.18.20-rancher1-3
  • v1.19.16-rancher1-5
  • v1.20.15-rancher1-3
  • v1.21.12-rancher1-1
  • v1.22.9-rancher1-1
  • v1.23.6-rancher1-1

Rancher 2.6.6 不支持 1.24。根据在此问题上设置的里程碑,计划为 2.6.7 提供支持。

4.尝试回滚版本

回滚k8s版本v1.23,rancher重新导入集群,再查看pods状态

kubectl get pods -n cattle-system
NAME                                    READY   STATUS    RESTARTS   AGE
cattle-cluster-agent-79749...   1/1     Running   0          8m52s
cattle-cluster-agent-79749...   1/1     Running   0          5m21s

回到rancher查看导入的k8s状态为 “Active”

至此,问题已暂时解决。持续关注Rancher2.6.7版本。

参考

jefffff

Stay hungry. Stay Foolish COOL

Go backend developer

China Amoy