VM의 고가용성 정책 구성

이 문서에서는 Anthos VM 런타임을 사용하여 실행되는 가상 머신(VM)의 고가용성 정책을 구성하는 방법을 보여줍니다.

Anthos VM 런타임을 사용 설정하면 클러스터가 default라는 이름의 VMHighAvailabilityPolicy 객체를 만듭니다. 이 객체는 VM을 실행하는 클러스터 노드가 실패할 경우 기본 복구 전략을 지정합니다. 가능한 기본 복구 전략은 다음과 같습니다.

  • 재예약: 다른 클러스터 노드에 VM을 다시 예약합니다.
  • 무시: 아무 작업도 수행하지 않습니다.

처음에는 기본 복구 전략이 Reschedule로 설정되어 있습니다.

다음 상황에서는 Reschedule 기본 복구 전략이 적합합니다.

  • 클러스터에 워커 노드가 2개 이상 있습니다.

  • VM 디스크가 네트워크 파일 기반 스토리지 클래스를 사용하여 프로비저닝됩니다. 즉, 스토리지 클래스가 여러 클라이언트에서 POSIX 파일 잠금을 조정하는 네트워크 파일 시스템을 기반으로 합니다. 네트워크 파일 시스템(NFS)은 네트워크 파일 기반 스토리지 클래스의 예입니다.

VM이 로컬 스토리지 또는 블록 기반 스토리지 시스템을 사용하는 경우 기본 복구 전략을 Ignore로 설정하는 것이 좋습니다. 권장되는 이유는 다음과 같습니다.

  • VM이 로컬 스토리지를 사용하는데 노드가 실패하면 저장된 데이터를 복구하여 새 노드로 이동할 방법이 없습니다.

  • VM이 블록 기반 스토리지 시스템을 사용할 경우 스토리지에 충분한 분리가 보장되지 않을 수 있습니다. 이로 인해 VM 예약 중에 동시 디스크 액세스 및 데이터 손상이 발생할 수 있습니다.

VMHighAvailabilityPolicy 객체 검사

VMHighAvailabilityPolicy 객체가 있는지 확인합니다.

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy --namespace vm-system

USER_CLUSTER_KUBECONFIG를 사용자 클러스터 kubeconfig 파일 경로로 바꿉니다.

출력에 default라는 이름의 VMHighAvailabilityPolicy 객체가 있는 것으로 표시됩니다. 출력에서 defaultRecoveryStrategy의 현재 값도 확인할 수 있습니다. 예를 들어 다음 출력은 defaultRecoveryStrategy의 현재 값이 Reschedule임을 보여줍니다.

vm-system   default   5m55s   Reschedule   15s   1m30s

VMHighAvailabilityPolicy 객체를 자세히 살펴봅니다.

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy \
    --namespace vm-system --output yaml

출력 예시:

apiVersion: vm.cluster.gke.io/v1alpha1
kind: VMHighAvailabilityPolicy
metadata:
  ...
  labels:
    app.kubernetes.io/component: kubevirt
    app.kubernetes.io/managed-by: virt-operator
    kubevirt.io: virt-api
  name: default
  namespace: vm-system
  ..
spec:
  defaultRecoveryStrategy: Reschedule
  nodeHeartbeatInterval: 15s
  nodeMonitorGracePeriod: 1m30s

기본 복구 전략 변경

경우에 따라서는 기본 복구 전략을 변경하는 것이 좋습니다. 예를 들어 VM이 로컬 스토리지 또는 네트워크 파일 기반이 아닌 파일 시스템을 사용하는 경우 defaultRecoveryStrategy 값을 Ignore로 변경하는 것이 좋습니다.

defaultRecoveryStrategy 값을 변경하려면 수정할 VMHighAvailabilityPolicy 객체를 엽니다.

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit VMHighAvailabilityPolicy \
    default --namespace vm-system

텍스트 편집기에서 defaultRecoveryStrategy 값을 원하는 값(Reschedule 또는 Ignore)으로 변경합니다. 텍스트 편집기를 닫습니다.

VM의 기본 복구 전략 재정의

기본 복구 전략은 클러스터에서 실행 중인 모든 VM에 적용됩니다. 그러나 개별 VM의 기본 복구 전략을 재정의해야 할 수 있습니다.

예를 들어 대부분의 VM이 네트워크 파일 기반 스토리지 클래스로 프로비저닝되지만 일부 VM이 블록 기반 스토리지 클래스로 프로비저닝된다고 가정해 보겠습니다. 블록 기반 스토리지를 사용하는 VM마다 개별 VM의 복구 전략을 Ignore로 설정하여 기본 복구 전략을 재정의하는 것이 좋습니다.

VM의 기본 복구 전략을 재정의하려면 VirtualMachineInstance(VMI) 객체와 GVM 객체 모두에 vm.cluster.gke.io/vm-ha-recovery-strategy 주석을 추가합니다.

예를 들어 다음 명령어는 my-vm이라는 VM의 복구 전략을 Ignore로 설정합니다.

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate vmi my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate gvm my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite

나중에 주석을 삭제하려면 주석 이름 끝에 하이픈을 사용합니다. 예를 들면 다음과 같습니다.

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate vmi my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy-

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
  annotate gvm my-vm \
  vm.cluster.gke.io/vm-ha-recovery-strategy-

고급 구성

기본 복구 전략을 구성하는 것 외에도 다음을 구성할 수 있습니다.

  • 노드 하트비트 간격: 각 클러스터 노드에서 전송한 하트비트 사이의 시간입니다.

  • 노드 모니터 유예 기간: 노드가 비정상으로 간주되기 전에 하트비트 전송에 실패할 수 있는 최대 시간입니다.

대부분의 경우 기본값의 하트비트 간격 및 유예 기간이 적합합니다. 그러나 복구 속도와 오버헤드 간의 균형을 미세 조정하려는 경우 이 값을 조정할 수 있습니다. 하트비트 간격이 짧으면 복구 시간이 단축되지만 오버헤드가 증가합니다. 대규모 클러스터에서는 하트비트 간격을 연장할 수 있습니다. 많은 노드에서 빈번하게 발생하는 하트비트는 Kubernetes API 서버에 허용되지 않는 부하를 발생시킬 수 있기 때문입니다.

하트비트 간격이 한 번 누락된 것으로 인해 노드가 비정상으로 간주되지 않도록 하트비트 간격을 유예 기간보다 낮게 유지합니다.

kubectl edit을 실행하여 수정할 VMHighAvailabilityPolicy 객체를 엽니다. nodeHeartbeatIntervalnodeMonitorGracePeriod를 원하는 값으로 설정합니다.

spec:
  defaultRecoveryStrategy: Reschedule
  nodeHeartbeatInterval: 15s
  nodeMonitorGracePeriod: 1m30s