一、起因
使用k3s拉取镜像时总是会遇到拉取失败,所以如果把需要的镜像都存放到本地仓库中,每次使用只需要从本地仓库中获取,这样方便许多。
二、部署过程
选用和k3s集群同一个局域网内的服务器。
系统版本:
使用容器快速部署仓库
1
| docker run -d -p 5000:5000 --restart=always --name registry registry:2
|
部署完成后,访问http://服务器ip:5000/v2/_catalog。可以查看当前仓库中所有镜像。
仓库镜像拉取过程:
首先要使用docker 将镜像拉取到本地,然后给镜像打tag,最后推送到仓库。
如:
1
2
3
| docker pull bitnami/kafka:latest
docker tag bitnami/kafka:latest 192.168.1.192:5000/kafka:latest
docker push 192.168.1.192:5000/kafka:latest
|
由于k3s没有使用docker作为内置的CRI,而是使用container作为默认CRI。我们在拉取仓库中镜像时会发生如下报错:
1
| Error response from daemon: Get "https://192.168.1.192:5000/v2/": http: server gave HTTP response to HTTPS client
|
这是由于container默认会使用https来拉取镜像。在master节点上将默认使用https改为使用http。
1
2
3
4
5
| vi /etc/rancher/k3s/registries.yaml
mirrors:
"192.168.1.192:5000":
endpoint:
- "http://192.168.1.192:5000"
|
其中ip和端口是仓库地址和端口。
重启k3s服务
再次拉取,发现拉取成功了。
1
| # ctr images pull 192.168.1.192:5000/kafka:latest
|
创建脚本快速查看仓库中有哪些镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| vi list_repo.sh
#!/bin/bash
REGISTRY_URL="http://localhost:5000"
# 获取所有仓库
REPOS=$(curl -s ${REGISTRY_URL}/v2/_catalog | jq -r '.repositories[]')
for repo in $REPOS; do
echo "Repository: $repo"
# 获取仓库中的所有标签
TAGS=$(curl -s ${REGISTRY_URL}/v2/${repo}/tags/list | jq -r '.tags[]')
for tag in $TAGS; do
echo " Tag: $tag"
done
done
|
测试:
1
2
3
4
5
| [root@k3s-storage ~]# ./list_repo.sh
Repository: kafka
Tag: latest
Repository: zookeeper
Tag: latest
|