업그레이드 전 도구 실행

이 문서에서는 업그레이드를 준비하기 위해 독립형 도구를 실행하는 방법을 보여줍니다. VMware용 GKE 버전 1.9 이상의 관리자 또는 사용자 클러스터를 업그레이드하기 전에 업그레이드 전 도구를 실행하는 것이 좋습니다.

도구를 실행하려면 이 문서에서 하드 코딩된 보안 해시 알고리즘(SHA)을 사용하는 bash 스크립트를 사용합니다. 이 문서는 도구의 출시 버전이 출시될 때마다 새 SHA로 업데이트됩니다. 이 스크립트는 업그레이드할 버전에 따라 특정 버전의 프리플라이트 검사를 실행하는 Kubernetes 작업을 만듭니다.

업그레이드 전 검사

이 도구는 사용자 클러스터를 업그레이드하기 전에 다음을 확인합니다.

카테고리 설명
클러스터 상태
  • 관리자 클러스터의 모든 네임스페이스에서 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: 업그레이드할 VMware용 GDCV 패치 버전입니다. 버전 번호 형식은 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. 작업에서 제어하는 포드에서 다음 명령어를 실행하여 유효성 검사 결과 목록을 가져옵니다.

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

    다음을 바꿉니다.

    • JOB_NAME: 이전 단계에서 스크립트가 출력하는 작업의 이름입니다.

    • JOB_NAMESPACE: 관리자 또는 사용자 클러스터 업그레이드 여부에 따라 설정하는 값이 달라집니다. 관리자 클러스터를 업그레이드하는 경우 kube-system을 지정합니다. 사용자 클러스터를 업그레이드하는 경우 USER_CLUSTER_NAME-gke-onprem-mgmt를 지정합니다.

    작업이 완료되거나 백오프 한도에 도달하여 실패할 때까지 몇 분 정도 기다립니다. 결과에서 Warning, Unknown 또는 Failure 상태 검사에 대한 Reason을 검토하여 문제를 해결할 수 있는지 확인합니다.

  3. 클러스터를 업그레이드하기 전에 다음 명령어를 실행하여 작업을 삭제합니다.

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