前言

本文的目的是实现在k3s中可以访问使用docker部署registry

部署registry

启动一个一次性容器用于创建账号密码.密码文件路径以/root/registry/htpasswd为例,账号密码以admin和12345678为例.

1
2
3
docker run --rm --entrypoint \
htpasswd httpd:2 -Bbn \
admin 12345678 > ./registry/htpasswd

编写docker compose的yaml文件用于启动registry。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
services:
registry:
image: registry:2
container_name: registry
volumes:
# - ./config.yml:/etc/docker/registry/config.yml
- ./htpasswd:/auth/htpasswd
- ./registry:/var/lib/registry
- /etc/localtime:/etc/localtime
ports:
- 5000:5000
environment:
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
- REGISTRY_STORAGE_DELETE_ENABLED=true
networks:
- registry-network
restart: always
extra_hosts:
- host.docker.internal:host-gateway
networks:
registry-network:
external: false

resistry默认提供web ui使用,我们可以使用docker-registry-ui部署一个web ui。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
registry-ui:
image: joxit/docker-registry-ui:main
container_name: registry-ui
restart: always
ports:
- 5001:80
environment:
- SINGLE_REGISTRY=true
- REGISTRY_TITLE=Docker Registry UI
- DELETE_IMAGES=true
- SHOW_CONTENT_DIGEST=true
- NGINX_PROXY_PASS_URL=http://registry:5000
- SHOW_CATALOG_NB_TAGS=true
- CATALOG_MIN_BRANCHES=1
- CATALOG_MAX_BRANCHES=1
- TAGLIST_PAGE_SIZE=100
- REGISTRY_SECURED=false
- CATALOG_ELEMENTS_LIMIT=1000
networks:
- registry-network
extra_hosts:
- host.docker.internal:host-gateway

然后通过·docker compose up -d·就可以启动了。

docker连接私有仓库

docker默认不支持http协议,需要额外配置, 通过在/etc/docker/daemon.json 中将私有仓库地址添加进入就好了。

1
2
3
{
"insecure-registries": ["192.168.31.220:5000"]
}

然后可以通过docker login去登陆私有仓库。

1
docker login 192.168.31.220:5000

k3s连接私有仓库

如果k3s使用docker运行时就不需要额外的操作了,就可以操作了应该(没试过)

如果k3s使用containerd运行时,需要自行配置/var/lib/rancher/k3s/agent/etc/containerd/config.toml。

一般而言不鼓励直接修改/var/lib/rancher/k3s/agent/etc/containerd/config.toml文件,而是通过 /etc/rancher/k3s/registries.yaml让k3s自行生成containerd的配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
mirrors:
"192.168.31.220:5000":
endpoint:
- "http://192.168.31.220:5000"

configs:
"192.168.31.220:5000":
auth:
username: admin
password: password
tls:
insecure_skip_verify: true

mirrors定义镜像仓库的镜像规则(mirror),用于指定如何访问特定的私有仓库。当容器运行时尝试拉取镜像时,会根据 mirrors 的配置决定从哪个地址拉取。
configs定义私有仓库的认证和 TLS 配置。当访问私有仓库时,容器运行时会使用这里配置的用户名、密码和 TLS 设置。

现在可以通过创建一个pod去测试k3s是否正常访问私有仓库。

这里推荐使用crictl去直接拉取私有仓库的镜像。

1
sudo crictl pull 192.168.31.220:5000/hoteler-api:07e1b87e82ccfc49e5bee7d3d88cf2c304376056

参考资料

  1. Docker login 登录私服,报错; http: server gave HTTP response to HTTPS client
  2. Private Registry Configuration