多容器 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

在此示例中,只有 appworker 容器接收 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-app 容器的 Java 检测
  • python-worker 容器的 Python 检测
  • 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

示例:多语言应用

在以下示例中,myappmyapp2 容器将使用 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 注解不适用于此功能。