Nexus 代理 Kubernetes 仓库:下载仓库所有 rpm、deb 软件包

说明

Nexus 仓库地址:http://10.31.0.51:48081

Nexus 配置 yum 代理仓库 kubernetes-new-yumhttps://mirrors.aliyun.com/kubernetes-new/core/stable

Nexus 配置 apt 代理仓库 kubernetes-new-apthttps://mirrors.aliyun.com/kubernetes-new/core/stable

下载所有 Kubernetes rpm 包

以下内容可基于 registry.openanolis.cn/openanolis/anolisos:23.5 Docker 镜像创建的容器操作

docker run -itd --name anolis-23.5 registry.openanolis.cn/openanolis/anolisos:23.5
docker exec -it anolis-23.5 bash

创建 Kubernetes repo 仓库

yum install -y vim
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes-v1.24]
name=Kubernetes-v1.24
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.24/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.24/rpm/repodata/repomd.xml.key

[kubernetes-v1.25]
name=Kubernetes-v1.25
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.25/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.25/rpm/repodata/repomd.xml.key

[kubernetes-v1.26]
name=Kubernetes-v1.26
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.26/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.26/rpm/repodata/repomd.xml.key

[kubernetes-v1.27]
name=Kubernetes-v1.27
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.27/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.27/rpm/repodata/repomd.xml.key

[kubernetes-v1.28]
name=Kubernetes-v1.28
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.28/rpm/repodata/repomd.xml.key

[kubernetes-v1.29]
name=Kubernetes-v1.29
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.29/rpm/repodata/repomd.xml.key

[kubernetes-v1.30]
name=Kubernetes-v1.30
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.30/rpm/repodata/repomd.xml.key

[kubernetes-v1.31]
name=Kubernetes-v1.31
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.31/rpm/repodata/repomd.xml.key

[kubernetes-v1.32]
name=Kubernetes-v1.32
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.32/rpm/repodata/repomd.xml.key

[kubernetes-v1.33]
name=Kubernetes-v1.33
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.33/rpm/repodata/repomd.xml.key

[kubernetes-v1.34]
name=Kubernetes-v1.34
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.34/rpm/repodata/repomd.xml.key

[kubernetes-v1.35]
name=Kubernetes-v1.35
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.35/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.35/rpm/repodata/repomd.xml.key

[kubernetes-v1.36]
name=Kubernetes-v1.36
baseurl=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.36/rpm/
enabled=1
gpgcheck=1
gpgkey=http://10.31.0.51:48081/repository/kubernetes-new-yum/v1.36/rpm/repodata/repomd.xml.key

安装工具

提供 reposync 等命令

yum install -y yum-utils

下载所有 Kubernetes rpm 包到 Nexus

使用 reposync 通过 nexus 代理仓库下载所有 Kubernetes rpm 到本地,实际目的是让 Nexus Kubernetes 代理仓库下载所有 Kubernetes rpm 包

执行完成可以删除 ./k8s 文件夹:Nexus Kubernetes 代理仓库中已经存在所有 rpm 包了

# x86_64 架构(全部版本)
reposync --repoid=kubernetes-v1.24 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.25 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.26 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.27 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.28 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.29 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.30 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.31 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.32 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.33 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.34 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.35 -p ./k8s --arch=x86_64 --all
reposync --repoid=kubernetes-v1.36 -p ./k8s --arch=x86_64 --all

# aarch64 架构(全部版本)
reposync --repoid=kubernetes-v1.24 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.25 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.26 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.27 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.28 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.29 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.30 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.31 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.32 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.33 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.34 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.35 -p ./k8s --arch=aarch64 --all
reposync --repoid=kubernetes-v1.36 -p ./k8s --arch=aarch64 --all

下载所有 Kubernetes deb 包

mirror_kubernetes_deb.sh

#!/bin/bash
#
# 功能:镜像扁平结构(无 dists/ 目录)的 kubernetes apt 仓库
#
# 背景:debmirror 要求仓库根目录存在 dists/ 子目录(见 debmirror man),
#       而 pkgs.k8s.io / OBS 生成的 deb 仓库是扁平结构:
#         deb/
#         ├── InRelease / Release / Packages / Packages.gz
#         ├── amd64/*.deb
#         ├── arm64/*.deb
#         ├── ppc64el/*.deb
#         └── s390x/*.deb
#        Packages 里的 Filename 字段是相对 deb/ 根目录的路径,因此按
#        Filename 逐一下载即可完整镜像。
#
# 用法:
#   ./mirror_kubernetes_deb.sh
#
# 可选环境变量:
#   K8S_VERSION  Kubernetes 版本,默认 v1.36(可指定 v1.24 ~ v1.36 等)
#   BASE_URL     仓库根地址,默认由 K8S_VERSION 拼接(可整体覆盖)
#   DEST         本地镜像目录,默认 ./deb-mirror
#   ARCHS        只镜像指定架构(空格分隔),如 "amd64 arm64";留空则镜像 amd64
#   DRY_RUN      置为 1 只列出将要下载的文件,不实际下载
#

set -euo pipefail

# 颜色定义
readonly COLOR_BLUE='\033[34m'
readonly COLOR_GREEN='\033[92m'
readonly COLOR_RED='\033[31m'
readonly COLOR_YELLOW='\033[93m'
readonly COLOR_RESET='\033[0m'

# Kubernetes 版本
readonly K8S_VERSION="${K8S_VERSION:-v1.36}"

# 仓库根地址(去掉末尾斜杠)
readonly BASE_URL="${BASE_URL:-http://10.31.0.51:48081/repository/kubernetes-new-apt/${K8S_VERSION}/deb}"
readonly BASE_URL_TRIM="${BASE_URL%/}"

# 本地镜像目录
readonly DEST="${DEST:-./deb-mirror}"

# 只镜像指定架构(可选)
readonly ARCHS="${ARCHS:-amd64}"

# 依赖校验
if ! command -v curl >/dev/null 2>&1; then
  echo -e "${COLOR_RED}错误:未找到 curl 命令,请先安装 curl${COLOR_RESET}" >&2
  exit 1
fi

echo -e "${COLOR_BLUE}仓库地址:${COLOR_RESET}${BASE_URL_TRIM}"
echo -e "${COLOR_BLUE}镜像目录:${COLOR_RESET}${DEST}"
echo -e "${COLOR_BLUE}版本号:${COLOR_RESET}${K8S_VERSION}"
echo -e "${COLOR_BLUE}架构过滤:${COLOR_RESET}${ARCHS}"
echo

mkdir -p "$DEST"

# 1. 下载元数据文件(保持扁平仓库结构,使镜像可继续被 apt 使用)
echo -e "${COLOR_BLUE}下载元数据文件...${COLOR_RESET}"
for f in InRelease Release Release.gpg Packages Packages.gz; do
  if [ "${DRY_RUN:-0}" = "1" ]; then
    echo "  [dry-run] $f"
    continue
  fi
  if curl -fsSL --retry 3 "$BASE_URL_TRIM/$f" -o "$DEST/$f" 2>/dev/null; then
    echo -e "  ${COLOR_GREEN}✓${COLOR_RESET} ${f}"
  else
    # Release.gpg 可能不存在,其余文件失败则报错
    if [ "$f" = "Release.gpg" ]; then
      echo -e "  ${COLOR_YELLOW}-${COLOR_RESET} ${f}(不存在,跳过)"
      rm -f "$DEST/${f}"
    else
      echo -e "  ${COLOR_RED}✗${COLOR_RESET} ${f} 下载失败" >&2
      exit 1
    fi
  fi
done
echo

# 2. 解析 Packages 里的 Filename,逐一下载 .deb(保持相对路径)
echo -e "${COLOR_BLUE}解析 Packages 并下载 .deb 包...${COLOR_RESET}"

# 下载 Packages 元数据到临时文件
curl -fsSL "$BASE_URL_TRIM/Packages" > /tmp/mirror_packages.txt

# 提取 Filename 列表;若指定了 ARCHS 则只保留对应架构
# Filename 形如 amd64/kubeadm_1.36.0-1.1_amd64.deb,架构即首段目录名
if [ -n "$ARCHS" ]; then
  arch_regex="^($(echo "$ARCHS" | tr ' ' '|'))/"
  grep '^Filename: ' /tmp/mirror_packages.txt \
    | sed 's/^Filename: //' \
    | grep -E "$arch_regex" > /tmp/mirror_filenames.txt
else
  grep '^Filename: ' /tmp/mirror_packages.txt \
    | sed 's/^Filename: //' > /tmp/mirror_filenames.txt
fi

total="$(wc -l < /tmp/mirror_filenames.txt | tr -d ' ')"
echo "共 ${total} 个 .deb 文件"
echo

if [ "$total" -eq 0 ]; then
  echo -e "${COLOR_YELLOW}警告:没有匹配到任何 .deb 文件,请检查 ARCHS 或 BASE_URL${COLOR_RESET}" >&2
  exit 1
fi

i=0
while IFS= read -r rel; do
  i=$((i + 1))
  if [ "${DRY_RUN:-0}" = "1" ]; then
    printf '  [dry-run] [%s/%s] %s\n' "$i" "$total" "$rel"
    continue
  fi
  printf '  [%s/%s] %s' "$i" "$total" "$rel"
  mkdir -p "$DEST/$(dirname "$rel")"
  if curl -fsSL --retry 3 -o "$DEST/$rel" "$BASE_URL_TRIM/$rel"; then
    echo -e " ${COLOR_GREEN}✓${COLOR_RESET}"
  else
    echo -e " ${COLOR_RED}✗ 下载失败${COLOR_RESET}" >&2
  fi
done < /tmp/mirror_filenames.txt

echo
echo -e "${COLOR_GREEN}完成:仓库已镜像到 ${DEST}${COLOR_RESET}"
echo
echo -e "如需本地使用,可把 ${COLOR_YELLOW}${DEST}${COLOR_RESET} 作为扁平仓库根目录,apt 源写法:"
echo -e "  ${COLOR_YELLOW}deb [trusted=yes] http://<host>/<path-to-deb-mirror> /${COLOR_RESET}"

执行下载

K8S_VERSION=v1.24 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.25 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.26 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.27 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.28 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.29 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.30 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.31 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.32 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.33 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.34 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.35 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh
K8S_VERSION=v1.36 ARCHS="amd64 arm64" ./mirror_kubernetes_deb.sh