From 9bb0e0e91a81e70711b463e6595d349bdcdd1802 Mon Sep 17 00:00:00 2001 From: Stefan Reimer Date: Thu, 17 Apr 2025 22:42:39 +0000 Subject: [PATCH] feat: reorg cluster upgrade scripts to allow support for KubeZero only clusters like GKE --- admin/kubezero.sh | 62 ++++++++++++++++--------------- admin/libhelm.sh | 10 ++--- admin/upgrade_cluster.sh | 29 +++++++-------- charts/kubezero-addons/Chart.yaml | 2 +- 4 files changed, 52 insertions(+), 51 deletions(-) diff --git a/admin/kubezero.sh b/admin/kubezero.sh index e5bde704..7dc2260a 100755 --- a/admin/kubezero.sh +++ b/admin/kubezero.sh @@ -111,35 +111,42 @@ post_kubeadm() { } -# Control plane upgrade -control_plane_upgrade() { - CMD=$1 +# Migrate KubeZero Config to current version +upgrade_kubezero_config() { + # get current values, argo app over cm + get_kubezero_values $ARGOCD + # tumble new config through migrate.py + migrate_argo_values.py < "$WORKDIR"/kubezero-values.yaml > "$WORKDIR"/new-kubezero-values.yaml \ + && mv "$WORKDIR"/new-kubezero-values.yaml "$WORKDIR"/kubezero-values.yaml + + update_kubezero_cm + + if [ "$ARGOCD" == "true" ]; then + # update argo app + export kubezero_chart_version=$(yq .version $CHARTS/kubezero/Chart.yaml) + kubectl get application kubezero -n argocd -o yaml | \ + yq ".spec.source.helm.valuesObject |= load(\"$WORKDIR/kubezero-values.yaml\") | .spec.source.targetRevision = strenv(kubezero_chart_version)" \ + > $WORKDIR/new-argocd-app.yaml + kubectl replace -f $WORKDIR/new-argocd-app.yaml $(field_manager $ARGOCD) + fi +} + + +# Control plane upgrade +kubeadm_upgrade() { ARGOCD=$(argo_used) render_kubeadm upgrade - if [[ "$CMD" =~ ^(cluster)$ ]]; then + # Check if we already have all controllers on the current version + OLD_CONTROLLERS=$(kubectl get nodes -l "node-role.kubernetes.io/control-plane=" --no-headers=true | grep -cv $KUBE_VERSION || true) + + # run control plane upgrade + if [ "$OLD_CONTROLLERS" != "0" ]; then + pre_control_plane_upgrade_cluster - # get current values, argo app over cm - get_kubezero_values $ARGOCD - - # tumble new config through migrate.py - migrate_argo_values.py < "$WORKDIR"/kubezero-values.yaml > "$WORKDIR"/new-kubezero-values.yaml \ - && mv "$WORKDIR"/new-kubezero-values.yaml "$WORKDIR"/kubezero-values.yaml - - update_kubezero_cm - - if [ "$ARGOCD" == "true" ]; then - # update argo app - export kubezero_chart_version=$(yq .version $CHARTS/kubezero/Chart.yaml) - kubectl get application kubezero -n argocd -o yaml | \ - yq ".spec.source.helm.valuesObject |= load(\"$WORKDIR/kubezero-values.yaml\") | .spec.source.targetRevision = strenv(kubezero_chart_version)" \ - > $WORKDIR/new-argocd-app.yaml - kubectl replace -f $WORKDIR/new-argocd-app.yaml $(field_manager $ARGOCD) - fi - pre_kubeadm _kubeadm init phase upload-config kubeadm @@ -155,7 +162,8 @@ control_plane_upgrade() { echo "Successfully upgraded KubeZero control plane to $KUBE_VERSION using kubeadm." - elif [[ "$CMD" =~ ^(final)$ ]]; then + # All controllers already on current version + else pre_cluster_upgrade_final # Finally upgrade addons last, with 1.32 we can ONLY call addon phase @@ -411,12 +419,8 @@ for t in $@; do bootstrap) control_plane_node bootstrap;; join) control_plane_node join;; restore) control_plane_node restore;; - kubeadm_upgrade) - control_plane_upgrade cluster - ;; - finalize_cluster_upgrade) - control_plane_upgrade final - ;; + upgrade_control_plane) kubeadm_upgrade;; + upgrade_kubezero) upgrade_kubezero_config;; apply_*) ARGOCD=$(argo_used) apply_module "${t##apply_}";; diff --git a/admin/libhelm.sh b/admin/libhelm.sh index fa4d7c4e..57a90ce4 100644 --- a/admin/libhelm.sh +++ b/admin/libhelm.sh @@ -353,7 +353,7 @@ EOF } -function control_plane_upgrade() { +function admin_job() { TASKS="$1" [ -z "$KUBE_VERSION" ] && KUBE_VERSION="latest" @@ -363,7 +363,7 @@ function control_plane_upgrade() { apiVersion: v1 kind: Pod metadata: - name: kubezero-upgrade + name: kubezero-admin-job namespace: kube-system labels: app: kubezero-upgrade @@ -408,10 +408,10 @@ spec: restartPolicy: Never EOF - kubectl wait pod kubezero-upgrade -n kube-system --timeout 120s --for=condition=initialized 2>/dev/null + kubectl wait pod kubezero-admin-job -n kube-system --timeout 120s --for=condition=initialized 2>/dev/null while true; do - kubectl logs kubezero-upgrade -n kube-system -f 2>/dev/null && break + kubectl logs kubezero-admin-job -n kube-system -f 2>/dev/null && break sleep 3 done - kubectl delete pod kubezero-upgrade -n kube-system + kubectl delete pod kubezero-admin-job -n kube-system } diff --git a/admin/upgrade_cluster.sh b/admin/upgrade_cluster.sh index 9528bb74..d82dce26 100755 --- a/admin/upgrade_cluster.sh +++ b/admin/upgrade_cluster.sh @@ -15,37 +15,28 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) ARGOCD=$(argo_used) echo "Checking that all pods in kube-system are running ..." -#waitSystemPodsRunning +waitSystemPodsRunning [ "$ARGOCD" == "true" ] && disable_argo -# Check if we already have all controllers on the current version -OLD_CONTROLLERS=$(kubectl get nodes -l "node-role.kubernetes.io/control-plane=" --no-headers=true | grep -cv $KUBE_VERSION || true) - -if [ "$OLD_CONTROLLERS" == "0" ]; then - # All controllers already on current version - control_plane_upgrade finalize_cluster_upgrade -else - # Otherwise run control plane upgrade - control_plane_upgrade kubeadm_upgrade -fi - -echo " to continue" -read -r +admin_job "upgrade_control_plane, upgrade_kubezero" #echo "Adjust kubezero values as needed:" # shellcheck disable=SC2015 #[ "$ARGOCD" == "true" ] && kubectl edit app kubezero -n argocd || kubectl edit cm kubezero-values -n kubezero +#echo " to continue" +#read -r + # upgrade modules -control_plane_upgrade "apply_kubezero, apply_network, apply_addons, apply_storage, apply_operators" +admin_job "apply_kubezero, apply_network, apply_addons, apply_storage, apply_operators" echo "Checking that all pods in kube-system are running ..." waitSystemPodsRunning echo "Applying remaining KubeZero modules..." -control_plane_upgrade "apply_cert-manager, apply_istio, apply_istio-ingress, apply_istio-private-ingress, apply_logging, apply_metrics, apply_telemetry, apply_argo" +admin_job "apply_cert-manager, apply_istio, apply_istio-ingress, apply_istio-private-ingress, apply_logging, apply_metrics, apply_telemetry, apply_argo" # we replace the project during v1.31 so disable again [ "$ARGOCD" == "true" ] && disable_argo @@ -60,6 +51,12 @@ while true; do sleep 1 done +echo "Once all controller nodes are running on $KUBE_VERSION, to continue" +read -r + +# Final control plane upgrades +admin_job "upgrade_control_plane" + echo "Please commit $ARGO_APP as the updated kubezero/application.yaml for your cluster." echo "Then head over to ArgoCD for this cluster and sync all KubeZero modules to apply remaining upgrades." diff --git a/charts/kubezero-addons/Chart.yaml b/charts/kubezero-addons/Chart.yaml index 4a585b96..09998272 100644 --- a/charts/kubezero-addons/Chart.yaml +++ b/charts/kubezero-addons/Chart.yaml @@ -3,7 +3,7 @@ name: kubezero-addons description: KubeZero umbrella chart for various optional cluster addons type: application version: 0.8.13 -appVersion: v1.30 +appVersion: v1.31 home: https://kubezero.com icon: https://cdn.zero-downtime.net/assets/kubezero/logo-small-64.png keywords: