• Русский
  • Установка

    Уведомление об устаревании

    Документация по Distributed Tracing в этом разделе устарела и будет удалена в ACP 4.4. ACP 4.3 — последняя версия, которая включает эту документацию.

    Для всех новых развертываний и миграций используйте Установка Alauda Distributed Tracing или Миграция с Alauda Container Platform Tracing.

    WARNING

    Этот документ по развертыванию применим только к сценариям, связанным с интеграцией контейнерной платформы с системой трассировки.

    Компоненты Tracing и Service Mesh взаимоисключают друг друга. Если вы уже развернули компонент Service Mesh, сначала удалите его.

    Это руководство описывает для администраторов кластера процесс установки системы трассировки в кластере Alauda Container Platform.

    Предварительные требования:

    • У вас есть доступ к кластеру Alauda Container Platform с учетной записью, имеющей разрешения platform-admin-system.
    • У вас установлен CLI kubectl.
    • Компонент Elasticsearch настроен для хранения данных трассировки, включая URL доступа и информацию Basic Auth.

    Установка Jaeger Operator

    Установка Jaeger Operator через Web Console

    Вы можете установить Jaeger Operator из раздела Alauda Container Platform MarketplaceOperatorHub, где перечислены доступные Operators.

    Шаги

    • В представлении Administrator Web Console выберите cluster, в котором вы хотите развернуть Jaeger Operator, затем перейдите в MarketplaceOperatorHub.

    • В поле поиска найдите в каталоге Alauda build of Jaeger. Нажмите на заголовок Alauda build of Jaeger.

    • Ознакомьтесь с вводной информацией об Operator на странице Alauda build of Jaeger. Нажмите Install.

    • На странице Install:

      • Выберите Manual для Upgrade Strategy. Для стратегии утверждения Manual OLM создаст запросы на обновление. Как администратор кластера, вы должны вручную утверждать запросы OLM на обновление, чтобы обновить Operator до новой версии.
      • Выберите канал stable (Default).
      • Для Installation Location выберите Recommended. Установите Operator в рекомендуемое пространство имен jaeger-operator, чтобы Operator мог отслеживать и быть доступным во всех пространствах имен внутри кластера.
    • Нажмите Install.

    • Убедитесь, что в поле Status отображается Succeeded, чтобы подтвердить, что Jaeger Operator был установлен корректно.

    • Проверьте, что все компоненты Jaeger Operator были успешно установлены. Войдите в кластер через терминал и выполните следующую команду:

      kubectl -n jaeger-operator get csv

      Пример вывода

      NAME                     DISPLAY           VERSION   REPLACES   PHASE
      jaeger-operator.vx.x.0   Jaeger Operator   x.x.0                Succeeded

      Если поле PHASE имеет значение Succeeded, это означает, что Operator и его компоненты были успешно установлены.

    Развертывание экземпляра Jaeger

    Экземпляр Jaeger и связанные с ним ресурсы можно установить с помощью скрипта install-jaeger.sh, который принимает три параметра:

    • --es-url: URL доступа к Elasticsearch.
    • --es-user-base64: имя пользователя Basic Auth для Elasticsearch, закодированное в base64.
    • --es-pass-base64: пароль Basic Auth для Elasticsearch, закодированный в base64.

    Скопируйте скрипт установки из DETAILS, войдите в кластер, в котором вы хотите выполнить установку, сохраните его как install-jaeger.sh и выполните его после предоставления прав на выполнение:

    DETAILS
    #!/bin/bash
    
    set -euo pipefail
    
    CLUSTER_NAME=$(kubectl get configmap global-info -n kube-public -o jsonpath='{.data.clusterName}')
    echo "CLUSTER_NAME: ${CLUSTER_NAME}"
    
    # default values
    TARGET_NAMESPACE="cpaas-system"
    JAEGER_INSTANCE_NAME="jaeger-prod"
    JAEGER_BASEPATH_SUFFIX="/acp/jaeger"
    JAEGER_ES_INDEX_PREFIX=acp-tracing-$CLUSTER_NAME
    
    # get arg
    while [ "$#" -gt 0 ]; do
        case $1 in
            --es-url=*)
                ES_URL="${1#*=}"
                ;;
            --es-user-base64=*)
                ES_USER_BASE64="${1#*=}"
                ;;
            --es-pass-base64=*)
                ES_PASS_BASE64="${1#*=}"
                ;;
            --target-namespace=*)
                TARGET_NAMESPACE="${1#*=}"
                ;;
            --jaeger-instance-name=*)
                JAEGER_INSTANCE_NAME="${1#*=}"
                ;;
            --jaeger-basepath-suffix=*)
                JAEGER_BASEPATH_SUFFIX="${1#*=}"
                ;;
            --jaeger-es-index-prefix=*)
                JAEGER_ES_INDEX_PREFIX="${1#*=}"
                ;;
            *)
                echo "unknown argument: $1"
                exit 1
                ;;
        esac
        shift
    done
    
    # print arg
    echo "ES_URL: $ES_URL"
    echo "ES_USER_BASE64: $ES_USER_BASE64"
    echo "ES_PASS_BASE64: $ES_PASS_BASE64"
    echo "TARGET_NAMESPACE: $TARGET_NAMESPACE"
    echo "JAEGER_INSTANCE_NAME: $JAEGER_INSTANCE_NAME"
    echo "JAEGER_BASEPATH_SUFFIX: $JAEGER_BASEPATH_SUFFIX"
    echo "JAEGER_ES_INDEX_PREFIX: $JAEGER_ES_INDEX_PREFIX"
    
    # get global-info from ConfigMap
    ISSUER_URL=$(kubectl get configmap global-info -n kube-public -o jsonpath='{.data.oidcIssuer}')
    CLIENT_ID=$(kubectl get configmap global-info -n kube-public -o jsonpath='{.data.oidcClientID}')
    CLIENT_SECRET=$(kubectl get configmap global-info -n kube-public -o jsonpath='{.data.oidcClientSecret}')
    CLIENT_SECRET_BASE64=$(echo -n "${CLIENT_SECRET}" | base64 -w0)
    PLATFORM_URL=$(kubectl get configmap global-info -n kube-public -o jsonpath='{.data.platformURL}')
    echo "PLATFORM_URL: ${PLATFORM_URL}"
    
    JAEGER_BASEPATH="clusters/$CLUSTER_NAME$JAEGER_BASEPATH_SUFFIX"
    
    _apply_resource() {
      if [ -z "$1" ]; then
        echo "Usage: _apply_resource <yaml_content>"
        return 1
      fi
    
      local yaml_content="$1"
      echo "$yaml_content" | kubectl apply -f -
    }
    
    _install_configmap() {
      local yaml_content=$(cat <<EOF
    apiVersion: v1
    data:
      OAUTH2_PROXY_CLIENT_ID: $CLIENT_ID
      OAUTH2_PROXY_COOKIE_SECURE: "false"
      OAUTH2_PROXY_EMAIL_DOMAINS: "*"
      OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:4180
      OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL: "true"
      OAUTH2_PROXY_OIDC_ISSUER_URL: $ISSUER_URL
      OAUTH2_PROXY_PROVIDER: oidc
      OAUTH2_PROXY_PROXY_PREFIX: /$JAEGER_BASEPATH/oauth2
      OAUTH2_PROXY_REDIRECT_URL: $PLATFORM_URL/$JAEGER_BASEPATH/oauth2/callback
      OAUTH2_PROXY_SCOPE: openid profile email groups ext
      OAUTH2_PROXY_SKIP_JWT_BEARER_TOKENS: "true"
      OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true"
      OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY: "true"
      OAUTH2_PROXY_UPSTREAMS: http://127.0.0.1:16686
    kind: ConfigMap
    metadata:
      name: $JAEGER_INSTANCE_NAME-oauth2-proxy
      namespace: $TARGET_NAMESPACE
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_secret() {
      local yaml_content=$(cat <<EOF
    apiVersion: v1
    data:
      OAUTH2_PROXY_CLIENT_SECRET: $CLIENT_SECRET_BASE64
      OAUTH2_PROXY_COOKIE_SECRET: $CLIENT_SECRET_BASE64
    kind: Secret
    metadata:
      name: $JAEGER_INSTANCE_NAME-oauth2-proxy
      namespace: $TARGET_NAMESPACE
    type: Opaque
    ---
    apiVersion: v1
    data:
      ES_PASSWORD: $ES_PASS_BASE64
      ES_USERNAME: $ES_USER_BASE64
    kind: Secret
    metadata:
      name: $JAEGER_INSTANCE_NAME-es-basic-auth
      namespace: $TARGET_NAMESPACE
    type: Opaque
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_sa() {
      local yaml_content=$(cat <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: $JAEGER_INSTANCE_NAME-sa
      namespace: $TARGET_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: $JAEGER_INSTANCE_NAME-role
      namespace: $TARGET_NAMESPACE
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: $JAEGER_INSTANCE_NAME-rb
      namespace: $TARGET_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: $JAEGER_INSTANCE_NAME-role
    subjects:
    - kind: ServiceAccount
      name: $JAEGER_INSTANCE_NAME-sa
      namespace: $TARGET_NAMESPACE
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_jaeger() {
      local yaml_content=$(cat <<EOF
    apiVersion: jaegertracing.io/v1
    kind: Jaeger
    metadata:
      name: $JAEGER_INSTANCE_NAME
      namespace: $TARGET_NAMESPACE
    spec:
      collector:
        affinity:
          podAntiAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchLabels:
                    app.kubernetes.io/name: $JAEGER_INSTANCE_NAME-collector
                topologyKey: kubernetes.io/hostname
        replicas: 1
        resources:
          limits:
            cpu: "2"
            memory: 512Mi
          requests:
            cpu: 250m
            memory: 256Mi
      imagePullSecrets:
        - name: global-registry-auth
      ingress:
        enabled: false
      labels:
        service_name: jaeger
      query:
        affinity:
          podAntiAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchLabels:
                    app.kubernetes.io/name: $JAEGER_INSTANCE_NAME-query
                topologyKey: kubernetes.io/hostname
        annotations:
          oauth2-proxy.github.io/image: ""
          oauth2-proxy.github.io/inject: "true"
          oauth2-proxy.github.io/oidc-configmap: $JAEGER_INSTANCE_NAME-oauth2-proxy
          oauth2-proxy.github.io/oidc-secret: $JAEGER_INSTANCE_NAME-oauth2-proxy
          oauth2-proxy.github.io/proxyCPULimit: 100m
          oauth2-proxy.github.io/proxyMemoryLimit: 128Mi
        options:
          query:
            base-path: /$JAEGER_BASEPATH
        replicas: 1
        resources:
          limits:
            cpu: "1"
            memory: 512Mi
          requests:
            cpu: 250m
            memory: 256Mi
      resources:
        limits:
          cpu: 100m
          memory: 300Mi
        requests:
          cpu: 100m
          memory: 300Mi
      sampling:
        options: {}
      serviceAccount: $JAEGER_INSTANCE_NAME-sa
      storage:
        dependencies:
          enabled: false
          resources: {}
          schedule: 55 23 * * *
        elasticsearch:
          name: elasticsearch
          nodeCount: 3
          redundancyPolicy: SingleRedundancy
        esIndexCleaner:
          enabled: true
          numberOfDays: 7
          resources: {}
          schedule: 55 23 * * *
        esRollover:
          resources: {}
          schedule: 0 0 * * *
        options:
          es.asm.cname: $JAEGER_INSTANCE_NAME-es-basic-auth
          es.asm.cnamespace: $TARGET_NAMESPACE
          es.index-prefix: $JAEGER_ES_INDEX_PREFIX
          es.max-span-age: 168h0m0s
          es.server-urls: $ES_URL
          es.tls.enabled: true
          es.tls.skip-host-verify: true
        secretName: ""
        type: elasticsearch
      strategy: production
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
          operator: Exists
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
          operator: Exists
      ui:
        options:
          dependencies:
            menuEnabled: false
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_pod_monitor() {
      local yaml_content=$(cat <<EOF
    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      labels:
        monitoring: pods
        prometheus: kube-prometheus
      name: $JAEGER_INSTANCE_NAME-monitor
      namespace: $TARGET_NAMESPACE
    spec:
      jobLabel: app.kubernetes.io/name
      namespaceSelector:
        matchNames:
          - $TARGET_NAMESPACE
      podMetricsEndpoints:
        - interval: 60s
          path: /metrics
          port: admin-http
      selector:
        matchLabels:
          app.kubernetes.io/instance: $JAEGER_INSTANCE_NAME
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_ingress() {
      local alb_annotation=""
      if [[ "$CLUSTER_NAME" == "global" ]]; then
      alb_annotation=$(cat <<EOF
        alb.ingress.cpaas.io/rewrite-request: |
          {"headers_var":{"Authorization":"cookie_cpaas_id_token"}}
    EOF
      )
      fi
      local ingress_class=""
      if [[ "$CLUSTER_NAME" != "global" ]]; then
        ingress_class="  ingressClassName: cpaas-system"
      fi
    
      local yaml_content=$(cat <<EOF
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: $JAEGER_INSTANCE_NAME-query
      namespace: $TARGET_NAMESPACE
      annotations:
        nginx.ingress.kubernetes.io/enable-cors: "true"
    $alb_annotation
    spec:
    $ingress_class
      rules:
        - http:
            paths:
              - path: /$JAEGER_BASEPATH
                pathType: ImplementationSpecific
                backend:
                  service:
                    name: $JAEGER_INSTANCE_NAME-query
                    port:
                      number: 4180
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    # final install
    _install_configmap
    _install_secret
    _install_sa
    _install_jaeger
    _install_pod_monitor
    _install_ingress
    
    echo "Jaeger UI access address: $PLATFORM_URL/$JAEGER_BASEPATH"
    echo "Jaeger installation completed"

    Пример выполнения скрипта:

    ./install-jaeger.sh --es-url='https://xxx' --es-user-base64='xxx' --es-pass-base64='xxx'

    Пример вывода скрипта:

    CLUSTER_NAME: <cluster>
    ES_URL: https://xxx
    ES_USER_BASE64: xxx
    ES_PASS_BASE64: xxx
    TARGET_NAMESPACE: cpaas-system
    JAEGER_INSTANCE_NAME: jaeger-prod
    JAEGER_BASEPATH_SUFFIX: /acp/jaeger
    JAEGER_ES_INDEX_PREFIX: acp-tracing-<cluster>
    PLATFORM_URL: https://xxx
    configmap/jaeger-prod-oauth2-proxy created
    secret/jaeger-prod-oauth2-proxy created
    secret/jaeger-prod-es-basic-auth created
    serviceaccount/jaeger-prod-sa created
    role.rbac.authorization.k8s.io/jaeger-prod-role created
    rolebinding.rbac.authorization.k8s.io/jaeger-prod-rb created
    jaeger.jaegertracing.io/jaeger-prod created
    podmonitor.monitoring.coreos.com/jaeger-prod-monitor created
    ingress.networking.k8s.io/jaeger-prod-query created
    Jaeger UI access address: <platform-url>/clusters/<cluster>/acp/jaeger
    Jaeger installation completed

    Установка OpenTelemetry Operator

    Установка OpenTelemetry Operator через Web Console

    Вы можете установить OpenTelemetry Operator из раздела Alauda Container Platform MarketplaceOperatorHub, где перечислены доступные Operators.

    Шаги

    • В представлении Administrator Web Console выберите cluster, в котором вы хотите развернуть OpenTelemetry Operator, затем перейдите в MarketplaceOperatorHub.

    • В поле поиска найдите в каталоге Alauda build of OpenTelemetry. Нажмите на заголовок Alauda build of OpenTelemetry.

    • Ознакомьтесь с вводной информацией об Operator на странице Alauda build of OpenTelemetry. Нажмите Install.

    • На странице Install:

      • Выберите Manual для Upgrade Strategy. Для стратегии утверждения Manual OLM создаст запросы на обновление. Как администратор кластера, вы должны вручную утверждать запросы OLM на обновление, чтобы обновить Operator до новой версии.
      • Выберите канал alpha (Default).
      • Для Installation Location выберите Recommended. Установите Operator в рекомендуемое пространство имен opentelemetry-operator, чтобы Operator мог отслеживать и быть доступным во всех пространствах имен внутри кластера.
    • Нажмите Install.

    • Убедитесь, что в поле Status отображается Succeeded, чтобы подтвердить, что OpenTelemetry Operator был установлен корректно.

    • Проверьте, что все компоненты OpenTelemetry Operator были успешно установлены. Войдите в кластер через терминал и выполните следующую команду:

      kubectl -n opentelemetry-operator get csv

      Пример вывода

      NAME                            DISPLAY                  VERSION   REPLACES   PHASE
      openTelemetry-operator.vx.x.0   OpenTelemetry Operator   x.x.0                Succeeded

      Если поле PHASE имеет значение Succeeded, это означает, что Operator и его компоненты были успешно установлены.

    Развертывание экземпляров OpenTelemetry

    Экземпляры OpenTelemetry и связанные с ними ресурсы можно установить с помощью скрипта install-otel.sh.

    Скопируйте скрипт установки из DETAILS, войдите в кластер, в котором вы хотите выполнить установку, сохраните его как install-otel.sh и выполните его после предоставления прав на выполнение:

    DETAILS
    #!/bin/bash
    
    set -euo pipefail
    
    TARGET_NAMESPACE="cpaas-system"
    
    # get global-info from ConfigMap
    CLUSTER_NAME=$(kubectl get configmap global-info -n kube-public -o jsonpath='{.data.clusterName}')
    echo "CLUSTER_NAME: ${CLUSTER_NAME}"
    
    _apply_resource() {
      if [ -z "$1" ]; then
        echo "Usage: _apply_resource <yaml_content>"
        return 1
      fi
    
      local yaml_content="$1"
      echo "$yaml_content" | kubectl apply -f -
    }
    
    _install_rbac() {
      local yaml_content=$(cat <<EOF
    apiVersion: v1
    imagePullSecrets:
      - name: global-registry-auth
    kind: ServiceAccount
    metadata:
      name: otel-collector
      namespace: $TARGET_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: otel-collector:cpaas-system:cluster-admin
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
      - kind: ServiceAccount
        name: otel-collector
        namespace: $TARGET_NAMESPACE
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_otel_collector() {
      local yaml_content=$(cat <<EOF
    apiVersion: opentelemetry.io/v1beta1
    kind: OpenTelemetryCollector
    metadata:
      name: otel
      namespace: $TARGET_NAMESPACE
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: otel-collector
              topologyKey: kubernetes.io/hostname
      config:
        exporters:
          debug: {}
          otlp:
            balancer_name: round_robin
            endpoint: dns:///jaeger-prod-collector-headless.$TARGET_NAMESPACE:4317
            tls:
              insecure: true
          prometheus:
            endpoint: 0.0.0.0:8889
        extensions:
          health_check:
            endpoint: 0.0.0.0:13133
        processors:
          batch: {}
          filter/metric_apis:
            metrics:
              datapoint:
                - attributes["http.route"] == "/actuator/health" or attributes["uri"] == "/actuator/health"
                - attributes["http.route"] == "/actuator/prometheus" or attributes["uri"] == "/actuator/prometheus"
          transform:
            metric_statements:
              - context: datapoint
                statements:
                  - delete_key(attributes, "inner.client.ms.name")
                  - delete_key(attributes, "inner.client.ms.namespace")
                  - delete_key(attributes, "inner.client.cluster.name")
                  - delete_key(attributes, "inner.client.env.type")
                  - set(attributes["namespace"], resource.attributes["k8s.namespace.name"])
                  - set(attributes["container"], resource.attributes["k8s.container.name"])
                  - set(attributes["service_name"], resource.attributes["service.name"])
                  - set(attributes["pod"], resource.attributes["k8s.pod.name"])
          memory_limiter:
            check_interval: 5s
            limit_percentage: 85
            spike_limit_percentage: 25
        receivers:
          otlp:
            protocols:
              grpc:
                endpoint: 0.0.0.0:4317
              http:
                endpoint: 0.0.0.0:4318
        service:
          extensions:
            - health_check
          pipelines:
            metrics:
              exporters:
                - debug
                - prometheus
              processors:
                - memory_limiter
                - filter/metric_apis
                - transform
                - batch
              receivers:
                - otlp
            traces:
              exporters:
                - debug
                - otlp
              processors:
                - memory_limiter
                - batch
              receivers:
                - otlp
          telemetry:
            logs:
              level: info
            metrics:
              address: 0.0.0.0:8888
              level: detailed
      managementState: managed
      mode: deployment
      replicas: 1
      resources:
        limits:
          cpu: "2"
          memory: 1Gi
        requests:
          cpu: 250m
          memory: 512Mi
      securityContext:
        readOnlyRootFilesystem: true
        runAsNonRoot: true
      serviceAccount: otel-collector
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/control-plane
          operator: Exists
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
          operator: Exists
      upgradeStrategy: automatic
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_instrumentation() {
      local yaml_content=$(cat <<EOF
    apiVersion: opentelemetry.io/v1alpha1
    kind: Instrumentation
    metadata:
      name: acp-common-java
      namespace: $TARGET_NAMESPACE
    spec:
      env:
        - name: SERVICE_CLUSTER
          value: "$CLUSTER_NAME"
        - name: OTEL_TRACES_EXPORTER
          value: otlp
        - name: OTEL_METRICS_EXPORTER
          value: otlp
        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: http://otel-collector.$TARGET_NAMESPACE:4317
        - name: OTEL_SERVICE_NAME
          value: \$(SERVICE_NAME).\$(SERVICE_NAMESPACE)
        - name: OTEL_RESOURCE_ATTRIBUTES
          value: service.namespace=\$(SERVICE_NAMESPACE),cluster.name=\$(SERVICE_CLUSTER)
      sampler:
        type: parentbased_traceidratio
        argument: "1"
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_service_monitor() {
      local yaml_content=$(cat <<EOF
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        monitoring: services
        prometheus: kube-prometheus
      name: otel-collector-monitoring
      namespace: $TARGET_NAMESPACE
    spec:
      endpoints:
        - interval: 60s
          path: /metrics
          port: monitoring
      jobLabel: app.kubernetes.io/name
      namespaceSelector:
        matchNames:
          - $TARGET_NAMESPACE
      selector:
        matchLabels:
          app.kubernetes.io/instance: $TARGET_NAMESPACE.otel
          operator.opentelemetry.io/collector-service-type: monitoring
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        monitoring: services
        prometheus: kube-prometheus
      name: otel-collector
      namespace: $TARGET_NAMESPACE
    spec:
      endpoints:
        - honorLabels: true
          interval: 60s
          path: /metrics
          port: prometheus
      jobLabel: app.kubernetes.io/name
      namespaceSelector:
        matchNames:
          - $TARGET_NAMESPACE
      selector:
        matchLabels:
          app.kubernetes.io/instance: $TARGET_NAMESPACE.otel
          operator.opentelemetry.io/collector-service-type: base
    EOF
    )
      _apply_resource "$yaml_content"
    }
    
    _install_rbac
    _install_otel_collector
    _install_instrumentation
    _install_service_monitor
    
    echo "OpenTelemetry installation completed"

    Пример выполнения скрипта:

    ./install-otel.sh

    Пример вывода скрипта:

    CLUSTER_NAME: cluster-xxx
    serviceaccount/otel-collector created
    clusterrolebinding.rbac.authorization.k8s.io/otel-collector:cpaas-system:cluster-admin created
    opentelemetrycollector.opentelemetry.io/otel created
    instrumentation.opentelemetry.io/acp-common-java created
    servicemonitor.monitoring.coreos.com/otel-collector-monitoring created
    servicemonitor.monitoring.coreos.com/otel-collector created
    OpenTelemetry installation completed

    Включение переключателя функции

    Система трассировки в настоящее время находится на этапе Alpha и требует, чтобы вы вручную включили переключатель функции acp-tracing-ui в представлении Feature Switch.

    Затем перейдите в представление Container Platform и откройте ObservabilityTracing, чтобы просмотреть функцию трассировки.

    Удаление Tracing

    Удаление экземпляра OpenTelemetry

    Войдите в установленный кластер и выполните следующие команды, чтобы удалить экземпляр OpenTelemetry и связанные с ним ресурсы.

    kubectl -n cpaas-system delete servicemonitor otel-collector-monitoring
    kubectl -n cpaas-system delete servicemonitor otel-collector
    kubectl -n cpaas-system delete instrumentation acp-common-java
    kubectl -n cpaas-system delete opentelemetrycollector otel
    kubectl delete clusterrolebinding otel-collector:cpaas-system:cluster-admin
    kubectl -n cpaas-system delete serviceaccount otel-collector

    Удаление OpenTelemetry Operator

    Вы можете удалить OpenTelemetry Operator через представление Administrator в Web Console.

    Шаги

    • В разделе MarketplaceOperatorHub используйте search box, чтобы найти Alauda build of OpenTelemetry.
    • Нажмите на заголовок Alauda build of OpenTelemetry, чтобы открыть его сведения.
    • На странице сведений Alauda build of OpenTelemetry нажмите кнопку Uninstall в правом верхнем углу.
    • В окне Uninstall "opentelemetry-operator"? нажмите Uninstall.

    Удаление экземпляра Jaeger

    Войдите в установленный кластер и выполните следующие команды, чтобы удалить экземпляр Jaeger и связанные с ним ресурсы.

    kubectl -n cpaas-system delete ingress jaeger-prod-query
    kubectl -n cpaas-system delete podmonitor jaeger-prod-monitor
    kubectl -n cpaas-system delete jaeger jaeger-prod
    kubectl -n cpaas-system delete rolebinding jaeger-prod-rb
    kubectl -n cpaas-system delete role jaeger-prod-role
    kubectl -n cpaas-system delete serviceaccount jaeger-prod-sa
    kubectl -n cpaas-system delete secret jaeger-prod-oauth2-proxy
    kubectl -n cpaas-system delete secret jaeger-prod-es-basic-auth
    kubectl -n cpaas-system delete configmap jaeger-prod-oauth2-proxy

    Удаление Jaeger Operator

    Вы можете удалить Jaeger Operator через представление Administrator в Web Console.

    Шаги

    • В разделе MarketplaceOperatorHub используйте search box, чтобы найти Alauda build of Jaeger.
    • Нажмите на заголовок Alauda build of Jaeger, чтобы открыть его сведения.
    • На странице сведений Alauda build of Jaeger нажмите кнопку Uninstall в правом верхнем углу.
    • В окне Uninstall "jaeger-operator"? нажмите Uninstall.