解决calico-apiserver认证失败问题

 更新时间:2025年09月24日 09:16:36   作者:CN-FuWei  
文章解决Calico APIServer状态异常和命名空间删除报错问题,指出需在三台Master节点修改kube-apiserver的--requestheader-allowed-names参数,允许aggregator CN,此参数控制聚合层代理连接的客户端证书CN白名单

一、问题现象

现象一:calico-apiserver状态为False

# kubectl get apiservices.apiregistration.k8s.io
v3.projectcalico.org                calico-apiserver/calico-api   False (FailedDiscoveryCheck)   3d23h
# kubectl describe apiservices.apiregistration.k8s.io v3.projectcalico.org
...
Status:
  Conditions:
    Last Transition Time:  2025-08-21T08:35:54Z
    Message:               failing or missing response from https://172.19.226.198:5443/apis/projectcalico.org/v3: bad status from https://172.19.226.198:5443/apis/projectcalico.org/v3: 401
    Reason:                FailedDiscoveryCheck
    Status:                False
    Type:                  Available
Events:                    <none>

现象二:删除命名空间报错

# kubectl describe ns mysql-test
Name:         mysql-test
Labels:       kubernetes.io/metadata.name=mysql-test
Annotations:  <none>
Status:       Terminating
Conditions:
  Type                                         Status  LastTransitionTime               Reason                  Message
  ----                                         ------  ------------------               ------                  -------
  NamespaceDeletionDiscoveryFailure            True    Sat, 23 Aug 2025 20:26:51 +0800  DiscoveryFailed         Discovery failed for some groups, 1 failing: unable to retrieve the complete list of server APIs: projectcalico.org/v3: stale GroupVersion discovery: projectcalico.org/v3
  NamespaceDeletionGroupVersionParsingFailure  False   Sat, 23 Aug 2025 20:26:51 +0800  ParsedGroupVersions     All legacy kube types successfully parsed
  NamespaceDeletionContentFailure              False   Sat, 23 Aug 2025 20:26:51 +0800  ContentDeleted          All content successfully deleted, may be waiting on finalization
  NamespaceContentRemaining                    False   Sat, 23 Aug 2025 20:26:52 +0800  ContentRemoved          All content successfully removed
  NamespaceFinalizersRemaining                 False   Sat, 23 Aug 2025 20:26:52 +0800  ContentHasNoFinalizers  All content-preserving finalizers finished

二、排查过程

# kubectl logs -n calico-apiserver calico-apiserver-xxx --timestamps
calico-apiserver Unable to authenticate the request" error="[x509: subject with cn=front-proxy-client is not in the allowed list, verifying certificate x509: certificate signed by unknown authority

三、解决方案

三台master节点修改kube-apiserver配置:

#二进制部署:
vim /usr/lib/systemd/system/kube-apiserver.service
#kubeadm部署:
vim /etc/kubernetes/manifests/kube-apiserver.yaml
---
#新增白名单
--requestheader-allowed-names=aggregator,front-proxy-client

检查配置是否生效:

kubectl -n kube-system get cm extension-apiserver-authentication -o yaml|grep "requestheader-allowed-names"

四、问题分析

工作流程:

简单来说:

修改 --requestheader-allowed-names 参数是为了允许 Kubernetes 聚合层(API Server Aggregator)安全地代理你的请求到后续部署的扩展 API Server,而 aggregator 这个 CN(Common Name)正是这些扩展 API Server 的客户端证书必须包含的标识。

  • 例子metrics.k8s.io (由 metrics-server 提供)、custom.metrics.k8s.io (由 Prometheus Adapter 提供)、v3.projectcalico.org (由 Calico API Server 提供)。
  • 好处:用户可以使用统一的 kubectl 工具和相同的认证/授权机制来访问这些扩展功能。
  • 作用:这是一个安全白名单。它指定了在代理请求的 TLS 连接中,客户端证书的 Common Name (CN) 字段必须是什么,主 API Server 才会接受并信任这个连接。
  • 为什么是 aggregator:在二进制部署中,我们通常为聚合层功能专门创建一个客户端证书,这个证书的 CN(Common Name)字段通常就设置为 aggregator。因此,我们需要在 --requestheader-allowed-names 参数中明确允许这个 CN。
  • 如果不设置或设置错误:即使客户端证书由正确的 CA 签发,但如果 CN 不在这个白名单中,主 API Server 也会拒绝代理连接,你会看到 403 Forbidden 错误。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • docker swarm 集群故障与异常详解

    docker swarm 集群故障与异常详解

    这篇文章主要介绍了docker swarm 集群故障与异常详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Dockerfile命令参数的具体使用

    Dockerfile命令参数的具体使用

    Dockerfile是一个文本文件,包含用户构建镜像的所需要的全部命令,本文主要介绍了Dockerfile命令参数的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Docker 最常用的镜像命令和容器命令详解

    Docker 最常用的镜像命令和容器命令详解

    这篇文章主要介绍了Docker 最常用的镜像命令和容器命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • docker拉取镜像查看版本的方法步骤

    docker拉取镜像查看版本的方法步骤

    这篇文章主要介绍了docker拉取镜像查看版本的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 用Jenkins+Docker+Maven+Git实现持续集成(超详细)

    用Jenkins+Docker+Maven+Git实现持续集成(超详细)

    本文通过较大的篇幅详细介绍了Harbor这款企业级docker管理工具的使用,并通过案例演示了如何在jenkins中配置任务集成Harbor,从而实现镜像的构建推送与分发,需要的朋友可以参考下
    2024-04-04
  • docker 添加端口及获取dockerfile的方法

    docker 添加端口及获取dockerfile的方法

    这篇文章主要介绍了docker 添加端口及获取dockerfile的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Dockerfile为镜像添加SSH服务的实现步骤

    Dockerfile为镜像添加SSH服务的实现步骤

    利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题,本文主要介绍了Dockerfile为镜像添加SSH服务的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • docker使用sftp做容器化部署的方法步骤

    docker使用sftp做容器化部署的方法步骤

    本文主要介绍了docker使用sftp做容器化部署的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-07-07
  • Docker 清理的常用方法及问题

    Docker 清理的常用方法及问题

    这篇文章主要介绍了Docker 清理的常用方法及问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • MySQL docker容器数据更新统计shell脚本代码方式

    MySQL docker容器数据更新统计shell脚本代码方式

    本文介绍了如何创建和配置一个脚本文件,使其能够每隔一小时执行一次,用于更新MySQL统计信息,脚本使用Docker来执行MySQL命令,并将结果保存到文件中,文章还强调了权限设置和配置定时任务的步骤
    2025-01-01

最新评论