Ship the control-agent controller for node

This commit is contained in:
2026-04-01 02:03:37 +08:00
parent b6c110410f
commit 7c3e096fec
4 changed files with 107 additions and 28 deletions

View File

@@ -18,6 +18,17 @@ STORAGE_DRIVER="${STORAGE_DRIVER:-overlay}"
# Optional. Needed by many overlay-in-container setups. # Optional. Needed by many overlay-in-container setups.
FUSE_OVERLAYFS="${FUSE_OVERLAYFS:-/usr/bin/fuse-overlayfs}" FUSE_OVERLAYFS="${FUSE_OVERLAYFS:-/usr/bin/fuse-overlayfs}"
# Optional extra images to include in addition to kubeadm's required images.
# Example:
# EXTRA_IMAGES=(
# "docker.io/library/busybox:1.36"
# "quay.io/cilium/cilium:v1.17.2"
# )
EXTRA_IMAGES=(
"${EXTRA_IMAGES[@]:-}"
"docker-daemon:monok8s/control-agent:$TAG"
)
# Keep archive cache version/arch scoped so downloads do not get mixed. # Keep archive cache version/arch scoped so downloads do not get mixed.
ARCHIVE_DIR="${KUBE_IMG_CACHE}/archives/${ARCH}/${KUBE_VERSION}" ARCHIVE_DIR="${KUBE_IMG_CACHE}/archives/${ARCH}/${KUBE_VERSION}"
@@ -70,48 +81,96 @@ fi
export CONTAINERS_STORAGE_CONF="${STORAGE_CONF}" export CONTAINERS_STORAGE_CONF="${STORAGE_CONF}"
# Sanity check: list required images using the target kubeadm binary. # Get kubeadm-required images.
mapfile -t kube_images < <( mapfile -t kubeadm_images < <(
qemu-aarch64-static \ qemu-aarch64-static \
"${ROOTFS}/usr/local/bin/kubeadm" \ "${ROOTFS}/usr/local/bin/kubeadm" \
config images list \ config images list \
--kubernetes-version "${KUBE_VERSION}" --kubernetes-version "${KUBE_VERSION}"
) )
if [ "${#kube_images[@]}" -eq 0 ]; then if [ "${#kubeadm_images[@]}" -eq 0 ] && [ "${#EXTRA_IMAGES[@]}" -eq 0 ]; then
echo "No kubeadm images returned" echo "No images to seed"
exit 1 exit 1
fi fi
for img in "${kube_images[@]}"; do # Merge kubeadm images + EXTRA_IMAGES, preserving order and removing duplicates.
images=()
declare -A seen=()
for img in "${kubeadm_images[@]}" "${EXTRA_IMAGES[@]}"; do
[ -n "${img}" ] || continue
if [ -z "${seen[$img]+x}" ]; then
images+=("${img}")
seen["$img"]=1
fi
done
echo "Images to seed:"
for img in "${images[@]}"; do
echo " ${img}"
done
echo
for img in "${images[@]}"; do
[ -n "${img}" ] || continue [ -n "${img}" ] || continue
safe_name="$(printf '%s' "${img}" | sed 's#/#_#g; s#:#__#g')" case "$img" in
docker-daemon:*)
SRC="$img"
IMG_REF="${img#docker-daemon:}"
USE_ARCHIVE=0
;;
docker://*)
SRC="$img"
IMG_REF="${img#docker://}"
USE_ARCHIVE=1
;;
oci-archive:*)
SRC="$img"
IMG_REF="${img#oci-archive:}"
USE_ARCHIVE=0
;;
*)
# Default behavior for non-prefixed refs:
# treat as remote registry image.
SRC="docker://${img}"
IMG_REF="$img"
USE_ARCHIVE=1
;;
esac
safe_name="$(printf '%s' "${IMG_REF}" | sed 's#/#_#g; s#:#__#g')"
archive="${ARCHIVE_DIR}/${safe_name}.tar" archive="${ARCHIVE_DIR}/${safe_name}.tar"
if [ ! -f "${archive}" ]; then if [ "${USE_ARCHIVE}" = "1" ]; then
echo "Caching archive: ${img}" if [ ! -f "${archive}" ]; then
skopeo copy \ echo "Caching archive: ${IMG_REF}"
--override-os "${OS}" \ skopeo copy \
--override-arch "${ARCH}" \ --override-os "${OS}" \
"docker://${img}" \ --override-arch "${ARCH}" \
"oci-archive:${archive}" "${SRC}" \
"oci-archive:${archive}"
else
echo "Archive hit: ${IMG_REF}"
fi
SRC_FINAL="oci-archive:${archive}"
else else
echo "Archive hit: ${img}" echo "Using direct source: ${SRC}"
SRC_FINAL="${SRC}"
fi fi
# If already present in the target containers/storage, skip. if skopeo inspect "containers-storage:${IMG_REF}" >/dev/null 2>&1; then
if skopeo inspect "containers-storage:${img}" >/dev/null 2>&1; then echo "Store hit: ${IMG_REF}"
echo "Store hit: ${img}"
continue continue
fi fi
echo "Seeding CRI-O store: ${img}" echo "Seeding CRI-O store: ${IMG_REF}"
skopeo copy \ skopeo copy \
--override-os "${OS}" \ --override-os "${OS}" \
--override-arch "${ARCH}" \ --override-arch "${ARCH}" \
"oci-archive:${archive}" \ "${SRC_FINAL}" \
"containers-storage:${img}" "containers-storage:${IMG_REF}"
done done
echo echo

12
clitools/Dockerfile Normal file
View File

@@ -0,0 +1,12 @@
FROM alpine:latest AS cacerts
FROM scratch
ARG VERSION
ENV VERSION=${VERSION}
WORKDIR /
COPY bin/ctl-linux-aarch64-${VERSION} ./ctl
COPY --from=cacerts /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
CMD [ "/ctl", "agent" ]

View File

@@ -15,6 +15,12 @@ build: $(BUILDINFO_FILE)
mkdir -p $(BIN_DIR) mkdir -p $(BIN_DIR)
GOOS=linux GOARCH=arm64 go build -o $(BIN_DIR)/ctl-linux-aarch64-$(VERSION) ./cmd/ctl/ GOOS=linux GOARCH=arm64 go build -o $(BIN_DIR)/ctl-linux-aarch64-$(VERSION) ./cmd/ctl/
build-agent:
docker build \
--platform=linux/arm64 \
--build-arg VERSION=$(VERSION) \
-t monok8s/control-agent:$(VERSION) .
build-local: build-local:
go build -o $(BIN_DIR)/ctl-$(VERSION) ./cmd/ctl go build -o $(BIN_DIR)/ctl-$(VERSION) ./cmd/ctl

View File

@@ -207,19 +207,21 @@ $(RELEASE_IMAGE): $(RELEASE_DEPS) | $(OUT_DIR)
@cid=$$(docker create \ @cid=$$(docker create \
--privileged \ --privileged \
-v /cache/k8s-images:/var/cache/k8s-images \
-v /cache/apk:/var/cache/apk \ -v /cache/apk:/var/cache/apk \
-v /cache/k8s-images:/var/cache/k8s-images \
-v /var/run/docker.sock:/var/run/docker.sock \
--device=/dev/loop0:/dev/loop0 \ --device=/dev/loop0:/dev/loop0 \
-e ROOTFS=/out/rootfs \ -e ALPINE_HOSTNAME=$(ALPINE_HOSTNAME) \
-e RELEASE_IMAGE=$(RELEASE_IMAGE) \ -e ARCH=$(ARCH) \
-e BUILD_DATE=$(BUILD_DATE) \
-e BUILD_GIT=$(BUILD_GIT) \
-e BUILD_VERSION=$(BUILD_VERSION) \
-e DEVICE_TREE_TARGET=$(DEVICE_TREE_TARGET) \ -e DEVICE_TREE_TARGET=$(DEVICE_TREE_TARGET) \
-e KUBE_IMG_CACHE=/var/cache/k8s-images \ -e KUBE_IMG_CACHE=/var/cache/k8s-images \
-e KUBE_VERSION=$(KUBE_VERSION) \ -e KUBE_VERSION=$(KUBE_VERSION) \
-e ALPINE_HOSTNAME=$(ALPINE_HOSTNAME) \ -e RELEASE_IMAGE=$(RELEASE_IMAGE) \
-e BUILD_VERSION=$(BUILD_VERSION) \ -e ROOTFS=/out/rootfs \
-e BUILD_DATE=$(BUILD_DATE) \ -e TAG=$(TAG) \
-e BUILD_GIT=$(BUILD_GIT) \
-e ARCH=$(ARCH) \
$(DOCKER_IMAGE_ROOT)/buildenv-alpine:$(TAG) \ $(DOCKER_IMAGE_ROOT)/buildenv-alpine:$(TAG) \
bash -lc '/build-rootfs.sh'); \ bash -lc '/build-rootfs.sh'); \
docker start -a $$cid; \ docker start -a $$cid; \