容器服务 ACK 和容器计算服务 ACS 通过 ack-onepilot 组件安装 Python 探针

当您需要监控部署在容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)和容器计算服务ACS中的Python应用时,通过安装ARMS应用监控组件ack-onepilot并修改对应的Dockerfile,即可在应用实时监控服务ARMS中查看对应应用的应用拓扑、接口调用、调用链分析等相关监控数据。本文将介绍如何为部署在容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)和容器计算服务ACS中的Python应用安装探针。

说明
  • 容器服务 Kubernetes 版ACK容器计算服务ACS安装探针的操作相同,本文以容器服务 Kubernetes 版ACK为例演示安装探针的操作。

  • 如果您在使用Python探针过程中有任何问题,可以查阅Python探针使用常见问题文档,如果文档无法解决您的疑问,欢迎通过钉钉答疑群(群号:35568145)与我们联系。

前提条件

注意事项

  • 如果应用使用uvicorn启动,请选择以下一种方式进行配置。

    • 方式一:在uvicorn的入口文件处的第一行添加以下语句以引入Python探针。

      from aliyun.opentelemetry.instrumentation.auto_instrumentation import sitecustomize
    • 方式二:使用gunicorn替换uvicorn,并在gunicorn命令前添加aliyun-instrument前缀。

      例如:

      uvicorn app:app --workers 4 --port=9090 --host 0.0.0.0

      修改为:

      aliyun-instrument gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 app:app
      说明

      aliyun-instrument指令负责ARMS Python探针初始化配置及无侵入埋点。

  • 如果应用使用uWSGI启动,请参考以下接入文档进行接入:在使用uWSGI启动DjangoFlask项目时接入Python探针

  • 如果有使用gevent协程,则需要设置环境变量GEVENT_ENABLE=true

    例如程序中有使用:

    from gevent import monkey
    monkey.patch_all()

    需要设置环境变量如下:

    GEVENT_ENABLE=true

步骤一:安装 ARMS 探针接入助手(ack-onepilot)

  1. 登录容器服务管理控制台,在集群列表页面单击目标集群名称。

  2. 在左侧导航栏单击组件管理,然后在右上角通过关键字搜索ack-onepilot

    重要

    请确保ack-onepilot的版本在3.2.4或以上。

  3. ack-onepilot卡片上单击安装

    说明

    ack-onepilot组件默认支持1000pod规模,集群pod每超过1000个,ack-onepilot资源对应的CPU请增加0.5核、内存请增加512 MB。

  4. 在弹出的页面中可以配置相关的参数,建议使用默认值,单击确认

    说明

    安装完成后,您可以在组件管理页面升级、配置或卸载ack-onepilot组件。

  5. 重要

    如您安装的ack-onepilot组件版本高于5.0.0,您可以跳过步骤二直接从步骤三开始执行,从而获得完全无侵入的Python应用可观测接入体验。

步骤二:修改 Dockerfile

  1. PyPI仓库下载探针安装器。

    pip3 install aliyun-bootstrap
  2. 使用aliyun-bootstrap安装探针。

    # 对应的阿里云账号的RegionID
    ARMS_REGION_ID=xxx aliyun-bootstrap -a install
    说明

    如需要指定安装的Python探针版本,可通过以下命令安装指定版本的探针:

    # ${version}替换为实际的版本号
    aliyun-bootstrap -a install -v ${version}

    请参考探针(Python Agent)版本说明查看所有已发布的Python探针版本。

  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 探针###############################
    # 对应的阿里云账号的RegionID
    RUN pip3 install aliyun-bootstrap && ARMS_REGION_ID=xxx aliyun-bootstrap -a install 
    ##########################################################
    
    COPY ./app.py /app/app.py
    
    
    # 暴露容器的8000端口
    EXPOSE 8000
    #########################################################
    CMD ["aliyun-instrument","python","app.py"]

步骤三:授予 ARMS 资源的访问权限

ACK托管集群

如果ACK托管集群中不存在ARMS Addon Token,请执行以下操作手动为集群授予ARMS资源的访问权限。如果已经存在ARMS Addon Token,请跳转至步骤四

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

  1. 登录容器服务管理控制台,在集群列表页面,单击目标集群名称进入集群详情页。

  2. 在左侧导航栏选择配置管理 > 保密字典,然后在顶部选择命名空间kube-system,查看addon.arms.token是否存在。

说明

集群存在ARMS Addon Token时,ARMS会进行免密授权。Kubernetes托管版集群默认存在ARMS Addon Token,但对于部分早期创建的Kubernetes托管版集群,可能会存在没有ARMS Addon Token的情况,因此,对于Kubernetes托管版集群,建议首先检查ARMS Addon Token是否存在。若不存在,需进行手动授权。

手动添加权限策略。

  1. 登录容器服务管理控制台,在集群列表页面单击目标集群名称。

  2. 集群信息 > 基本信息页签的集群资源区域,单击Worker RAM角色右侧的链接。

  3. 权限管理页签单击新增授权

  4. 新增授权面板添加以下两个权限策略,然后单击确认新增授权

    • AliyunTracingAnalysisFullAccess:可观测链路 OpenTelemetry 版的完整权限。

    • AliyunARMSFullAccess:ARMS的完整权限。

专有版集群/注册集群

如果需要监控ACK专有版集群ACK One注册集群应用,请确认对应的阿里云账号已包含AliyunARMSFullAccessAliyunSTSAssumeRoleAccess权限。添加权限的操作,请参见RAM用户授权

安装ack-onepilot组件后,还需要在ack-onepilot中填写有ARMS权限的阿里云账号AK/SK。

方式一:Helm中直接填写AK/SK

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏选择应用 > Helm页面,单击ack-onepilot组件右侧的更新

  3. accessKeyaccessKeySecret替换为当前账号的AccessKey,然后单击确定

    说明

    获取AccessKey的操作,请参见创建AccessKey

    为降低AccessKey泄露的风险,阿里云账号(主账号)的AccessKey Secret只在创建时显示,后续不支持查看,请妥善保管。

    image

  4. 重启应用Deployment。

方式二:通过K8s Secret引入AK/SK

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏选择配置管理 > 保密字典

  3. 选择ack-onepilot命名空间,然后创建Secret,添加AK/SK信息。

    说明

    获取AccessKey的操作,请参见创建AccessKey

    为降低AccessKey泄露的风险,阿里云账号(主账号)的AccessKey Secret只在创建时显示,后续不支持查看,请妥善保管。

    image

  4. 在左侧导航栏选择工作负载 > 无状态,单击ack-onepilot组件(一般在ack-onepilot命名空间下,名称为ack-onepilot-ack-onepilot)。

  5. ack-onepilot-ack-onepilot页面右上角单击编辑,然后在环境变量区域添加ONE_PILOT_ACCESSKEYONE_PILOT_ACCESSKEY_SECRET,通过保密字典引用的方式替换为Secret中保存的值,单击确定

    image

ASK/ECI集群

如果需监控ACK Serverless集群或对接了ECI的集群应用,请在云资源访问授权页面完成授权,然后重启ack-onepilot组件下的所有Pod。

步骤四:为Python应用开启ARMS应用监控

重要
  • 如您安装的ack-onepilot组件版本高于5.0.0,在执行本步骤时ack-onepilot组件将会自动为您执行Python探针包的下载与注入动作,您无需手动修改Dockerfile的启动命令即可获得完全无侵入的Python应用监控接入体验。

  • Python探针包的下载以及注入动作将会通过一个初始化容器来执行,初始化容器的执行在默认的资源设定下可能会占用约10s的时间,该初始化容器默认会消耗0.5c 250MB的资源(初始化结束后即释放)。您可以通过以下环境变量来调整初始化容器的资源配额以调整初始化容器的执行速度:

    • PYTHON_INIT_RESOURCE_REQUESTS_CPU:Python应用初始化容器的CPU Request值,示例值:500m。

    • PYTHON_INIT_RESOURCE_REQUESTS_MEM:Python应用初始化容器的内存 Request值,示例值:250Mi。

    • PYTHON_INIT_RESOURCE_LIMIT_CPU:Python应用初始化容器的CPU Limit值,示例值:1000m。

    • PYTHON_INIT_RESOURCE_LIMIT_MEM:Python应用初始化容器的CPU Limit值,示例值:500Mi。

  • 该能力处于Beta测试阶段,如果您在使用该完全无侵入注入能力时有任何问题,欢迎通过钉钉答疑群(群号:35568145)与我们联系。

创建无状态(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
  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面的目标应用右侧选择image > YAML 编辑

    如需创建一个新应用,单击使用YAML创建资源

  4. YAML文件中将以下labels添加到spec.template.metadata层级下。

    labels:
      aliyun.com/app-language: python # Python应用必填,标明此应用是Python应用。
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "deployment-name"    # 应用在ARMS中的展示名称
    重要

    如您安装的ack-onepilot组件版本高于5.0.0,在执行本步骤时ack-onepilot组件将会自动为您执行Python探针包的下载与注入动作,您无需手动修改Dockerfile的启动命令即可获得完全无侵入的Python应用监控接入体验。如果您不希望使用该能力,可以通过以下label来关闭Python的完全无侵入注入能力:

    labels:
      aliyun.com/app-language: python # Python应用必填,标明此应用是Python应用。
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "deployment-name"    # 应用在ARMS中的展示名称
      armsAutoInstrumentationEnable: "off"  # 关闭Python应用的完全无侵入注入能力

    image

  5. 单击更新

执行结果

约一分钟后,若Python应用出现在ARMS控制台应用监控 > 应用列表页面中且有数据上报,则说明接入成功。

2024-09-23_17-45-22