我正在使用 Kubernetes,并且最近更新了
kubeconfig
中使用的管理证书。然而,在我这样做之后,所有 helm
命令都失败了:
Error: Get https://cluster.mysite.com/api/v1/namespaces/kube-system/pods?labelSelector=app%3Dhelm%2Cname%3Dtiller: x509: certificate signed by unknown authority
kubectl
按预期工作:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-10-1-0-34.eu-central-1.compute.internal Ready master 42d v1.7.10+coreos.0
ip-10-1-1-51.eu-central-1.compute.internal Ready master 42d v1.7.10+coreos.0
ip-10-1-10-120.eu-central-1.compute.internal Ready <none> 42d v1.7.10+coreos.0
ip-10-1-10-135.eu-central-1.compute.internal Ready <none> 27d v1.7.10+coreos.0
ip-10-1-11-71.eu-central-1.compute.internal Ready <none> 42d v1.7.10+coreos.0
ip-10-1-12-199.eu-central-1.compute.internal Ready <none> 8d v1.7.10+coreos.0
ip-10-1-2-110.eu-central-1.compute.internal Ready master 42d v1.7.10+coreos.0
据我所知,
helm
应该使用与kubectl
相同的证书,这让我很好奇kubectl
是如何工作的,但helm
却没有?
这是一个生产集群,内部版本通过 Helm Chart 进行处理,因此解决这个问题势在必行。
任何提示将不胜感激。
作为解决方法,您可以尝试禁用证书验证。 Helm 使用 kube 配置文件(默认情况下
~/.kube/config
)。您可以为 insecure-skip-tls-verify: true
部分添加 cluster
:
clusters:
- cluster:
server: https://cluster.mysite.com
insecure-skip-tls-verify: true
name: default
您是否已尝试重新安装 helm/tiller?
kubectl delete deployment tiller-deploy --namespace kube-system
helm init
还要检查您是否在集群配置中配置了无效的证书。
就我而言,我正在运行单个自我管理,并且配置文件也是容器 ca 文件,因此上述答案将引发以下错误
Error: Kubernetes cluster unreachable: Get "https://XX.XX.85.154:6443/version?timeout=32s": x509: certificate is valid for 10.96.0.1, 172.31.25.161, not XX.XX.85.154
我的配置是
- cluster:
certificate-authority-data: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
server: https://54.176.85.154:6443
insecure-skip-tls-verify: true
所以我必须删除
certificate-authority-data
。
- cluster:
server: https://54.176.85.154:6443
insecure-skip-tls-verify: true
使用
--insecure-skip-tls-verify
通过命令行跳过 tls 验证
helm repo add stable --insecure-skip-tls-verify https://charts.helm.sh/stable
在我的例子中,错误是由 Helm 存储库中不受信任的证书引起的。 下载证书并使用
--ca-file
选项指定它解决了该问题(至少在 Helm 版本 3 中)。
helm repo add --ca-file /path/to/certificate.crt repoName https://example/repository
字符串,使用此 CA 捆绑包验证启用 HTTPS 的服务器的证书--ca-file
将 -cluster 下面的行添加到 /home/centos/.kube/config 文件解决了我的问题
insecure-skip-tls-verify: true
解决了我的问题。
我的配置文件现在看起来像这样。
apiVersion: v1
clusters:
- cluster:
certificate-authority: /home/centos/.minikube/ca.crt
extensions:
- extension:
last-update: Tue, 02 Nov 2021 20:51:44 EDT
provider: minikube.sigs.k8s.io
version: v1.23.2
name: cluster_info
server: https://192.168.49.2:8443
insecure-skip-tls-verify: true
name: minikube
contexts:
我遇到了一个极端情况。如果 KUBECONFIG 变量中引用了多个 kubeconfig 文件,并且多个文件具有同名的集群,您也可能会收到此错误。
对于我的情况,在我升级到 helm v.3.9.0 后,它是旧版本的 helm(在我的情况下是 v.3.6.3)
brew upgrade helm
一切都恢复正常了。
如果您使用的是 minikube,问题可能与此处描述的问题有关:https://minikube.sigs.k8s.io/docs/handbook/vpn_and_proxy/#x509-certificate-signed-by-unknown-authority
如果您使用 Rancher Desktop,解决方案是在计算机上安装所需的证书。
虽然使用 --ca-file 添加存储库可以做到这一点,但当它尝试使用下面发布的命令从该存储库下载时,我仍然得到 x509:由未知权威机构签名的证书
helm dependency update helm/myStuff
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "myRepo" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 18 charts
Downloading myService from repo https://myCharts.me/
Save error occurred: could not download https://myCharts.me/stuff.tgz ...
x509: certificate signed by unknown authority
Deleting newly downloaded charts, restoring pre-update state
除了使用 --ca-file 添加存储库之外,我需要做的是下载存储库证书并将其安装为当前用户:
安装证书后我还需要重新启动计算机。重新启动后,当您打开浏览器并粘贴存储库 URL 时,它应该会连接,而不会发出警告并信任该站点(这样您就知道您已成功安装证书)。
您可以继续运行命令,这次应该会选择证书。
helm dependency update helm/myStuff
....
Saving 18 charts
Downloading service1 from repo https://myCharts.me/
Downloading service2 from repo https://myCharts.me/
....