镜像仓库配置文件
你可以通过在 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.pem,registries.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使用一些特殊的解析技巧:像 dnsmasq 或 nss-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 tag和docker 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:50002.根据配置文件创建集群
执行 k3d cluster create -c /home/me/test-regcache.yaml 命令,依据配置文件创建集群。