共用方式為


在 虛擬機器擴展集 上設定捲動升級的自訂計量 (預覽)

注意

虛擬機器擴展集 上滾動升級的自定義計量目前為預覽狀態。 若您同意補充的使用規定即可取得預覽。 在公開上市 (GA) 之前,這些功能的某些領域可能會變更。

滾動升級的自定義計量可讓您利用 應用程式健康情況擴充功能 ,將自定義計量發出至虛擬機擴展集。 這些自定義計量可用來告訴擴展集在觸發滾動升級時應更新虛擬機的順序。 自定義計量也可以在特定實例上略過升級時通知您的擴展集。 這可讓您更充分掌控排序和更新程式本身。

自定義計量可以與其他滾動升級功能搭配使用,例如 自動OS升級自動擴充功能升級MaxSurge滾動升級

需求

  • 在 虛擬機器擴展集 上使用自定義計量進行滾動升級時,擴展集也必須使用具有豐富健康狀態的應用程式健康情況延伸模組來報告階段排序或略過升級資訊。 使用具有二進位狀態的應用程式健康情況擴充功能時,不支援自定義計量升級。
  • 應用程式健康情況延伸模組必須設定為使用 HTTP 或 HTTPS,才能接收自定義計量資訊。 不支援 TCP 與滾動升級的自定義計量整合。

概念

階段排序

階段是虛擬機的群組建構。 每個階段都是透過 屬性設定從應用程式健康情況延伸模組customMetrics發出的元數據來決定。 虛擬機擴展集會擷取自定義計量中擷取的資訊,並用它來將虛擬機放入其指派的階段。 在每個階段內,虛擬機擴展集也會指派升級批次。 每個批次都是使用 滾動升級原則 來設定,以考慮每個虛擬機的更新網域 (UD)、容錯網域 (FD) 和區域資訊。

起始滾動升級時,虛擬機會放入其指定的階段。 分階段升級會依數值順序執行。 階段內所有批次中的 虛擬機器 將會完成,再移至下一個階段。 如果虛擬機未收到任何階段順序,擴展集會將它放入最後一個階段

區域擴展集此圖顯示在區域擴展集上使用 n 階段升級時所發生之情況的高階圖表。

區域性擴展集此圖顯示在分區擴展集上使用 n 階段升級時所發生之狀況的高階圖表。

若要指定應該與虛擬機相關聯的階段號碼,請使用 phaseOrderingNumber 參數。

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

略過升級

略過升級功能可讓個別實例在滾動升級期間省略升級。 這類似於使用實例保護,但可以更順暢地整合到滾動升級工作流程和實例層級應用程式中。 類似於階段排序,略過升級資訊會透過應用程式健康情況擴充功能和自定義計量設定傳遞至虛擬機擴展集。 觸發滾動升級時,虛擬機擴展集會檢查應用程式健康情況擴充功能自定義計量的回應,如果略過升級設定為 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
          }
        }
      }
    ]
  }
}
名稱 值 / 範例 資料類型
protocol httphttps 字串
port 當通訊協定為 或時選擇性httphttps int
requestPath 使用 http 或 時為必要 https 字串
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

升級擴展集中的虛擬機。 只有在擴展集使用手動升級原則時,才需要此步驟。 如需升級原則的詳細資訊,請參閱 虛擬機器擴展集 的升級原則

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

如需更多回應組態範例,請參閱 應用程式健康情況範例

下一步

了解如何在虛擬機器擴展集上執行手動升級