Ensure k3s offline package images match architecture

This commit is contained in:
shenlan 2025-09-14 17:25:39 +08:00
parent 8dc9d76926
commit 6a92aeb9e2
2 changed files with 86 additions and 5 deletions

View File

@ -76,7 +76,7 @@ jobs:
needs: build-k3s-installer needs: build-k3s-installer
strategy: strategy:
matrix: matrix:
arch: [amd64] arch: [amd64, arm64]
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@ -91,7 +91,40 @@ jobs:
cd test-dir cd test-dir
tar -xzvf offline-package-k3s-installer-${{ matrix.arch }}.tar.gz tar -xzvf offline-package-k3s-installer-${{ matrix.arch }}.tar.gz
- name: Install jq
run: |
sudo apt-get update
sudo apt-get install -y jq
- name: Verify k3s binary arch
run: |
set -euo pipefail
BIN="test-dir/k3s-offline-package/bin/k3s-${{ matrix.arch }}"
file "$BIN"
if [ "${{ matrix.arch }}" = "amd64" ]; then
file "$BIN" | grep -q 'x86-64'
else
file "$BIN" | grep -q 'aarch64'
fi
- name: Verify image platforms
run: |
set -euo pipefail
TAR="test-dir/k3s-offline-package/images/k3s-airgap-images-${{ matrix.arch }}.tar"
tmp=$(mktemp -d)
tar -xf "$TAR" -C "$tmp" manifest.json
configs=$(jq -r '.[].Config' "$tmp/manifest.json")
for cfg in $configs; do
tar -xf "$TAR" -C "$tmp" "$cfg"
arch=$(jq -r '.architecture' "$tmp/$cfg")
if [ "$arch" != "${{ matrix.arch }}" ]; then
echo "unexpected arch $arch in $cfg" >&2
exit 1
fi
done
- name: Setup K3s and Test - name: Setup K3s and Test
if: matrix.arch == 'amd64'
run: | run: |
cd test-dir/k3s-offline-package cd test-dir/k3s-offline-package
bash install-server.sh bash install-server.sh

View File

@ -59,14 +59,14 @@ pull_and_save_images() {
log "拉取核心镜像runtime=$rt)…" log "拉取核心镜像runtime=$rt)…"
case "$rt" in case "$rt" in
docker) docker)
for i in "${imgs[@]}"; do docker pull "$i"; done for i in "${imgs[@]}"; do docker pull --platform=linux/${ARCH} "$i"; done
log "保存镜像 → $out_tar" log "保存镜像 → $out_tar"
docker save -o "$out_tar" "${imgs[@]}" docker save -o "$out_tar" "${imgs[@]}"
;; ;;
nerdctl-default) nerdctl-default)
for i in "${imgs[@]}"; do sudo nerdctl --address /run/containerd/containerd.sock pull "$i"; done for i in "${imgs[@]}"; do sudo nerdctl --address /run/containerd/containerd.sock --platform=linux/${ARCH} pull "$i"; done
log "保存镜像 → $out_tar" log "保存镜像 → $out_tar"
sudo nerdctl --address /run/containerd/containerd.sock save -o "$out_tar" "${imgs[@]}" sudo nerdctl --address /run/containerd/containerd.sock --platform=linux/${ARCH} save -o "$out_tar" "${imgs[@]}"
;; ;;
esac esac
[[ -s "$out_tar" ]] || err "未生成镜像包:$out_tar" [[ -s "$out_tar" ]] || err "未生成镜像包:$out_tar"
@ -200,6 +200,36 @@ case "$ARCH" in x86_64|amd64) ARCH=amd64;; aarch64|arm64) ARCH=arm64;; *) echo "
BIN_DIR="./bin" BIN_DIR="./bin"
install_bin(){ sudo cp "$1" "$2"; sudo chmod +x "$2"; echo "$2"; } install_bin(){ sudo cp "$1" "$2"; sudo chmod +x "$2"; echo "$2"; }
check_images(){
echo "[INFO] 验证已加载镜像架构"
local out
out=$(sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock images -a --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.Platform}}')
echo "$out"
if echo "$out" | awk '{print $3}' | grep -v "linux/${ARCH}" >/dev/null; then
echo "[ERROR] 发现非 ${ARCH} 架构镜像" >&2
exit 1
fi
}
check_images(){
echo "[INFO] 验证已加载镜像架构"
local out
out=$(sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock images -a --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.Platform}}')
echo "$out"
if echo "$out" | awk '{print $3}' | grep -v "linux/${ARCH}" >/dev/null; then
echo "[ERROR] 发现非 ${ARCH} 架构镜像" >&2
exit 1
fi
}
check_images(){
echo "[INFO] 验证已加载镜像架构"
local out
out=$(sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock images -a --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.Platform}}')
echo "$out"
if echo "$out" | awk '{print $3}' | grep -v "linux/${ARCH}" >/dev/null; then
echo "[ERROR] 发现非 ${ARCH} 架构镜像" >&2
exit 1
fi
}
echo "[INFO] 安装 CLI → /usr/local/bin" echo "[INFO] 安装 CLI → /usr/local/bin"
install_bin "${BIN_DIR}/k3s-${ARCH}" /usr/local/bin/k3s install_bin "${BIN_DIR}/k3s-${ARCH}" /usr/local/bin/k3s
@ -220,6 +250,8 @@ mkdir -p ~/.kube && cp -f /etc/rancher/k3s/k3s.yaml ~/.kube/config || true
kubectl apply -f addons/node-exporter.yaml || true kubectl apply -f addons/node-exporter.yaml || true
kubectl apply -f addons/kube-state-metrics.yaml || true kubectl apply -f addons/kube-state-metrics.yaml || true
check_images
echo "[SUCCESS] 离线 K3s 安装完成 ✅" echo "[SUCCESS] 离线 K3s 安装完成 ✅"
SH SH
chmod +x "${BASE_DIR}/install-server.sh" chmod +x "${BASE_DIR}/install-server.sh"
@ -235,6 +267,16 @@ case "$ARCH" in x86_64|amd64) ARCH=amd64;; aarch64|arm64) ARCH=arm64;; *) echo "
BIN_DIR="./bin" BIN_DIR="./bin"
install_bin(){ sudo cp "$1" "$2"; sudo chmod +x "$2"; echo "$2"; } install_bin(){ sudo cp "$1" "$2"; sudo chmod +x "$2"; echo "$2"; }
check_images(){
echo "[INFO] 验证已加载镜像架构"
local out
out=$(sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock images -a --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.Platform}}')
echo "$out"
if echo "$out" | awk '{print $3}' | grep -v "linux/${ARCH}" >/dev/null; then
echo "[ERROR] 发现非 ${ARCH} 架构镜像" >&2
exit 1
fi
}
echo "[INFO] 安装 CLI → /usr/local/bin" echo "[INFO] 安装 CLI → /usr/local/bin"
install_bin "${BIN_DIR}/k3s-${ARCH}" /usr/local/bin/k3s install_bin "${BIN_DIR}/k3s-${ARCH}" /usr/local/bin/k3s
@ -246,6 +288,8 @@ INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC="agent" bash install/k3s-officia
echo "[INFO] 加载 airgap 镜像" echo "[INFO] 加载 airgap 镜像"
sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock load -i "images/k3s-airgap-images-${ARCH}.tar" || true sudo nerdctl --namespace k8s.io --address /run/k3s/containerd/containerd.sock load -i "images/k3s-airgap-images-${ARCH}.tar" || true
check_images
echo "[SUCCESS] Agent 节点离线安装完成 ✅" echo "[SUCCESS] Agent 节点离线安装完成 ✅"
SH SH
chmod +x "${BASE_DIR}/install-agent.sh" chmod +x "${BASE_DIR}/install-agent.sh"
@ -285,7 +329,11 @@ rm -rf "${BASE_DIR}"
mkdir -p "${BASE_DIR}/"{bin,images,cni-plugins,addons,registry/docker.io,registry/ghcr.io,install} mkdir -p "${BASE_DIR}/"{bin,images,cni-plugins,addons,registry/docker.io,registry/ghcr.io,install}
# 核心二进制 # 核心二进制
download "${K3S_URL_BASE}/k3s" "${BASE_DIR}/bin/k3s-${ARCH}" K3S_BIN="k3s"
if [[ "${ARCH}" != "amd64" ]]; then
K3S_BIN="k3s-${ARCH}"
fi
download "${K3S_URL_BASE}/${K3S_BIN}" "${BASE_DIR}/bin/k3s-${ARCH}"
chmod +x "${BASE_DIR}/bin/k3s-${ARCH}" chmod +x "${BASE_DIR}/bin/k3s-${ARCH}"
download "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl" "${BASE_DIR}/bin/kubectl-${ARCH}" download "https://dl.k8s.io/release/${KUBECTL_VERSION}/bin/linux/${ARCH}/kubectl" "${BASE_DIR}/bin/kubectl-${ARCH}"