【问题标题】:Why cacerts update is needed in Kubernetes为什么 Kubernetes 需要更新 cacerts
【发布时间】:2018-11-01 03:08:02
【问题描述】:

在 GKE 或 GCE 中运行的容器内从 Google 存储桶读取文件时。以下代码失败:

public String readSmallTextFileFromBucket(String bucketName, String textFile) {

        Blob blob = storage.get(bucketName, textFile);
        String fileContent = new String(blob.getContent());
        return fileContent;
        }

出现错误:

com.google.cloud.storage.StorageException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

如果我将下载 OpenJDK 时获得的默认 java/jdk-10.0.2/lib/security/cacerts 文件替换为我桌面上的文件,则上面的代码可以正常工作。

这是为什么呢?让 Java API 从容器中读取存储桶的正确方法是什么?

【问题讨论】:

    标签: java google-cloud-storage google-kubernetes-engine


    【解决方案1】:

    默认情况下,许多基本容器映像可能不包含通常安装在每台计算机上的 CA 证书。 (因为不是每个人都需要在容器中使用 TLS。)您通常需要在 Dockerfile 中“apt-get install”或类似的东西来安装这些证书。

    如果容器中没有 CA 证书,您的代码将无法信任 storage.googleapis.com。

    在此答案中查看将 CA 证书添加到您的容器所需的命令:https://superuser.com/a/633853/35769 理想情况下,您不应从桌面计算机复制这些证书。

    【讨论】:

    • 我的 docker 文件是从 tensorflow/tensorflow:1.12.0-rc2-gpu 构建的,我添加了 RUN apt-get install ca-certificates \ && update-ca-certificates 但是发生了同样的错误。 gcloud builds submit 的输出表明已经安装了最新的证书。
    • 公平点,我不熟悉 Java 是如何做到这一点的。但请注意,这适用于大多数使用 Docker 的人。也许向 Tensorflow 的 dockerfile 存储库打开一个问题。另外问题可能不仅仅是 GCE/GKE,你能在你的 Java 代码中查询 https 网站吗?
    【解决方案2】:

    此问题已通过更改 2 项得到解决。
    a) 将 storage-rw 添加到集群范围和
    b) 我创建 kubernetes 密码的方式有误

    不知道替换 cacerts 文件如何或为什么会有所帮助,但上述 2 个修复是正确的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 2020-06-16
      • 1970-01-01
      • 2019-08-26
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多