13.5. 가상 머신 상태 모니터링
VMI(가상 머신 인스턴스)는 연결 해제, 교착 상태 또는 외부 종속성 문제와 같은 일시적인 문제로 인해 VMI가 비정상 상태가 될 수 있습니다. 상태 점검은 준비 및 활성 프로브의 조합을 사용하여 VMI에서 정기적으로 진단을 수행합니다.
13.5.1. 준비 및 활성 프로브 정보
준비 및 활성 프로브를 사용하여 비정상적인 VMI(가상 머신 인스턴스)를 탐지하고 처리합니다. VMI 사양에 프로브를 하나 이상 추가하여 트래픽이 준비되지 않은 VMI에 도달하지 않고 VMI가 응답하지 않을 때 새 인스턴스가 생성되도록 할 수 있습니다.
준비 상태 프로브는 VMI가 서비스 요청을 수락할 준비가 되었는지 확인합니다. 프로브가 실패하면 VMI가 준비될 때까지 VMI가 사용 가능한 엔드포인트 목록에서 VMI가 제거됩니다.
활성 프로브는 VMI의 응답 여부를 결정합니다. 프로브가 실패하면 VMI가 삭제되고 응답을 복원하기 위해 새 인스턴스가 생성됩니다.
VirtualMachineInstance
오브젝트의 spec.readinessProbe
및 spec.livenessProbe
필드를 설정하여 준비 및 활성 프로브를 구성할 수 있습니다. 이러한 필드는 다음 테스트를 지원합니다.
- HTTP GET
- 프로브는 웹 후크를 사용하여 VMI의 상태를 결정합니다. HTTP 응답 코드가 200에서 399 사이인 경우 테스트에 성공합니다. HTTP GET 테스트는 HTTP 상태 코드를 완전히 초기화할 때 반환하는 애플리케이션에 사용할 수 있습니다.
- TCP 소켓
- 프로브는 VMI에 대한 소켓을 열려고 시도합니다. VMI는 프로브에서 연결을 설정할 수 있는 경우에만 정상으로 간주됩니다. TCP 소켓 테스트는 초기화가 완료된 후 수신 대기를 시작하는 애플리케이션에 사용할 수 있습니다.
13.5.2. HTTP 준비 상태 프로브 정의
VMI(가상 머신 인스턴스) 구성의 spec.readinessProbe.httpGet
필드를 설정하여 HTTP 준비 프로브를 정의합니다.
절차
VMI 구성 파일에 준비 프로브의 세부 정보를 포함합니다.
HTTP GET 테스트가 있는 샘플 준비 상태 프로브
# ... spec: readinessProbe: httpGet: 1 port: 1500 2 path: /healthz 3 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 120 4 periodSeconds: 20 5 timeoutSeconds: 10 6 failureThreshold: 3 7 successThreshold: 3 8 # ...
- 1
- VMI 연결에 수행할 HTTP GET 요청입니다.
- 2
- 프로브에서 쿼리하는 VMI의 포트입니다. 위의 예에서 프로브는 포트 1500을 쿼리합니다.
- 3
- HTTP 서버에서 액세스할 경로입니다. 위의 예에서 서버의 /healthz 경로에 대한 핸들러가 성공 코드를 반환하면 VMI가 정상으로 간주됩니다. 핸들러에서 실패 코드를 반환하면 VMI가 사용 가능한 엔드포인트 목록에서 제거됩니다.
- 4
- 준비 프로브가 시작되기 전에 VMI가 시작된 후 시간(초)입니다.
- 5
- 프로브 수행 사이의 지연 시간(초)입니다. 기본 지연 시간은 10초입니다. 이 값은
timeoutSeconds
보다 커야 합니다. - 6
- 프로브가 시간 초과되고 VMI가 실패한 것으로 간주되는 비활성 시간(초)입니다. 기본값은 1입니다. 이 값은
periodSeconds
보다 작아야 합니다. - 7
- 프로브가 실패할 수 있는 횟수입니다. 기본값은 3입니다. 지정된 횟수의 시도 후 Pod가
Unready
로 표시됩니다. - 8
- 프로브에서 실패 후 성공한 것으로 간주하기 위해 성공으로 보고해야 하는 횟수입니다. 기본값은 1입니다.
다음 명령을 실행하여 VMI를 생성합니다.
$ oc create -f <file_name>.yaml
13.5.3. TCP 준비 프로브 정의
VMI(가상 머신 인스턴스) 구성의 spec.readinessProbe.tcpSocket
필드를 설정하여 TCP 준비 프로브를 정의합니다.
절차
VMI 구성 파일에 TCP 준비 프로브 세부 정보를 포함합니다.
TCP 소켓 테스트를 사용하는 샘플 준비 상태 프로브
... spec: readinessProbe: initialDelaySeconds: 120 1 periodSeconds: 20 2 tcpSocket: 3 port: 1500 4 timeoutSeconds: 10 5 ...
다음 명령을 실행하여 VMI를 생성합니다.
$ oc create -f <file_name>.yaml
13.5.4. HTTP 활성 프로브 정의
VMI(가상 머신 인스턴스) 구성의 spec.livenessProbe.httpGet
필드를 설정하여 HTTP 활성 프로브를 정의합니다. 준비 프로브와 동일한 방식으로 활성 프로브에 대한 HTTP 및 TCP 테스트를 모두 정의할 수 있습니다. 이 절차에서는 HTTP GET 테스트를 사용하여 샘플 활성 프로브를 구성합니다.
절차
VMI 구성 파일에 HTTP 활성 프로브의 세부 정보를 포함합니다.
HTTP GET 테스트가 포함된 샘플 활성 프로브
# ... spec: livenessProbe: initialDelaySeconds: 120 1 periodSeconds: 20 2 httpGet: 3 port: 1500 4 path: /healthz 5 httpHeaders: - name: Custom-Header value: Awesome timeoutSeconds: 10 6 # ...
- 1
- 활성 프로브가 시작되기 전에 VMI가 시작된 후 시간(초)입니다.
- 2
- 프로브 수행 사이의 지연 시간(초)입니다. 기본 지연 시간은 10초입니다. 이 값은
timeoutSeconds
보다 커야 합니다. - 3
- VMI 연결에 수행할 HTTP GET 요청입니다.
- 4
- 프로브에서 쿼리하는 VMI의 포트입니다. 위의 예에서 프로브는 포트 1500을 쿼리합니다. VMI는 cloud-init를 통해 포트 1500에 최소 HTTP 서버를 설치하고 실행합니다.
- 5
- HTTP 서버에서 액세스할 경로입니다. 위의 예에서 서버의
/healthz
경로에 대한 핸들러가 성공 코드를 반환하면 VMI가 정상으로 간주됩니다. 핸들러에서 실패 코드를 반환하면 VMI가 삭제되고 새 인스턴스가 생성됩니다. - 6
- 프로브가 시간 초과되고 VMI가 실패한 것으로 간주되는 비활성 시간(초)입니다. 기본값은 1입니다. 이 값은
periodSeconds
보다 작아야 합니다.
다음 명령을 실행하여 VMI를 생성합니다.
$ oc create -f <file_name>.yaml
13.5.5. 템플릿: 상태 점검을 정의하는 가상 머신 구성 파일
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: labels: special: vm-fedora name: vm-fedora spec: template: metadata: labels: special: vm-fedora spec: domain: devices: disks: - disk: bus: virtio name: containerdisk - disk: bus: virtio name: cloudinitdisk resources: requests: memory: 1024M readinessProbe: httpGet: port: 1500 initialDelaySeconds: 120 periodSeconds: 20 timeoutSeconds: 10 failureThreshold: 3 successThreshold: 3 terminationGracePeriodSeconds: 180 volumes: - name: containerdisk containerDisk: image: kubevirt/fedora-cloud-registry-disk-demo - cloudInitNoCloud: userData: |- #cloud-config password: fedora chpasswd: { expire: False } bootcmd: - setenforce 0 - dnf install -y nmap-ncat - systemd-run --unit=httpserver nc -klp 1500 -e '/usr/bin/echo -e HTTP/1.1 200 OK\\n\\nHello World!' name: cloudinitdisk