解决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与FastDFS的安装命令及使用

    详解Docker与FastDFS的安装命令及使用

    这篇文章主要介绍了详解Docker与FastDFS的安装命令及使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Docker Compose网络配置指南分享

    Docker Compose网络配置指南分享

    本文详细介绍了Docker网络配置的各个方面,包括基础网络架构、自定义网络配置、典型场景配置、高级网络技巧、调试与诊断以及最佳实践,通过多个实战案例和常见问题解决方案,帮助读者更好地理解和应用Docker网络技术
    2025-11-11
  • 基于docker部署Jenkins的详细教程

    基于docker部署Jenkins的详细教程

    这篇文章主要介绍了基于docker部署Jenkins,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Docker运行模式之-d和-it的区别与选择详细对比

    Docker运行模式之-d和-it的区别与选择详细对比

    这篇文章主要介绍了Docker运行模式之-d和-it的区别与选择详细对比的相关资料,Docker中-d用于后台运行服务,不阻塞终端;-it提供交互终端,支持用户操作,需要的朋友可以参考下
    2025-05-05
  • 如何使用docker搭建chromium

    如何使用docker搭建chromium

    这篇文章主要介绍了如何使用docker搭建chromium,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • 如何实现不同网段docker容器网络互通

    如何实现不同网段docker容器网络互通

    文章讲解了通过Docker bridge网络实现容器间通信的方法,包括关闭防火墙、拉取busybox镜像、创建容器并测试IP连通性,使用--link参数连接容器,以及跨网段通信的配置技巧
    2025-07-07
  • docker unexpected EOF问题及解决过程

    docker unexpected EOF问题及解决过程

    本文介绍了Docker pull命令出现unexpected EOF错误的解决方法,主要是编辑daemon.json设置下载并发限制,重启Docker后多次执行pull命令直至下载成功
    2026-05-05
  • 深入浅析Docker容器中的Patroni

    深入浅析Docker容器中的Patroni

    今天将向大家介绍,如何搭建容器下的Patroni集群环境,Patroni作为开箱即用PG高可用工具,越来越多的被各个厂商用于云环境下使用
    2021-11-11
  • docker实现ES+Kibana方式

    docker实现ES+Kibana方式

    这篇文章主要介绍了docker实现ES+Kibana方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • 阿里云服务器部署 Docker Swarm集群

    阿里云服务器部署 Docker Swarm集群

    这篇文章主要介绍了阿里云服务器部署 Docker Swarm集群,Docker Swarm 的作用就是用来管理Docker集群的平台,本文给大家介绍了Docker Swarm的基本概念和Docker Swarm 和 k8s的区别,需要的朋友可以参考下
    2022-07-07

最新评论