2025-03-17    2025-03-17    534 字  2 分钟

一、起因

使用k3s拉取镜像时总是会遇到拉取失败,所以如果把需要的镜像都存放到本地仓库中,每次使用只需要从本地仓库中获取,这样方便许多。

二、部署过程

选用和k3s集群同一个局域网内的服务器。

系统版本:

  • centos7.9

使用容器快速部署仓库

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
systemctl restart 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