AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1020310
Accepted
CodeChimp
CodeChimp
Asked: 2020-06-07 09:22:41 +0800 CST2020-06-07 09:22:41 +0800 CST 2020-06-07 09:22:41 +0800 CST

如何向 Kubernetes 添加证书以允许从自定义 Harbor 存储库中提取图像?

  • 772

我正在寻找有关如何添加要在 Pod 本身中使用的证书的各种演练,但我似乎找不到有关如何设置 Kubernetes 以允许自签名证书从内部运行的 Harbor 实例中提取图像的信息集群。我已将 ca 证书导入系统的受信任证书(系统运行的是 Ubuntu 18.04),但我猜 Kubernetes 在某处使用它自己的受信任证书存储,类似于 Java 忽略系统的受信任证书并依赖密钥库文件的方式?

编辑 更具体地说,我要做的是部署一个自定义 Docker 映像,该映像存储在我的 Harbor 实例中,该实例在我的 Kubernetes 集群中运行。我将 Harbor 的证书导入到我的主机系统操作系统中,我可以运行:

docker login <url_to_harbor>
docker pull <url_to_harbor>/library/custom/image:latest

它在 CLI 中运行良好,但如果我尝试像这样创建部署 yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: custom
  template:
    metadata:
      labels:
        app: custom
    spec:
      containers:
      - name: custom
        image: <url_to_harbor>/library/custom/image:latest
...

并运行kubectl apply -f custom-deploy.yaml当我得到 pod 时出现以下错误:

custom-deployment-6ff68947f6-8jj2p            0/1     ImagePullBackOff   0          13s

如果我得到关于失败 pod 的描述,我会看到:

  Warning  Failed          18s                kubelet, node3     Failed to pull image "<url_to_harbor>/library/custom/image:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://<url_to_harbor>/v2/: x509: certificate signed by unknown authority
  Warning  Failed          18s                kubelet, node3     Error: ErrImagePull

自从导入 CA 证书以来,我已经重新启动了主机。我通过将根 CA 证书文件移动到/usr/local/share/ca-certificates然后运行来添加证书sudo update-ca-certificates。

certificate-authority kubernetes ubuntu-18.04 self-signed-certificate
  • 2 2 个回答
  • 4979 Views

2 个回答

  • Voted
  1. Best Answer
    oldgiova
    2020-06-09T03:31:16+08:002020-06-09T03:31:16+08:00

    导入 CA 证书的方法是正确的,但是你必须在每个集群节点上都这样做:所有的 master 和 worker。Kubernetes 仅依赖于安装在底层操作系统上的 CA。

    • 3
  2. NoUserException
    2022-08-06T14:28:49+08:002022-08-06T14:28:49+08:00

    如果您可能不想在每个节点上安装 CA 证书,您还可以运行配置 ca 证书的 DaemonSet。请注意,这仅在 Kubernetes 配置了 containerd 运行时才有效。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: trusted-ca
      namespace: kube-system
    data:
      ca.crt: |+
        -----BEGIN CERTIFICATE-----
        ...
        -----END CERTIFICATE-----
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: setup-script
      namespace: kube-system
    data:
      setup.sh: |
        echo "$TRUSTED_CERT" > /usr/local/share/ca-certificates/ca.crt && update-ca-certificates && systemctl restart containerd
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      namespace: kube-system
      name: node-custom-setup
      labels:
        k8s-app: node-custom-setup
    spec:
      selector:
        matchLabels:
          k8s-app: node-custom-setup
      template:
        metadata:
          labels:
            k8s-app: node-custom-setup
        spec:
          hostPID: true
          hostNetwork: true
          initContainers:
          - name: init-node
            command: ["nsenter"]
            args: ["--mount=/proc/1/ns/mnt", "--", "sh", "-c", "$(SETUP_SCRIPT)"]
            image: debian
            env:
            - name: TRUSTED_CERT
              valueFrom:
                configMapKeyRef:
                  name: trusted-ca
                  key: ca.crt
            - name: SETUP_SCRIPT
              valueFrom:
                configMapKeyRef:
                  name: setup-script
                  key: setup.sh
            securityContext:
              privileged: true
          containers:
          - name: wait
            image: k8s.gcr.io/pause:3.1
    

    来源:http ://hypernephelist.com/2021/03/23/kubernetes-containerd-certificate.html

    这些说明是在 containerd 1.5中的 cri 中实现主机注册表目录之前编写的,因此如果运行新版本,可能无需重新启动即可配置。请参阅注册表配置 - 简介。

    最后,如果您在云管理的集群上运行,它们可能会提供用于管理 CA 证书的自定义配置。例如,AKS - 自定义 CA

    • 0

相关问题

  • Root CA 是否需要在线?

  • Windows 2003 域 - 证书颁发机构 - 新的自动证书请求

  • 从 AD 中删除证书服务器

  • svn 不会接受我的无效证书

  • CA XCOM 数据传输 - XCOMU0474E xcomd 已在运行。不支持多个实例

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve