アップグレード準備ツールを実行する

このドキュメントでは、アップグレードの準備としてスタンドアロン ツールを実行する方法について説明します。バージョン 1.9 以降の GKE on VMware の管理クラスタまたはユーザー クラスタをアップグレードする前に、アップグレード準備ツールを実行することをおすすめします。

このツールの実行には、このドキュメント内にある、ハードコードされたセキュア ハッシュ アルゴリズム(SHA)を使用する bash スクリプトを使用します。ツールのリリースごとに、このドキュメントは新しい SHA で更新されます。このスクリプトでは、アップグレードするバージョンに応じて特定のバージョンのプリフライト チェックを実行する Kubernetes Job を作成します。

アップグレード前のチェック

このツールは、ユーザー クラスタをアップグレードする前に次のことを確認します。

カテゴリ 説明
クラスタの状態
  • 管理クラスタのすべての名前空間の PDB を検証します。
  • ユーザー クラスタのすべての名前空間の PDB を検証します。
  • 管理クラスタの以前のアップグレードが正常に完了したことを検証します。
構成
  • パッチ バージョンのアップグレードをおすすめします。
  • 関連する既知の問題で説明されているように、コンポーネント アクセス SA 鍵がワイプされているかどうかを確認します。
  • 1.10 にアップグレードする場合に、この既知の問題の回避策を適用する必要がある場合は警告が表示されます。

このツールは、管理クラスタをアップグレードする前に次のことを確認します。

カテゴリ 説明
クラスタの状態 管理クラスタのすべての名前空間の PodDisruptionBudgets(PDB)を検証します。
構成

ツールの実行を準備する

  1. まだアップグレードしていない場合、管理ワークステーションをアップグレードします。

  2. OS イメージを vSphere にインポートしていない場合は、gkectl prepare を実行してインポートします。

    gkectl prepare \
        --bundle-path /var/lib/gke/bundles/gke-onprem-vsphere-TARGET_VERSION.tgz \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

    次のように置き換えます。

    • TARGET_VERSION: アップグレードする GDCV for VMware のパッチ バージョン。バージョン番号の形式は、1.13.10-gke.42 のように完全なパッチ バージョンにする必要があります。

    • ADMIN_CLUSTER_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。

  3. 非公開レジストリを使用している場合は、提供された Docker ダイジェストを含むプリフライト コンテナ イメージをダウンロードし、非公開レジストリにイメージをアップロードします。非公開レジストリを使用していない場合は、次のステップに進みます。

    export SRC_IMAGE=gcr.io/gke-on-prem-release/preflight@sha256:9704315c6637750a014d0079ca04a8f97d0ca3735e175020377107c3181f6234
    export DST_IMAGE=REGISTRY_ADDRESS/preflight:$(date +%Y-%m%d-%H%M%S)
    docker pull $SRC_IMAGE
    docker tag $SRC_IMAGE $DST_IMAGE
    docker push $DST_IMAGE
    

    REGISTRY_ADDRESS は非公開レジストリのアドレスに置き換えます。

  4. 次の bash スクリプトで、これらのプレースホルダの値を次のように設定します。

    • ADMIN_CLUSTER_KUBECONFIG: 管理クラスタの kubeconfig ファイルのパス。

    • REGISTRY_ADDRESS: 管理クラスタが非公開レジストリを使用する場合、これは前の手順で指定した非公開レジストリのアドレスです。非公開レジストリを使用しない場合は、一般公開レジストリ(gcr.io/gke-on-prem-release)を指定します。

    #!/bin/bash
    UPGRADE_TARGET_VERSION=${1}
    CLUSTER_NAME=${2}
    ADMIN_KUBECONFIG=ADMIN_CLUSTER_KUBECONFIG
    REGISTRY_ADDRESS=REGISTRY_ADDRESS
    pre_upgrade_namespace=kube-system
    if [[ -z "$CLUSTER_NAME" ]]
    then
      echo "Running the pre-ugprade tool before admin cluster upgrade"
    else
      echo "Running the pre-ugprade tool before user cluster upgrade"
      pre_upgrade_namespace=$CLUSTER_NAME-gke-onprem-mgmt
    fi
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: pre-upgrade-job
      namespace: $pre_upgrade_namespace
    EOF
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      creationTimestamp: null
      name: pre-upgrade-job-rolebinding-in-$pre_upgrade_namespace
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: onprem-user-cluster-controller-role
    subjects:
      - kind: ServiceAccount
        name: pre-upgrade-job
        namespace: $pre_upgrade_namespace
    EOF
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pre-upgrade-$(date +%Y-%m%d-%H%M%S)
      namespace: $pre_upgrade_namespace
      labels:
        onprem.cluster.gke.io/job-usage: preflight
    spec:
      ttlSecondsAfterFinished: 2592000
      backoffLimit: 2
      template:
        metadata:
          labels:
            onprem.cluster.gke.io/pod-usage: preflight
        spec:
          containers:
          - name: preflight
            image: $REGISTRY_ADDRESS/preflight@sha256:9704315c6637750a014d0079ca04a8f97d0ca3735e175020377107c3181f6234
            imagePullPolicy: Always
            command:
            - /preflight
            - --upgrade-target-version
            - "$UPGRADE_TARGET_VERSION"
            - --cluster-name
            - "$CLUSTER_NAME"
            - --scenario
            - pre-upgrade
          restartPolicy: Never
          serviceAccountName: pre-upgrade-job
          imagePullSecrets:
          - name: private-registry-creds
    EOF
    
  5. 上記の bash スクリプトを pre-upgrade.sh というファイルに保存し、次のように実行可能にします。

    chmod +x pre-upgrade.sh
    

スクリプトを実行する

  1. スクリプトの実行時に指定する引数は、ユーザー クラスタと管理クラスタのどちらをアップグレードするかによって異なります。

    • 管理クラスタをアップグレードする前に、次のようにスクリプトを実行します。
    ./pre-upgrade.sh TARGET_VERSION
    
    • ユーザー クラスタをアップグレードする前に、次のようにスクリプトを実行します。
    ./pre-upgrade.sh TARGET_VERSION USER_CLUSTER_NAME
    

    USER_CLUSTER_NAME は、アップグレードするユーザー クラスタの名前に置き換えます。

    出力は次のようになります。

    job.batch/pre-upgrade-2023-0822-213551 created
    
  2. ジョブによって制御される Pod で次のコマンドを実行して、検証結果のリストを取得します。

    kubectl logs -n JOB_NAMESPACE jobs/JOB_NAME \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

    次のように置き換えます。

    • JOB_NAME: スクリプトが前のステップで出力したジョブの名前です。

    • JOB_NAMESPACE: 設定する値は、管理クラスタとユーザー クラスタのどちらをアップグレードするかによって異なります。管理クラスタをアップグレードする場合は、kube-system を指定します。ユーザー クラスタをアップグレードする場合は、USER_CLUSTER_NAME-gke-onprem-mgmt を指定します。

    ジョブが完了するまで、またはバックオフの上限に達して失敗するまで数分待ちます。結果で、ステータスが WarningUnknownFailure のチェックについて Reason を調べて、問題を解決できるかどうかを確認します。

  3. クラスタをアップグレードする前に、次のコマンドを実行して Job を削除します。

    kubectl delete jobs JOB_NAME -n JOB_NAMESPACE \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG