自建Harbor镜像仓库没有开启HTTPS导致Kubernetes(简称K8s)无法拉取镜像的问题是常见的情况。本文将通过以下步骤向刚入行的小白介绍如何解决这个问题。

整体步骤

下面是解决“自建Harbor镜像仓库没有开启HTTPS导致K8s拉取镜像失败”的流程:

步骤 操作
步骤一 生成自签名证书
步骤二 在Harbor中启用HTTPS
步骤三 配置K8s使用自建Harbor镜像仓库

接下来我们将详细介绍每一步需要做什么,包括使用的代码和注释。

步骤一:生成自签名证书

在自建Harbor镜像仓库中启用HTTPS需要使用SSL证书。由于我们是自建的镜像仓库,可以使用自签名证书。

为了生成证书,我们需要使用openssl命令行工具。在命令行中执行以下代码:

openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor.key -x509 -days 365 -out harbor.crt

这段代码将生成一个自签名证书,有效期为365天。harbor.key是私钥文件,harbor.crt是证书文件。

步骤二:在Harbor中启用HTTPS

在步骤一中生成自签名证书后,我们需要在Harbor中启用HTTPS。登录到Harbor的管理界面,按照以下步骤进行操作:

  1. 点击“管理”菜单,选择“证书”。
  2. 在“证书”页面,点击“新建证书”。
  3. 在“证书”配置页面,选择“自定义证书”,将harbor.keyharbor.crt文件上传到相应的输入框中。
  4. 点击“保存”按钮,完成证书的配置。

步骤三:配置K8s使用自建Harbor镜像仓库

在K8s中配置使用自建Harbor镜像仓库需要修改K8s中的镜像拉取凭证。执行以下操作:

  1. 创建一个harbor.yaml文件,并添加以下内容:

    apiVersion: v1
    kind: Secret
    metadata:
      name: harbor-registry-secret
      namespace: default
    data:
      .dockerconfigjson: <base64-encoded-config-json>
    type: kubernetes.io/dockerconfigjson
    

    <base64-encoded-config-json>替换为经过base64编码的Docker配置文件内容。Docker配置文件的格式如下:

    {
      "auths": {
        " {
          "username": "<username>",
          "password": "<password>",
          "auth": "<base64-encoded-auth>"
        }
      }
    }
    

    将`

    echo -n '<username>:<password>' | base64
    

    运行以上命令后,将输出的结果作为<base64-encoded-auth>的值。

  2. 执行以下命令将harbor.yaml中的配置添加到K8s中:

    kubectl apply -f harbor.yaml
    

    这将创建一个K8s的Secret资源,用于存储Harbor的认证信息。

  3. 更新K8s的默认ServiceAccount,以使用新创建的Secret:

    kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "harbor-registry-secret"}]}'
    

    这将将新创建的Secret与默认ServiceAccount关联起来,使其成为默认的镜像拉取凭证。

至此,我们完成了解决“自建Harbor镜像仓库没有开启HTTPS导致K8s拉取镜像失败”的步骤。

接下来我们将使用类图展示这些步骤中的关键类和它们之间的关系。