通过Nginx反向代理访问K3s API Server遇401未授权问题求助
Kube API Server反向代理后401未授权的排查方案
以下是几个最可能导致问题的原因及对应的解决方法:
1. API Server TLS证书未包含自定义域名
k3s默认生成的API Server证书,其Subject Alternative Names(SAN)列表只包含集群内部IP、节点主机名、localhost这类默认标识,不会自动添加你自定义的kube.domain.com。当kubectl通过域名发起请求时,API Server会验证请求的ServerName是否在证书SAN范围内,不匹配会直接导致认证失败,返回401。
解决步骤:
- 编辑k3s的systemd服务配置(路径通常为
/etc/systemd/system/k3s.service),在启动参数中追加--tls-san kube.domain.com - 重启k3s服务:
sudo systemctl daemon-reload && sudo systemctl restart k3s - 更新本地kubectl的kubeconfig,确保使用新生成的CA证书:
sudo k3s kubectl config view --raw > ~/.kube/config
2. Nginx未正确转发认证请求头
kubectl访问API Server时,认证信息(比如Bearer Token)是通过Authorization请求头传递的。默认情况下Nginx不会自动转发这个头,导致API Server收不到认证凭证,返回401。
解决步骤:
在Nginx配置的location /块中添加以下配置:
proxy_set_header Authorization $http_authorization;
如果你的kubectl使用客户端证书认证,还需要让Nginx把客户端证书信息传递给API Server,追加:
proxy_set_header X-SSL-CERT $ssl_client_cert;
同时要确保Nginx开启SSL并要求客户端证书(若用证书认证),在server块中补充:
listen 443 ssl; ssl_certificate /path/to/your/domain-cert.pem; ssl_certificate_key /path/to/your/domain-key.pem; ssl_verify_client on; ssl_client_certificate /path/to/k3s-ca.pem;
3. API Server日志排查具体错误
如果上面的方法都没解决,直接查看k3s API Server的日志,定位具体的401原因:
sudo journalctl -u k3s -f | grep -i "401\|unauthorized"
日志可能会提示证书不匹配、认证凭证无效、IP白名单限制等具体问题,根据提示调整即可。
4. kubectl kubeconfig配置校验
检查你的kubeconfig文件:
- 确保
server字段设置为正确的地址(比如https://kube.domain.com,如果Nginx开启了SSL) - 如果用HTTP访问(不推荐生产),需要添加
insecure-skip-tls-verify: true - 确认kubeconfig中的CA证书是k3s最新生成的(包含域名SAN的版本)
内容的提问来源于stack exchange,提问作者Nopzen
相关产品推荐
相关产品推荐

