Helm 从 pod 内部使用“x509:由未知机构签名的证书”获取错误

Posted

技术标签:

【中文标题】Helm 从 pod 内部使用“x509:由未知机构签名的证书”获取错误【英文标题】:Helm fetch errors out with "x509: certificate signed by unknown authority" from inside the pod 【发布时间】:2019-11-29 10:44:36 【问题描述】:

我正在尝试使用 client-go 编写 helm 操作符,并希望使用 RepoURLchartname 从我的控制器中获取图表。我编写了一段示例代码,在我的本地机器上运行良好。但是当我在容器内运行相同的代码时,相同的代码会引发错误。请找到以下代码:

func FetchURL() error 
    repoURL := "https://kubernetes-charts.storage.googleapis.com"
    username := ""
    password := ""
    var settings environment.EnvSettings
    flags := pflag.NewFlagSet("helm-env", pflag.ContinueOnError)
    settings.AddFlags(flags)
    settings.Init(flags)
    getters := getter.All(settings)

    getters := getter.All(settings)

    var err error
    destDir, err := ioutil.TempDir("", "helm-")
    if err != nil 
        return fmt.Errorf("Failed to untar: %s", err)
    
    defer os.RemoveAll(destDir)

    chartURL, err := repo.FindChartInAuthRepoURL(repoURL, username, password, chartRef, "", "", "", "", getter.All(settings))
    if err != nil 
        return fmt.Errorf("Error finding the Chart URL: %s", err)
    
    fmt.Println(chartURL)
    return nil

上述函数在获取chartURL时抛出以下错误:

Fetching Chart
Error finding the Chart URL: Looks like "https://kubernetes-charts.storage.googleapis.com" is not a valid chart repository or cannot be reached: Get https://kubernetes-charts.storage.googleapis.com/index.yaml: x509: certificate signed by unknown authority

我知道它要求一些 ca 证书,但我不确定哪个 ca 证书,因为我已经初始化了没有 tls 证书的 helm。

我还尝试将 helm 二进制文件复制到 pod 内并尝试运行:

helm init --client-only
helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Unable to get an update from the "stable" chart repository (https://kubernetes-charts.storage.googleapis.com):
    Get https://kubernetes-charts.storage.googleapis.com/index.yaml: x509: certificate signed by unknown authority
...Unable to get an update from the "bitnami" chart repository (https://charts.bitnami.com/bitnami):
    Get https://charts.bitnami.com/bitnami/index.yaml: x509: certificate signed by unknown authority
Update Complete.

我在那里也面临同样的问题。有没有人遇到过类似的问题?

【问题讨论】:

【参考方案1】:

不,我没有看到这个问题。

注意:域kubernetes-charts.storage.googleapis.com 的证书由已知CA(Google 信任服务)颁发。和charts.bitnami.com的一样(Amazon CA发布),所以你只需要调试一下就可以看到:

    在 pod 内访问时,哪个 CA 向该域颁发证书。例如,运行命令curl -vI https://charts.bitnami.com/ 如果证书颁发者是应有的,您可能需要更新 pod 的基本映像以包含更新的已知 CA 证书。如果不是(例如,charts.bitnami.com 的证书是自签名的),这是典型的 DNS 中毒(pod 的名称服务器将上述域解析为不同的域) 检查您的 pod 的名称服务器。如果您不信任 k8s worker DNS,您可以为您的 pod 自定义名称服务器。见https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

【讨论】:

是的,这是我的容器中缺少 ca 的情况。我需要在我的容器中的 /etc/ssl/certs 上安装由 repo 发布的 ca,然后它就可以工作了。感谢您的指点。

以上是关于Helm 从 pod 内部使用“x509:由未知机构签名的证书”获取错误的主要内容,如果未能解决你的问题,请参考以下文章

k8s 部署 skywalking 并将 pod 应用接入链路追踪

K8s通过Helm部署入门

helm install 后 Grafana pod 不断重启

玩转 Helm

如何使用 nginx 入口将流量从 route53 中的域转发到 pod?

kubernetes:pod无法删除