다음을 통해 공유


Virtual Machine Scale Sets에서 롤링 업그레이드에 대한 사용자 지정 메트릭 구성(미리 보기)

참고 항목

Virtual Machine Scale Sets의 롤링 업그레이드에 대한 사용자 지정 메트릭은 현재 미리 보기로 제공됩니다. 추가 사용 약관에 동의하는 조건으로 미리 보기를 사용할 수 있습니다. 이러한 기능의 몇 가지 측면은 일반 공급(GA) 전에 변경될 수 있습니다.

롤링 업그레이드에 대한 사용자 지정 메트릭을 사용하면 애플리케이션 상태 확장을 활용하여 가상 머신 확장 집합에 사용자 지정 메트릭을 내보낸다. 이러한 사용자 지정 메트릭을 사용하여 롤링 업그레이드가 트리거될 때 가상 머신을 업데이트해야 하는 순서를 확장 집합에 알릴 수 있습니다. 사용자 지정 메트릭은 특정 인스턴스에서 업그레이드를 건너뛰어야 하는 경우 확장 집합에 알릴 수도 있습니다. 이렇게 하면 순서 지정 및 업데이트 프로세스 자체를 더 많이 제어할 수 있습니다.

사용자 지정 메트릭은 자동 OS 업그레이드, 자동 확장 업그레이드 및 MaxSurge 롤링 업그레이드와 같은 다른 롤링 업그레이드 기능과 함께 사용할 수 있습니다.

요구 사항

  • Virtual Machine Scale Sets에서 롤링 업그레이드에 사용자 지정 메트릭을 사용하는 경우 확장 집합은 풍부한 상태애플리케이션 상태 확장을 사용하여 단계 순서 지정을 보고하거나 업그레이드 정보를 건너뛰어야 합니다. 이진 상태의 애플리케이션 상태 확장을 사용하는 경우 사용자 지정 메트릭 업그레이드가 지원되지 않습니다.
  • 사용자 지정 메트릭 정보를 수신하려면 HTTP 또는 HTTPS를 사용하도록 애플리케이션 상태 확장을 설정해야 합니다. TCP는 롤링 업그레이드에 대한 사용자 지정 메트릭과의 통합에 지원되지 않습니다.

개념

단계 순서 지정

단계는 가상 머신에 대한 그룹화 구문입니다. 각 단계는 속성을 통해 애플리케이션 상태 확장에서 내보낸 메타데이터를 설정하여 결정됩니다customMetrics. Virtual Machine Scale Set는 사용자 지정 메트릭에서 검색된 정보를 가져와서 가상 머신을 할당된 단계에 배치하는 데 사용합니다. 각 단계 내에서 Virtual Machine Scale 집합은 업그레이드 일괄 처리도 할당합니다. 각 일괄 처리는 UD(업데이트 도메인), FD(장애 도메인) 및 각 가상 머신의 영역 정보를 고려한 롤링 업그레이드 정책을 사용하여 구성됩니다.

롤링 업그레이드가 시작되면 가상 머신이 지정된 단계에 배치됩니다. 단계별 업그레이드는 숫자 순서대로 수행됩니다. 단계 내의 모든 일괄 처리에 있는 Virtual Machines는 다음 단계로 이동하기 전에 완료됩니다. 가상 머신에 대해 단계 순서를 수신하지 않으면 확장 집합이 마지막 단계에 배치됩니다.

지역별 확장 집합지역 확장 집합에서 n단계 업그레이드를 사용할 때 발생하는 작업의 개략적인 다이어그램을 보여 주는 다이어그램

영역 확장 집합영역 확장 집합에서 n단계 업그레이드를 사용할 때 발생하는 작업의 개략적인 다이어그램을 보여 주는 다이어그램

가상 머신이 연결되어야 하는 단계 번호를 지정하려면 매개 변수를 사용합니다 phaseOrderingNumber .

{
     “applicationHealthState”: “Healthy”,
      “customMetrics”: "{ \"rollingUpgrade\": { \"PhaseOrderingNumber\": 0 } }"
}

업그레이드 건너뛰기

업그레이드 기능을 건너뛰면 롤링 업그레이드 중에 개별 인스턴스를 업그레이드에서 생략할 수 있습니다. 이는 인스턴스 보호를 활용하는 것과 비슷하지만 롤링 업그레이드 워크플로 및 인스턴스 수준 애플리케이션에 보다 원활하게 통합할 수 있습니다. 단계 순서 지정과 마찬가지로, 업그레이드 건너뛰기 정보는 애플리케이션 상태 확장 및 사용자 지정 메트릭 설정을 통해 Virtual Machine Scale Set에 전달됩니다. 롤링 업그레이드가 트리거되면 Virtual Machine Scale Set은 애플리케이션 상태 확장 사용자 지정 메트릭의 응답을 확인하고 업그레이드 건너뛰기가 true로 설정된 경우 인스턴스는 롤링 업그레이드에 포함되지 않습니다.

영역 확장 집합에서 업그레이드 건너뛰기를 사용할 때 발생하는 작업의 개략적인 다이어그램을 보여 주는 다이어그램

가상 머신에서 업그레이드를 건너뛰려면 매개 변수를 사용합니다 SkipUpgrade . 이렇게 하면 업그레이드를 수행할 때 롤링 업그레이드에서 이 가상 머신을 건너뛰도록 지시합니다.

{
     “applicationHealthState”: “Healthy”,
      “customMetrics”: "{ \"rollingUpgrade\": { \"SkipUpgrade\": true} }"
}

업그레이드 건너뛰기 및 단계 순서를 함께 사용할 수도 있습니다.

{
     “applicationHealthState”: “Healthy”,
      “customMetrics”: "{ \"rollingUpgrade\": { \"SkipUpgrade\": false, \"PhaseOrderingNumber\": 0 } }"
}

애플리케이션 상태 확장 구성

애플리케이션 상태 확장에는 연결된 포트 또는 요청 경로가 있는 HTTP 또는 HTTPS 요청이 필요합니다. TCP 프로브는 애플리케이션 상태 확장을 사용할 때 지원되지만 프로브 응답 본문을 통해 설정할 ApplicationHealthState 수 없으며 사용자 지정 메트릭을 사용하여 롤링 업그레이드에 사용할 수 없습니다.

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "1.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1
          }
        }
      }
    ]
  }
}
속성 값/예제 데이터 형식
프로토콜 http 또는 https string
port 프로토콜이 있는 경우 선택 사항 또는 httphttps int
requestPath 사용 http 시 필수 또는 https string
intervalInSeconds 선택 사항, 기본값은 5초입니다. 이 설정은 각 상태 프로브 사이의 간격입니다. 예를 들어 intervalInSeconds == 5인 경우 프로브는 5초마다 한 번씩 로컬 애플리케이션 엔드포인트로 전송됩니다. int
numberOfProbes 선택 사항, 기본값은 1입니다. 이 설정은 상태를 변경하는 데 필요한 연속 프로브의 수입니다. 예를 들어 numberOfProbles == 3인 경우 상태를 "비정상"/"알 수 없음"에서 "정상" 상태로 변경하려면 3개의 연속 "정상" 신호가 필요합니다. 성능 상태를 "비정상" 또는 "알 수 없음" 상태로 변경하는 경우에도 동일한 요구 사항을 충족해야 합니다. int
gracePeriod 선택 사항, 기본값 = intervalInSeconds * numberOfProbes; 최대 유예 기간은 7200초입니다. int

애플리케이션 상태 확장 설치

az vmss extension set를 사용하여 확장 집합 모델 정의에 애플리케이션 상태 확장을 추가합니다.

원하는 설정을 사용하여 호출 extensions.json 된 json 파일을 만듭니다.

{
  "protocol": "<protocol>",
  "port": <port>,
  "requestPath": "</requestPath>",
  "gracePeriod": <healthExtensionGracePeriod>
}

애플리케이션 상태 확장을 적용합니다.

az vmss extension set \
  --name ApplicationHealthLinux \
  --publisher Microsoft.ManagedServices \
  --version 2.0 \
  --resource-group myResourceGroup \
  --vmss-name myScaleSet \
  --settings ./extension.json

확장 집합에서 가상 머신을 업그레이드합니다. 이 단계는 확장 집합이 수동 업그레이드 정책을 사용하는 경우에만 필요합니다. 업그레이드 정책에 대한 자세한 내용은 Virtual Machine Scale Sets에 대한 업그레이드 정책을 참조 하세요.

az vmss update-instances \
  --resource-group myResourceGroup \
  --name myScaleSet \
  --instance-ids "*"

애플리케이션 상태 확장 응답 구성

사용자 지정 메트릭 응답을 구성하는 작업은 여러 가지 방법으로 수행할 수 있습니다. 기존 애플리케이션에 통합되고 동적으로 업데이트되며 다양한 함수와 함께 사용하여 특정 상황에 따라 출력을 제공할 수 있습니다.

예제 1: 단계 순서

이 샘플 애플리케이션은 단계가 속한 것을 내보내기 위해 확장 집합의 가상 머신에 설치할 수 있습니다.

#!/bin/bash

# Open firewall port (replace with your firewall rules as needed)
sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT

# Create Python HTTP server for responding with JSON
cat <<EOF > server.py
import json
from http.server import BaseHTTPRequestHandler, HTTPServer

# Function to generate the JSON response
def generate_response_json():
    return json.dumps({
        "ApplicationHealthState": "Healthy",
        "CustomMetrics": {
            "RollingUpgrade": {
                "PhaseOrderingNumber": 0
            }
        }
    })

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Respond with HTTP 200 and JSON content
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        response = generate_response_json()
        self.wfile.write(response.encode('utf-8'))

# Set up the HTTP server
def run(server_class=HTTPServer, handler_class=RequestHandler):
    server_address = ('localhost', 8000)
    httpd = server_class(server_address, handler_class)
    print('Starting server on port 8000...')
    httpd.serve_forever()

if __name__ == "__main__":
    run()
EOF

# Run the server
python3 server.py

예제 2: 업그레이드 건너뛰기

이 샘플 애플리케이션은 확장 집합의 가상 머신에 설치하여 예정된 롤링 업그레이드에서 인스턴스를 생략해야 한다는 것을 내보낼 수 있습니다.

#!/bin/bash

# Open firewall port (replace with your firewall rules as needed)
sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT

# Create Python HTTP server for responding with JSON
cat <<EOF > server.py
import json
from http.server import BaseHTTPRequestHandler, HTTPServer

# Function to generate the JSON response
def generate_response_json():
    return json.dumps({
        "ApplicationHealthState": "Healthy",
        "CustomMetrics": {
            "RollingUpgrade": {
                "SkipUpgrade": "true"
            }
        }
    })

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Respond with HTTP 200 and JSON content
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        response = generate_response_json()
        self.wfile.write(response.encode('utf-8'))

# Set up the HTTP server
def run(server_class=HTTPServer, handler_class=RequestHandler):
    server_address = ('localhost', 8000)
    httpd = server_class(server_address, handler_class)
    print('Starting server on port 8000...')
    httpd.serve_forever()

if __name__ == "__main__":
    run()
EOF

# Run the server
python3 server.py

예제 3: 결합된 단계 순서 및 업그레이드 건너뛰기

이 샘플 애플리케이션에는 단계 순서가 포함되며 업그레이드 매개 변수를 사용자 지정 메트릭 응답으로 건너뜁니다.

#!/bin/bash

# Open firewall port (replace with your firewall rules as needed)
sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT

# Create Python HTTP server for responding with JSON
cat <<EOF > server.py
import json
from http.server import BaseHTTPRequestHandler, HTTPServer

# Function to generate the JSON response
def generate_response_json():
    return json.dumps({
        "ApplicationHealthState": "Healthy",
        "CustomMetrics": {
            "RollingUpgrade": {
                "PhaseOrderingNumber": 1,
                "SkipUpgrade": "false"
            }
        }
    })

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Respond with HTTP 200 and JSON content
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        response = generate_response_json()
        self.wfile.write(response.encode('utf-8'))

# Set up the HTTP server
def run(server_class=HTTPServer, handler_class=RequestHandler):
    server_address = ('localhost', 8000)
    httpd = server_class(server_address, handler_class)
    print('Starting server on port 8000...')
    httpd.serve_forever()

if __name__ == "__main__":
    run()
EOF

# Run the server
python3 server.py

더 많은 응답 구성 예제는 애플리케이션 상태 샘플을 참조 하세요.

다음 단계

Virtual Machine Scale Sets에서 수동 업그레이드를 수행하는 방법을 알아봅니다.