全部產品
Search
文件中心

Application Real-Time Monitoring Service:Container ServiceACK通過ack-onepilot組件安裝Python探針

更新時間:Nov 19, 2024

當您需要對部署在Container Service for Kubernetes (ACK)中的Python應用進行監控時,通過安裝ARMS應用監控組件ack-onepilot並修改對應的Dockerfile,即可在應用即時監控服務ARMS中查看對應應用的應用拓撲、介面調用、調用鏈分析等相關監控資料。本文將介紹如何為部署在Container Service for Kubernetes (ACK)中的Python應用安裝探針。

說明

如果您在使用Python探針過程中有任何問題,歡迎通過DingTalk答疑群(群號:35568145)與我們聯絡。

前提條件

注意事項

  • 如果應用使用Unicorn啟動,需要替換為Gunicorn。

    例如:

    unicorn -w 4 -b 0.0.0.0:8000 app:app

    修改為:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 app:app
  • 如果有使用gevent協程,則需要設定環境變數GEVENT_ENABLE=true

    例如程式中有使用:

    from gevent import monkey
    monkey.patch_all()

    需要設定環境變數如下:

    GEVENT_ENABLE=true

步驟一:安裝ARMS應用監控組件

  1. 登入Container Service管理主控台,在叢集列表頁面,單擊目的地組群名稱進入叢集詳情頁。

  2. 在左側導覽列選擇營運管理 > 組件管理,然後在右上方通過關鍵字搜尋ack-onepilot

    重要

    請確保ack-onepilot的版本在3.2.4或以上。

  3. ack-onepilot卡片上單擊安裝

    說明

    ack-onepilot組件預設支援1000個pod規模,叢集pod每超過1000個,ack-onepilot資源對應的CPU請增加0.5核、記憶體請增加512 MB。

  4. 在彈出的頁面中可以配置相關的參數,建議使用預設值,單擊確定

    說明

    安裝完成後,您可以在組件管理頁面升級、配置或卸載ack-onepilot組件。

步驟二:修改Dockerfile

  1. 從PyPI倉庫下載探針安裝器。

    pip3 install aliyun-bootstrap
  2. 使用aliyun-bootstrap安裝探針。

    aliyun-bootstrap -a install
  3. 通過ARMS Python探針啟動應用。

    aliyun-instrument python app.py
  4. 構建鏡像。

完整的Dockerfile樣本如下:

    修改前的Dockerfile

    # 使用Python 3.10基礎鏡像
    FROM docker.m.daocloud.io/python:3.10
    
    # 設定工作目錄
    WORKDIR /app
    
    # 複製requirements.txt檔案到工作目錄
    COPY requirements.txt .
    
    # 使用pip安裝依賴
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY ./app.py /app/app.py
    # 暴露容器的8000連接埠
    EXPOSE 8000
    CMD ["python","app.py"]

    修改後的Dockerfile

    # 使用官方的Python 3.10基礎鏡像
    FROM docker.m.daocloud.io/python:3.10
    
    # 設定工作目錄
    WORKDIR /app
    
    # 複製requirements.txt檔案到工作目錄
    COPY requirements.txt .
    
    # 使用pip安裝依賴
    RUN pip install --no-cache-dir -r requirements.txt
    #########################安裝aliyun python 探針###############################
    RUN pip3 install aliyun-bootstrap && aliyun-bootstrap -a install
    ##########################################################
    
    COPY ./app.py /app/app.py
    
    
    # 暴露容器的8000連接埠
    EXPOSE 8000
    #########################################################
    CMD ["aliyun-instrument","python","app.py"]

步驟三:授予ARMS資源的存取權限

  • 如果需監控ASK(Container ServiceServerless版)或對接了ECI的叢集應用,請在雲資源訪問授權頁面完成授權,然後重啟ack-onepilot組件下的所有Pod。

  • 如果需監控ACK叢集應用,但ACK叢集中不存在ARMS Addon Token,請執行以下操作手動為叢集授予ARMS資源的存取權限。如果已經存在ARMS Addon Token,請跳轉至步驟四

    查看叢集是否存在ARMS Addon Token。

    1. 登入Container Service管理主控台,在叢集列表頁面,單擊目的地組群名稱進入叢集詳情頁。

    2. 在左側導覽列選擇組態管理 > 保密字典,然後在頂部選擇命名空間kube-system,查看addon.arms.token是否存在。

    說明

    叢集存在ARMS Addon Token時,ARMS會進行免密授權。Kubernetes託管版叢集預設存在ARMS Addon Token,但對於部分早期建立的Kubernetes託管版叢集,可能會存在沒有ARMS Addon Token的情況,因此,對於Kubernetes託管版叢集,建議首先檢查ARMS Addon Token是否存在。若不存在,需進行手動授權。

    手動添加權限原則。

    1. 登入Container Service管理主控台,在叢集列表頁面單擊目的地組群名稱。

    2. 叢集資訊 > 基本資料頁簽的叢集資源地區,單擊Worker RAM角色右側的連結。

    3. 許可權管理頁簽單擊新增授權

    4. 新增授權面板添加以下兩個權限原則,然後單擊確認新增授權

      • AliyunTracingAnalysisFullAccess:Managed Service for OpenTelemetry的完整許可權。

      • AliyunARMSFullAccess:ARMS的完整許可權。

  • 如果需要監控專有版叢集和註冊叢集應用,請確認對應的阿里雲帳號已包含AliyunARMSFullAccessAliyunSTSAssumeRoleAccess許可權。添加許可權的操作,請參見為RAM使用者授權

    安裝ack-onepilot組件後,還需要在ack-onepilot中填寫有ARMS許可權的阿里雲帳號AK/SK。

    1. 在左側導覽列選擇應用 > Helm頁面,單擊ack-onepilot組件右側的更新

    2. accessKeyaccessKeySecret替換為當前帳號的AccessKey,然後單擊確定

      說明

      擷取AccessKey的操作,請參見建立AccessKey

      image

    3. 重啟應用Deployment。

步驟四:為Python應用開啟ARMS應用監控

  1. Container Service管理主控台左側導覽列單擊叢集,在叢集列表頁面上的目的地組群右側操作列單擊應用管理

  2. 無狀態頁面的目標應用右側選擇更多 > 查看Yaml

    如需建立一個新應用,單擊使用YAML建立資源

  3. 在YAML檔案中將以下labels添加到spec.template.metadata層級下。

    labels:
      aliyun.com/app-language: python # Python應用必填,標明此應用是Python應用。
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "<your-deployment-name>"    #應用在ARMS中的展示名稱

    image

    建立無狀態(Deployment)應用並開啟ARMS應用監控的完整YAML樣本模板如下:

    展開查看完整樣本YAML檔案(Python)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: arms-python-client
      name: arms-python-client
      namespace: arms-demo
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: arms-python-client
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: arms-python-client
            aliyun.com/app-language: python # Python應用必填,標明此應用是Python應用。
            armsPilotAutoEnable: 'on'
            armsPilotCreateAppName: "arms-python-client"    #應用在ARMS中的展示名稱。
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/arms-default/python-agent:arms-python-client
              imagePullPolicy: Always
              name: client
              resources:
                requests:
                  cpu: 250m
                  memory: 300Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    ---
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: arms-python-server
      name: arms-python-server
      namespace: arms-demo
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: arms-python-server
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: arms-python-server
            aliyun.com/app-language: python # Python應用必填,標明此應用是Python應用。
            armsPilotAutoEnable: 'on'
            armsPilotCreateAppName: "arms-python-server"    #應用在ARMS中的展示名稱。
        spec:
          containers:
            - env:
              - name: CLIENT_URL
                value: 'http://arms-python-client-svc:8000'
            - image: registry.cn-hangzhou.aliyuncs.com/arms-default/python-agent:arms-python-server
              imagePullPolicy: Always
              name: server
              resources:
                requests:
                  cpu: 250m
                  memory: 300Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: arms-python-server
      name: arms-python-server-svc
      namespace: arms-demo
    spec:
      internalTrafficPolicy: Cluster
      ipFamilies:
        - IPv4
      ipFamilyPolicy: SingleStack
      ports:
        - name: http
          port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        app: arms-python-server
      sessionAffinity: None
      type: ClusterIP
    
    apiVersion: v1
    kind: Service
    metadata:
      name: arms-python-client-svc
      namespace: arms-demo
      uid: 91f94804-594e-495b-9f57-9def1fdc7c1d
    spec:
      internalTrafficPolicy: Cluster
      ipFamilies:
        - IPv4
      ipFamilyPolicy: SingleStack
      ports:
        - name: http
          port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        app: arms-python-client
      sessionAffinity: None
      type: ClusterIP
    

執行結果

約一分鐘後,若Python應用出現在ARMS控制台應用監控 > 應用列表頁面中且有資料上報,則說明接入成功。

2024-09-23_17-45-22