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

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

说明

如果您在使用Python探针过程中有任何问题,欢迎通过钉钉答疑群(群号: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. 登录容器服务管理控制台,在集群列表页面,单击目标集群名称进入集群详情页。

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

    重要

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

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

    说明

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

  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(容器服务Serverless版)或对接了ECI的集群应用,请在云资源访问授权页面完成授权,然后重启ack-onepilot组件下的所有Pod。

  • 如果需监控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. 在左侧导航栏选择集群,然后单击目标集群名称。

    3. 在目标集群的集群信息页面单击集群资源页签,然后单击Worker RAM角色右侧的链接。

    4. 在角色页面的权限管理页签上,单击新增授权

    5. 选择权限为AliyunARMSFullAccess,然后单击确定

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

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

    1. 在左侧导航栏选择应用 > Helm页面,单击ack-onepilot组件右侧的更新

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

      说明

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

      image

    3. 重启应用Deployment。

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

  1. 容器服务管理控制台左侧导航栏单击集群,在集群列表页面上的目标集群右侧操作列单击应用管理

  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