• Русский
  • Мультиконтейнерные Pod'ы

    При работе с мультиконтейнерными pod'ами необходимо настроить автоинструментирование таким образом, чтобы оно корректно обрабатывало несколько контейнеров. Operator предоставляет гибкие возможности для управления тем, какие контейнеры получают инструментирование и как взаимодействуют несколько инструментирований.

    Поведение по умолчанию

    По умолчанию, при аннотировании pod'а для автоинструментирования, Operator внедряет инструментирование в первый контейнер в спецификации pod'а. Это хорошо работает для pod'ов с одним контейнером, но может быть неприемлемо для мультиконтейнерных сценариев.

    Указание целевых контейнеров

    Чтобы контролировать, какие контейнеры получают инструментирование, используйте аннотацию container-names:

    apiVersion: v1
    kind: Pod
    metadata:
      name: multi-container-app
      annotations:
        instrumentation.opentelemetry.io/inject-java: "true"
        instrumentation.opentelemetry.io/container-names: "app,worker"
    spec:
      containers:
      - name: app
        image: myapp:latest
      - name: worker
        image: myworker:latest
      - name: sidecar
        image: mysidecar:latest

    В этом примере только контейнеры app и worker получают Java-инструментирование, а контейнер sidecar остаётся без инструментирования.

    Несколько инструментирований в одном pod'е

    Вы можете применить разные типы инструментирования к разным контейнерам внутри одного pod'а:

    apiVersion: v1
    kind: Pod
    metadata:
      name: polyglot-app
      annotations:
        instrumentation.opentelemetry.io/inject-java: "true"
        instrumentation.opentelemetry.io/inject-python: "true"
        instrumentation.opentelemetry.io/java-container-names: "java-app"
        instrumentation.opentelemetry.io/python-container-names: "python-worker"
    spec:
      containers:
      - name: java-app
        image: myjavaapp:latest
      - name: python-worker
        image: mypythonworker:latest
      - name: nginx
        image: nginx:latest

    Эта конфигурация применяет:

    • Java-инструментирование к контейнеру java-app
    • Python-инструментирование к контейнеру python-worker
    • Отсутствие инструментирования к контейнеру nginx

    Формат аннотации имени контейнера

    Аннотация имени контейнера имеет следующий формат:

    instrumentation.opentelemetry.io/<language>-container-names: "container1,container2"

    Где <language> может быть:

    • java
    • python
    • nodejs
    • dotnet
    • go
    • apache-httpd
    • sdk

    Изоляция переменных окружения

    Каждый инструментированный контейнер получает свой собственный набор переменных окружения для инструментирования. Вы можете настроить параметры для конкретных контейнеров с помощью Instrumentation CR:

    spec:
      java:
        env:
          - name: OTEL_SERVICE_NAME
            value: java-service
      python:
        env:
          - name: OTEL_SERVICE_NAME
            value: python-service

    Пример: мульти-языковое приложение

    В следующем примере контейнеры myapp и myapp2 будут инструментированы с помощью Java, а myapp3 — с помощью Python:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment-with-multi-containers-multi-instrumentations
    spec:
      selector:
        matchLabels:
          app: my-pod-with-multi-containers-multi-instrumentations
      replicas: 1
      template:
        metadata:
          labels:
            app: my-pod-with-multi-containers-multi-instrumentations
          annotations:
            instrumentation.opentelemetry.io/inject-java: "true"
            instrumentation.opentelemetry.io/java-container-names: "myapp,myapp2"
            instrumentation.opentelemetry.io/inject-python: "true"
            instrumentation.opentelemetry.io/python-container-names: "myapp3"
        spec:
          containers:
            - name: myapp
              image: myImage1
            - name: myapp2
              image: myImage2
            - name: myapp3
              image: myImage3

    Важные замечания

    • Go автоинструментирование не поддерживает мультиконтейнерные pod'ы. При внедрении Go автоинструментирования первым контейнером должен быть единственный, который вы хотите инструментировать.
    • Этот тип инструментирования не позволяет инструментировать один контейнер несколькими языковыми инструментированиями.
    • Аннотация instrumentation.opentelemetry.io/container-names не используется для этой функциональности.