仓库配置

镜像仓库配置文件

你可以通过在 registries.yaml 文件中指定镜像仓库,并在创建集群时引用该文件来添加镜像仓库:k3d cluster create mycluster --registry-config "/home/YOU/my-registries.yaml"。 这个文件是一个常规的 K3s 镜像仓库配置文件,其内容大致如下:

mirrors:
  "my.company.registry:5000":
    endpoint:
      - http://my.company.registry:5000

在这个示例中,像 my.company.registry:5000/nginx:latest 这样的镜像会从运行在 http://my.company.registry:5000 的镜像仓库中拉取。

这个文件还可用于提供访问某些镜像仓库所需的额外信息,例如身份验证信息和证书。

嵌入在 k3d 简单配置文件中的镜像仓库配置文件

如果你使用简单配置文件(SimpleConfig)来配置 k3d 集群,也可以直接将 registries.yaml 嵌入其中:

apiVersion: k3d.io/v1alpha5
kind: Simple
metadata:
  name: test
servers: 1
agents: 2
registries:
  create: 
    name: myregistry
  config: |
    mirrors:
      "my.company.registry":
        endpoint:
          - http://my.company.registry:5000

在这里,通过 create: {...} 选项创建的由 k3d 管理的镜像仓库的配置,将与 config: | 下指定的配置合并。

需认证的镜像仓库

在使用需要认证的镜像仓库时,我们可以在 registries.yaml 文件的 configs 部分添加用户名和密码,示例如下:

mirrors:
  my.company.registry:
    endpoint:
      - http://my.company.registry
 
configs:
  my.company.registry:
    auth:
      username: aladin
      password: abracadabra

安全的镜像仓库

使用安全的镜像仓库时,registries.yaml 文件必须包含证书相关信息。例如,若要从运行在 https://my.company.registry 的安全镜像仓库使用镜像,你首先要下载该服务器的有效 CA 文件,并将其存放在如 ${HOME}/.k3d/my-company-root.pem 这样知名的目录下。

接着,你得把 CA 文件挂载到集群节点的某个目录下,并将挂载后的文件信息添加到 registries.yaml 文件的 configs 部分。 例如,若将 CA 文件挂载到 /etc/ssl/certs/my-company-root.pemregistries.yaml 文件内容如下:

mirrors:
  my.company.registry:
    endpoint:
      - https://my.company.registry
 
configs:
  my.company.registry:
    tls:
      # 我们会把 "my-company-root.pem" 挂载到 /etc/ssl/certs/ 目录下
      ca_file: "/etc/ssl/certs/my-company-root.pem"

最后,我们可以创建集群,并将 CA 文件挂载到 ca_file 指定的路径:

k3d cluster create \
  --volume "${HOME}/.k3d/my-registries.yaml:/etc/rancher/k3s/registries.yaml" \
  --volume "${HOME}/.k3d/my-company-root.pem:/etc/ssl/certs/my-company-root.pem"

使用本地镜像仓库

前言:引用本地镜像仓库

在接下来的部分,你将创建一个本地镜像仓库(即运行在 Docker 主机容器中的容器镜像仓库)。

该容器会有一个名称,例如 mycluster-registry。

如果你严格按照指南操作(或者如果你使用由 k3d 管理的选项,那就肯定没问题),这个名称对于 k3d 集群中的所有主机(K3s 容器)和工作负载都是已知的。

然而,你通常希望从本地机器将镜像推送到该仓库,而默认情况下,本地机器并不知道这个名称。

现在你有几个选择,包括以下三种:

使用localhost:由于容器会有一个端口映射到你的本地主机,你可以直接通过例如 localhost:12345 来引用它,其中 12345 是映射的端口。

之后从仓库拉取镜像时,只有仓库路径(例如 mycluster-registry:5000/myrepo/myimage:mytag 中的 myrepo/myimage:mytag)对于在目标仓库中找到你的镜像才是重要的。

让你的机器知道容器名称:为此,你可以使用传统的主机文件(Unix 系统上是 /etc/hosts,Windows 上是 C:\windows\system32\drivers\etc\hosts),在文件末尾添加如下条目:

127.0.0.1 mycluster-registry

使用一些特殊的解析技巧:像 dnsmasqnss-myhostname(见下面的信息框)等工具可以设置本地解析器,将镜像仓库名称直接解析为 127.0.0.1

使用 nss-myhostname 解析 *.localhost
幸运的是(对于 Linux 用户而言),许多 Linux 发行版都预装了 nss-myhostname,它应该会自动将 *.localhost 解析为 127.0.0.1。
否则,可以使用 sudo apt install libnss-myhostname 进行安装。

使用 k3d 管理的镜像仓库

与集群一同创建专用镜像仓库

执行 k3d cluster create mycluster --registry-create mycluster-registry 命令,它会创建名为 mycluster 的集群,同时创建一个名为 mycluster-registry 的镜像仓库容器。

k3d 会对集群进行全面配置,借助 registries.yaml 文件让 containerd 能够从该镜像仓库拉取镜像。

镜像仓库监听的端口会映射到你主机系统的一个随机端口。

你可以查看 k3d 命令的输出,或者使用 docker ps -f name=mycluster-registry 命令来找出暴露的端口。

完成上述操作后,你可以对镜像仓库进行测试。

创建自定义的 k3d 管理的镜像仓库

运行 k3d registry create myregistry.localhost --port 12345 命令,会创建一个名为 k3d-myregistry.localhost 的新镜像仓库(可以利用 *.localhost 的自动解析功能,详见下一节内容。同时要注意,k3d 会为其创建的所有资源添加 k3d- 前缀)。

接着,执行 k3d cluster create newcluster --registry-use k3d-myregistry.localhost:12345 命令(确保在此处使用 k3d- 前缀),该命令会创建一个新的集群,并将其配置为使用这个镜像仓库。

同样,完成这些步骤后,你可以对镜像仓库进行测试。

使用你自己的(非 k3d 管理的)本地镜像仓库

我们建议使用 k3d 管理的镜像仓库,因为它能与 k3d 集群完美配合。不过,如果你需要 k3d 未提供的功能或定制化选项,下面为你提供创建自己的(非 k3d 管理的)镜像仓库的指南:

使用你自己的(非 k3d 管理的)本地镜像仓库

你可以使用一些 Docker 命令来启动自己的本地镜像仓库,例如:

docker volume create local_registry
docker container run -d --name registry.localhost -v local_registry:/var/lib/registry --restart always -p 12345:5000 registry:2

这些命令会启动一个镜像仓库容器,在你的主机上其名称和端口为 registry.localhost:12345。为了能向这个镜像仓库推送镜像,你需要按照下一节的描述让它变得可访问。

一旦你的镜像仓库启动并运行,我们需要将它添加到你的 registries.yaml 配置文件中。

最后,你需要将镜像仓库网络连接到 k3d 集群网络:docker network connect k3d-k3s-default registry.localhost

然后你就可以测试你的本地镜像仓库了。

测试你的镜像仓库

你应该测试以下两点

1.能否从本地开发机器向镜像仓库推送镜像。
2.能否在 k3d 集群的部署中使用来自该镜像仓库的镜像。

我们将针对运行在你开发机器上的本地镜像仓库(地址为 k3d-registry.localhost:12345)验证这两件事。对于检查外部镜像仓库,基本步骤大致相同,但在使用需要认证或安全的镜像仓库时,你的本地机器可能需要一些额外配置(有关这部分内容,请参考 Docker 的文档)。

假设条件:在以下测试用例中,我们假设在你的本地机器上,镜像仓库名称 k3d-registry.localhost 能解析到 127.0.0.1(更多详细信息见前言部分),并且在 k3d 集群节点(K3s 容器)中能解析到镜像仓库容器的 IP 地址。

  • 注意:根据前言中的解释,在下面的 docker tagdocker push 命令中,你可以用 localhost:12345 替换 k3d-registry.localhost:12345(但在 kubectl 相关部分不能替换!)

Nginx Deployment

首先,我们可以下载一些镜像(例如 Nginx 镜像),然后使用以下步骤将其推送到本地镜像仓库:

docker pull nginx:latest
docker tag nginx:latest k3d-registry.localhost:12345/nginx:latest
docker push k3d-registry.localhost:12345/nginx:latest

接下来,我们可以将一个引用该镜像的 Pod 部署到你的集群中:

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-registry
  labels:
    app: nginx-test-registry
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test-registry
  template:
    metadata:
      labels:
        app: nginx-test-registry
    spec:
      containers:
      - name: nginx-test-registry
        image: k3d-registry.localhost:12345/nginx:latest
        ports:
        - containerPort: 80
EOF

然后你应该使用 kubectl get pods -l "app=nginx-test-registry" 命令来检查 Pod 是否正在运行。

Alpine 容器实例(Pod)

1.拉取 Alpine 镜像:

执行 docker pull alpine:latest 命令,从 Docker 镜像源拉取最新的 Alpine 镜像。

2.重新标记镜像:

使用 docker tag alpine:latest k3d - registry.localhost:12345/testimage:local 命令,将拉取的 alpine:latest 镜像重新标记,使其指向你新创建的镜像仓库。

3.推送镜像:

运行 docker push k3d - registry.localhost:12345/testimage:local 命令,把重新标记后的镜像推送到新创建的镜像仓库。

4.使用 kubectl 创建容器实例: 执行 kubectl run --image k3d - registry.localhost:12345/testimage:local testimage --command -- tail -f /dev/null 命令,在集群中使用刚推送的镜像创建一个新的容器实例。此命令会创建一个不执行实际任务但会持续运行的容器,以此验证集群是否能够从新的镜像仓库拉取镜像。

创建镜像仓库代理 / 拉取缓存镜像仓库

1.创建拉取缓存镜像仓库

执行以下命令:

k3d registry create docker - io `# 创建名为 k3d-docker-io 的镜像仓库` \
  -p 5000 `# 监听本地主机的 5000 端口` \ 
  --proxy-remote-url https://registry-1.docker.io `# 让它镜像 Docker Hub 镜像仓库` \
  -v ~/.local/share/docker-io-registry:/var/lib/registry `# 同时将下载的镜像持久化存储在容器外的设备上`

该命令会创建一个名为 k3d-docker-io 的镜像仓库,它会监听本地的 5000 端口,代理 Docker Hub 镜像仓库,并将下载的镜像数据持久化存储在指定目录。

2.创建 registry.yml 文件

mirrors:
  "docker.io":
    endpoint:
      - http://k3d - docker - io:5000

此文件用于配置 K3s,使其在从 docker.io 拉取镜像时,使用我们创建的代理镜像仓库。

3.创建集群并使用拉取缓存

执行 k3d cluster create cluster01 --registry-use k3d-docker-io:5000 --registry-config registry.yml 命令,创建一个名为 cluster01 的集群,并配置其使用 k3d-docker-io:5000 这个镜像仓库,同时应用 registry.yml 中的配置。

4.当 cluster01 准备好后,再创建另一个集群或者重建该集群时,它将使用已经本地缓存的镜像。例如,执行 k3d cluster create cluster02 --registry-use k3d-docker-io:5000 --registry-config registry.yml 命令创建 cluster02 集群时,就会利用缓存的镜像。

通过配置文件创建镜像仓库代理 / 拉取缓存镜像仓库

1.创建配置文件 创建一个配置文件,例如 /home/me/test-regcache.yaml,内容如下:

apiVersion: k3d.io/v1alpha5
kind: Simple
metadata:
  name: test - regcache
registries:
  create:
    name: docker - io # 镜像仓库容器的名称
    proxy:
      remoteURL: https://registry - 1.docker.io # 代理 DockerHub
    volumes:
      - /tmp/reg:/var/lib/registry # 将数据本地持久化存储在 /tmp/reg 目录
  config: | # 告诉 K3s 从 DockerHub 拉取镜像时使用此镜像仓库
    mirrors:
      "docker.io":
        endpoint:
          - http://docker - io:5000

2.根据配置文件创建集群 执行 k3d cluster create -c /home/me/test-regcache.yaml 命令,依据配置文件创建集群。