Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/actions/quick-rpm-clean/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@ runs:
set -euo pipefail
set -x

VG_NAME="${VG_NAME:-myvg1}"
sudo podman exec -i microshift-okd systemctl stop microshift.service
sudo podman exec -i microshift-okd vgremove myvg1
sudo podman exec -i microshift-okd vgremove "${VG_NAME}"
sudo podman exec -i microshift-okd systemctl start microshift.service

# Restart the greenboot service synchronously to check the health of the system.
Expand Down
3 changes: 2 additions & 1 deletion .github/actions/quick-start-clean/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ runs:
sudo podman image exists microshift-okd && exit 1

# Verify the LVM volume group and backing storage are removed
sudo vgs | grep myvg1 && exit 1
VG_NAME="${VG_NAME:-myvg1}"
sudo vgs | grep "${VG_NAME}" && exit 1
if [ -e /var/lib/microshift-okd ]; then
ls -la /var/lib/microshift-okd/
exit 1
Expand Down
18 changes: 17 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,14 +159,30 @@ TopoLVM CSI provides persistent storage:
- Configure size via `LVM_VOLSIZE` (default: 1G)
- Install `microshift-topolvm` package for host deployments

### TopoLVM Configuration

The following environment variables can be used to customize TopoLVM:

- `VG_NAME`: LVM volume group name (default: `myvg1`)
- `SPARE_GB`: Spare GB to reserve in the volume group (default: `10`)

Example usage:
```bash
# Use custom volume group name and smaller spare for testing
make run VG_NAME=testvg SPARE_GB=2 LVM_VOLSIZE=5G

# Using quickstart scripts
VG_NAME=customvg SPARE_GB=5 sudo -E ./src/quickstart.sh
```

## Cluster Manager

`src/cluster_manager.sh` manages multi-node bootc clusters:
- Creates podman network for node communication
- Manages TopoLVM LVM backend
- Supports operations: create, add-node, start, stop, delete, ready, healthy, status, env
- Node naming: `microshift-okd-1`, `microshift-okd-2`, etc.
- Environment variables: `USHIFT_IMAGE`, `LVM_DISK`, `VG_NAME`, `ISOLATED_NETWORK`, `EXPOSE_KUBEAPI_PORT`
- Environment variables: `USHIFT_IMAGE`, `LVM_DISK`, `VG_NAME`, `SPARE_GB`, `ISOLATED_NETWORK`, `EXPOSE_KUBEAPI_PORT`

## Important Notes

Expand Down
19 changes: 10 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ EMBED_CONTAINER_IMAGES ?= 0

# Options used in the 'run' target
LVM_VOLSIZE ?= 1G
SPARE_GB ?= 10
Comment thread
coderabbitai[bot] marked this conversation as resolved.
ISOLATED_NETWORK ?= 0
EXPOSE_KUBEAPI_PORT ?= 1

Expand Down Expand Up @@ -133,25 +134,25 @@ image:

.PHONY: run
run:
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=${EXPOSE_KUBEAPI_PORT} ./src/cluster_manager.sh create
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=${EXPOSE_KUBEAPI_PORT} ./src/cluster_manager.sh create

.PHONY: add-node
add-node:
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh add-node
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh add-node

.PHONY: start
start:
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh start
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=0 ./src/cluster_manager.sh start

.PHONY: stop
stop:
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh stop
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh stop

.PHONY: run-ready
run-ready:
@echo "Waiting 5m for the MicroShift service to be ready"
@for _ in $$(seq 60); do \
if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh ready ; then \
if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh ready ; then \
printf "\nOK\n" && exit 0; \
fi ; \
sleep 5 ; \
Expand All @@ -162,7 +163,7 @@ run-ready:
run-healthy:
@echo "Waiting 15m for the MicroShift service to be healthy"
@for _ in $$(seq 60); do \
if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh healthy ; then \
if USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh healthy ; then \
printf "\nOK\n" && exit 0; \
fi ; \
sleep 5 ; \
Expand All @@ -171,15 +172,15 @@ run-healthy:

.PHONY: run-status
run-status:
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh status
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh status

.PHONY: env
env: run-ready
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} EXPOSE_KUBEAPI_PORT=1 ./src/cluster_manager.sh env "${CMD}"
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} EXPOSE_KUBEAPI_PORT=1 ./src/cluster_manager.sh env "${CMD}"

.PHONY: clean
clean:
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} ./src/cluster_manager.sh delete
@USHIFT_IMAGE=${USHIFT_IMAGE} ISOLATED_NETWORK=${ISOLATED_NETWORK} LVM_DISK=${LVM_DISK} LVM_VOLSIZE=${LVM_VOLSIZE} VG_NAME=${VG_NAME} SPARE_GB=${SPARE_GB} ./src/cluster_manager.sh delete

.PHONY: clean-all
clean-all:
Expand Down
10 changes: 5 additions & 5 deletions ansible/roles/microshift-okd-bootc/tasks/topolvm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,17 @@
- name: Debug loop device path
ansible.builtin.debug:
var: loop_device_path
- name: Create volume group 'myvg1' on {{ loop_device_path }}
- name: Create volume group '{{ lvm_vg_name }}' on {{ loop_device_path }}
community.general.lvg:
vg: myvg1
vg: "{{ lvm_vg_name }}"
pvs: "{{ loop_device_path }}"
state: present
force: true # Corresponds to vgcreate -f. Use with care if PVs might be in use by other VGs.
become: true
- name: Create {{ lvm_thinpool_size_giga }}G thin pool 'thinpool' in volume group 'myvg1'

- name: Create {{ lvm_thinpool_size_giga }}G thin pool 'thinpool' in volume group '{{ lvm_vg_name }}'
community.general.lvol:
vg: myvg1
vg: "{{ lvm_vg_name }}"
lv: thinpool
size: "{{ lvm_thinpool_size_giga }}G"
opts: "--type thin-pool" # This creates a thin pool
Expand Down
5 changes: 3 additions & 2 deletions ansible/roles/microshift-okd-bootc/vars/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ microshift_download_dir: "./cache/microshift_assets"
lvm_disk_size_in_giga: 20

# logical volume group name
# WARNING: the name is default for the topolvm driver,it shouldn't be changed.
lvm_vg_name: myvg1
lvm_vg_name: "{{ lvm_vg_name | default('myvg1') }}"
# spare GB to reserve in TopoLVM
lvm_spare_gb: "{{ lvm_spare_gb | default(10) }}"
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
lvm_thinpool_size_giga: 6
7 changes: 7 additions & 0 deletions packaging/bootc.Containerfile
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ RUN dnf install -y 'greenboot-0.15.*' && dnf clean all
COPY --chmod=755 ./src/rpm/postinstall.sh ${USHIFT_POSTINSTALL_SCRIPT}
RUN ${USHIFT_POSTINSTALL_SCRIPT} && rm -vf "${USHIFT_POSTINSTALL_SCRIPT}"

# Install TopoLVM configuration patching script and systemd drop-in
# This allows runtime configuration of VG_NAME and SPARE_GB via environment variables
COPY --chmod=755 ./src/topolvm/patch_lvmd_config.sh /usr/local/bin/patch_lvmd_config.sh
RUN mkdir -p /etc/systemd/system/microshift.service.d && \
printf '[Service]\nExecStartPre=/usr/local/bin/patch_lvmd_config.sh\n' \
> /etc/systemd/system/microshift.service.d/00-patch-lvmd.conf

# If the EMBED_CONTAINER_IMAGES environment variable is set to 1, temporarily
# configure user namespace UID and GID mappings. This allows the skopeo command
# to operate without errors when copying the container images.
Expand Down
3 changes: 3 additions & 0 deletions src/cluster_manager.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ EXTRA_CONFIG="${EXTRA_CONFIG:-/var/lib/microshift-okd/custom_config.yaml}"
LVM_VOLSIZE="${LVM_VOLSIZE:-1G}"
API_SERVER_PORT="${API_SERVER_PORT:-6443}"
VG_NAME="${VG_NAME:-myvg1}"
SPARE_GB="${SPARE_GB:-10}"
ISOLATED_NETWORK="${ISOLATED_NETWORK:-0}"
EXPOSE_KUBEAPI_PORT="${EXPOSE_KUBEAPI_PORT:-0}"

Expand Down Expand Up @@ -130,6 +131,8 @@ _add_node() {
${network_opts} \
${port_opts} \
${mount_opts} \
-e VG_NAME="${VG_NAME}" \
-e SPARE_GB="${SPARE_GB}" \
--tmpfs /var/lib/containers \
--name "${name}" \
--hostname "${name}" \
Expand Down
12 changes: 10 additions & 2 deletions src/quickclean.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ set -euo pipefail

LVM_DISK="/var/lib/microshift-okd/lvmdisk.image"
LVM_CONFIG="/etc/systemd/system/microshift.service.d/99-lvm-config.conf"
VG_NAME="myvg1"
TOPOLVM_CONFIG="/etc/systemd/system/microshift.service.d/00-patch-lvmd.conf"
TOPOLVM_PATCH_SCRIPT="/usr/local/bin/patch_lvmd_config.sh"
TOPOLVM_PATCH_DIR="/etc/microshift/manifests.d/001-microshift-topolvm"
VG_NAME="${VG_NAME:-myvg1}"

# Check if the script is running as root
if [ "$(id -u)" -ne 0 ]; then
Expand All @@ -25,9 +28,14 @@ if rpm -q microshift &>/dev/null ; then
# Remove the LVM configuration
if [ -f "${LVM_CONFIG}" ] ; then
rm -f "${LVM_CONFIG}"
systemctl daemon-reload
fi

# Remove the TopoLVM configuration
rm -f "${TOPOLVM_CONFIG}"
rm -f "${TOPOLVM_PATCH_SCRIPT}"
rm -rf "${TOPOLVM_PATCH_DIR}"
systemctl daemon-reload

dnf remove -y 'microshift*'
# Undo post-installation configuration
rm -f /etc/sysctl.d/99-microshift.conf
Expand Down
30 changes: 27 additions & 3 deletions src/quickrpm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ BRANCH=${BRANCH:-main}
TAG=${TAG:-latest}

LVM_DISK="/var/lib/microshift-okd/lvmdisk.image"
VG_NAME="myvg1"
VG_NAME="${VG_NAME:-myvg1}"
SPARE_GB="${SPARE_GB:-10}"

WORKDIR=$(mktemp -d /tmp/microshift-quickrpm-XXXXXX)
trap 'rm -rf "${WORKDIR}"' EXIT
Expand Down Expand Up @@ -112,6 +113,27 @@ EOF
systemctl daemon-reload
}

function setup_topolvm_config() {
local -r vg_name="$1"
local -r spare_gb="$2"

# Download and install the TopoLVM configuration patch script
curl -fSsL --retry 5 --max-time 60 \
"https://github.com/${OWNER}/${REPO}/raw/${BRANCH}/src/topolvm/patch_lvmd_config.sh" \
-o /usr/local/bin/patch_lvmd_config.sh
chmod +x /usr/local/bin/patch_lvmd_config.sh

# Create systemd drop-in to run the patch script with VG_NAME and SPARE_GB
mkdir -p /etc/systemd/system/microshift.service.d
cat > /etc/systemd/system/microshift.service.d/00-patch-lvmd.conf <<EOF
[Service]
Environment=VG_NAME=${vg_name}
Environment=SPARE_GB=${spare_gb}
ExecStartPre=/usr/local/bin/patch_lvmd_config.sh
EOF
systemctl daemon-reload
}

function start_microshift() {
"${WORKDIR}/postinstall.sh"
systemctl start microshift.service
Expand All @@ -137,15 +159,17 @@ fi
check_prerequisites
centos10_cni_plugins
install_rpms
prepare_lvm_disk "${LVM_DISK}" "${VG_NAME}"
setup_lvm_service "${LVM_DISK}" "${VG_NAME}"
prepare_lvm_disk "${LVM_DISK}" "${VG_NAME}"
setup_lvm_service "${LVM_DISK}" "${VG_NAME}"
setup_topolvm_config "${VG_NAME}" "${SPARE_GB}"
start_microshift

# Follow-up instructions
echo
echo "MicroShift is running on the host"
echo "LVM disk: ${LVM_DISK}"
echo "VG name: ${VG_NAME}"
echo "Spare GB: ${SPARE_GB}"
echo
echo "To verify that MicroShift pods are up and running, run the following command:"
echo " - sudo oc get pods -A --kubeconfig /var/lib/microshift/resources/kubeadmin/kubeconfig"
Expand Down
5 changes: 4 additions & 1 deletion src/quickstart.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ IMAGE=${IMAGE:-"ghcr.io/${OWNER}/${REPO}"}
TAG=${TAG:-latest}

LVM_DISK="/var/lib/microshift-okd/lvmdisk.image"
VG_NAME="myvg1"
VG_NAME="${VG_NAME:-myvg1}"
SPARE_GB="${SPARE_GB:-10}"

function pull_bootc_image() {
local -r image_ref="$1"
Expand Down Expand Up @@ -61,6 +62,8 @@ function run_bootc_image() {
podman run --privileged --rm -d \
--replace \
${vol_opts} \
-e VG_NAME="${VG_NAME}" \
-e SPARE_GB="${SPARE_GB}" \
--name microshift-okd \
--hostname 127.0.0.1.nip.io \
"${image_ref}"
Expand Down
57 changes: 57 additions & 0 deletions src/topolvm/patch_lvmd_config.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/bin/bash
# Patches TopoLVM ConfigMap with user-specified VG_NAME and SPARE_GB
# This script is executed as ExecStartPre in the microshift.service to
# configure TopoLVM with custom volume group name and spare-gb settings.
set -euo pipefail

# Read environment variables from /proc/1/environ (container's init process)
# since systemd services don't automatically inherit container environment
if [ -f /proc/1/environ ]; then
for var in VG_NAME SPARE_GB; do
value=$(tr '\0' '\n' < /proc/1/environ | grep "^${var}=" | cut -d= -f2- || true)
if [ -n "${value}" ]; then
export "${var}=${value}"
fi
done
fi

VG_NAME="${VG_NAME:-myvg1}"
SPARE_GB="${SPARE_GB:-10}"
Comment thread
coderabbitai[bot] marked this conversation as resolved.

PATCH_DIR="/etc/microshift/manifests.d/001-microshift-topolvm"

# Only create the patch if non-default values are specified
if [ "${VG_NAME}" = "myvg1" ] && [ "${SPARE_GB}" = "10" ]; then
exit 0
fi
Comment thread
coderabbitai[bot] marked this conversation as resolved.

mkdir -p "${PATCH_DIR}"

# Create ConfigMap as a resource (not a patch) for MicroShift to apply
cat > "${PATCH_DIR}/topolvm-lvmd-configmap.yaml" <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: topolvm-lvmd-0
namespace: topolvm-system
labels:
app.kubernetes.io/instance: topolvm
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: topolvm
idx: "0"
data:
lvmd.yaml: |
socket-name: /run/topolvm/lvmd.sock
device-classes:
- default: true
name: ssd
spare-gb: ${SPARE_GB}
volume-group: ${VG_NAME}
EOF

cat > "${PATCH_DIR}/kustomization.yaml" <<EOF
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- topolvm-lvmd-configmap.yaml
EOF