當您需要對部署在容器服務 Kubernetes 版 ACK(Container Service for Kubernetes)中的Python應用進行監控時,通過安裝ARMS應用監控組件ack-onepilot并修改對應的Dockerfile,即可在應用實時監控服務ARMS中查看對應應用的應用拓撲、接口調用、調用鏈分析等相關監控數據。本文將介紹如何為部署在容器服務 Kubernetes 版 ACK(Container Service for Kubernetes)中的Python應用安裝探針。
如果您在使用Python探針過程中有任何問題,歡迎通過釘釘答疑群(群號:35568145)與我們聯系。
前提條件
創建Kubernetes集群。您可按需選擇創建ACK專有集群、創建ACK托管集群或創建ACK Serverless集群。
創建命名空間,具體操作,請參見管理命名空間與配額。本文示例中的命名空間名稱為arms-demo。
檢查您的Python版本和框架版本。具體要求,請參見Python探針兼容性要求。
注意事項
如果應用使用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應用監控組件
登錄容器服務管理控制臺,在集群列表頁面,單擊目標集群名稱進入集群詳情頁。
在左側導航欄選擇
,然后在右上角通過關鍵字搜索ack-onepilot。重要請確保ack-onepilot的版本在3.2.4或以上。
在ack-onepilot卡片上單擊安裝。
說明ack-onepilot組件默認支持1000個pod規模,集群pod每超過1000個,ack-onepilot資源對應的CPU請增加0.5核、內存請增加512 M。
在彈出的頁面中可以配置相關的參數,建議使用默認值,單擊確定。
說明安裝完成后,您可以在組件管理頁面升級、配置或卸載ack-onepilot組件。
步驟二:修改Dockerfile
從PyPI倉庫下載探針安裝器。
pip3 install aliyun-bootstrap
使用aliyun-bootstrap安裝探針。
aliyun-bootstrap -a install
通過ARMS Python探針啟動應用。
aliyun-instrument 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
COPY ./app.py /app/app.py
# 暴露容器的8000端口
EXPOSE 8000
CMD ["python","app.py"]
# 使用官方的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(容器服務Serverless版)或對接了ECI的集群應用,請在云資源訪問授權頁面完成授權,然后重啟ack-onepilot組件下的所有Pod。
如果需監控ACK集群應用,但ACK集群中不存在ARMS Addon Token,請執行以下操作手動為集群授予ARMS資源的訪問權限。如果已經存在ARMS Addon Token,請跳轉至步驟四。
登錄容器服務管理控制臺,在集群列表頁面,單擊目標集群名稱進入集群詳情頁。
在左側導航欄選擇addon.arms.token是否存在。
,然后在頂部選擇命名空間為kube-system,查看
說明集群存在ARMS Addon Token時,ARMS會進行免密授權。Kubernetes托管版集群默認存在ARMS Addon Token,但對于部分早期創建的Kubernetes托管版集群,可能會存在沒有ARMS Addon Token的情況,因此,對于Kubernetes托管版集群,建議首先檢查ARMS Addon Token是否存在。若不存在,需進行手動授權。
登錄容器服務管理控制臺。
在左側導航欄選擇集群,然后單擊目標集群名稱。
在目標集群的集群信息頁面單擊集群資源頁簽,然后單擊Worker RAM角色右側的鏈接。
在角色頁面的權限管理頁簽上,單擊新增授權。
選擇權限為AliyunARMSFullAccess,然后單擊確定。
如果需要監控專有版集群和注冊集群應用,請確認對應的阿里云賬號已包含AliyunARMSFullAccess和AliyunSTSAssumeRoleAccess權限。添加權限的操作,請參見為RAM用戶授權。
安裝ack-onepilot組件后,還需要在ack-onepilot中填寫有ARMS權限的阿里云賬號AK/SK。
在左側導航欄選擇
頁面,單擊ack-onepilot組件右側的更新。將
accessKey
和accessKeySecret
替換為當前賬號的AccessKey,然后單擊確定。說明獲取AccessKey的操作,請參見創建AccessKey。
重啟應用Deployment。
步驟四:為Python應用開啟ARMS應用監控
在容器服務管理控制臺左側導航欄單擊集群,在集群列表頁面上的目標集群右側操作列單擊應用管理。
在無狀態頁面的目標應用右側選擇
。如需創建一個新應用,單擊使用YAML創建資源。
在YAML文件中將以下
labels
添加到spec.template.metadata層級下。labels: aliyun.com/app-language: python # Python應用必填,標明此應用是Python應用。 armsPilotAutoEnable: 'on' armsPilotCreateAppName: "<your-deployment-name>" #應用在ARMS中的展示名稱
創建無狀態(Deployment)應用并開啟ARMS應用監控的完整YAML示例模板如下:
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控制臺的 頁面中且有數據上報,則說明接入成功。