如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
OpenTelemetry Operator 是 Kubernetes Operator 的一个实现。
该 operator 管理:
您可以通过 opentelemetry-helm-charts 仓库中的 https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator 安装 OpenTelemetry Operator。更多信息可在 https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator 获取。
要在现有集群中安装 operator,请确保已安装 cert-manager 并运行:
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
当 opentelemetry-operator 部署就绪后,创建 OpenTelemetry Collector(otelcol)实例,例如:
kubectl apply -f -
[!NOTE] 此时,Operator 不会验证配置文件的全部内容:如果配置无效,实例仍可能被创建,但底层 OpenTelemetry Collector 可能会崩溃。
Operator 会出于以下几个目的检查配置文件:
发现已配置的接收器及其端口。如果发现带端口的接收器,它会创建一对 Kubernetes 服务(一个无头服务),在集群内暴露这些端口。如果端口使用环境变量展开或无法解析,将返回错误。无头服务包含 service.beta.openshift.io/serving-cert-secret-name 注解,该注解会使 OpenShift 创建包含证书和密钥的 Secret。此 Secret 可作为卷挂载,证书和密钥可用于这些接收器的 TLS 配置。
检查是否启用了 Collector 可观测性(由 spec.observability.metrics.enableMetrics 控制)。在这种情况下,会为 Collector 实例创建 Service 和 ServiceMonitor/PodMonitor。因此,如果指标服务地址包含无效端口或对端口使用环境变量展开,将返回错误。环境变量情况下的解决方法是将 enableMetrics 设置为 false,并在需要时手动创建具有正确端口的上述对象。
如前所述,OpenTelemetry Collector 格式仍在不断发展。不过,会尽最大努力升级所有受管理的 OpenTelemetryCollector 资源。
在某些场景下,可能需要阻止 operator 升级特定的 OpenTelemetryCollector 资源。例如,当资源配置了自定义 .Spec.Image 时,最终用户可能希望自行管理配置,而不是由 operator 升级。这可以通过暴露的 .Spec.UpgradeStrategy 属性按资源进行配置。
通过将资源的 .Spec.UpgradeStrategy 配置为 none,operator 会在升级过程中跳过该实例。
.Spec.UpgradeStrategy 的默认值和唯一其他可接受值是 automatic。
以下是每种部署模式的示例:
DeploymentDaemonSetStatefulSetSidecar边车注入
通过将 pod 注解 sidecar.opentelemetry.io/inject 设置为 "true" 或具体 OpenTelemetryCollector 的名称,可将带有 OpenTelemetry Collector 的边车注入基于 pod 的工作负载,如下例所示:
kubectl apply -f -
kubectl create secret docker-registry --docker-server= \
--docker-username=DUMMY_USERNAME --docker-password=DUMMY_DOCKER_PASSWORD \
--docker-email=DUMMY_DOCKER_EMAIL
kubectl patch serviceaccount -p '{"imagePullSecrets": [{"name": " "}]}'
operator 可以注入和配置 OpenTelemetry 自动 instrumentation 库。目前支持 Apache HTTPD、DotNet、Go、Java、Nginx、NodeJS 和 Python。
要使用自动 instrumentation,请配置 Instrumentation 资源,包含 SDK 和 instrumentation 的配置。
kubectl apply -f -
[!NOTE] 对于
DotNet自动 instrumentation,operator 默认会设置OTEL_DOTNET_AUTO_TRACES_ENABLED_INSTRUMENTATIONS环境变量,该变量指定要启用的跟踪源 instrumentation 列表。operator 默认设置的值为镜像中包含的openTelemery-dotnet-instrumentation版本所支持的所有可用 instrumentation,即AspNet,HttpClient,SqlClient。可通过显式配置该环境变量来覆盖此值。
具有单一 instrumentation 的多容器 pod
如果未指定其他配置,instrumentation 会对 pod 规范中的第一个容器(来自 .spec.containers,而非 init 容器)执行。在某些情况下(例如注入 Istio 边车时),需要指定必须对哪些容器执行此注入。
为此,可以微调要执行注入的 pod。
我们将使用 instrumentation.opentelemetry.io/container-names 注解,在其中指定一个或多个容器名称(来自 .spec.containers.name 或 .spec.initContainers.name),必须对这些容器执行注入:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-with-multiple-containers
spec:
selector:
matchLabels:
app: my-pod-with-multiple-containers
replicas: 1
template:
metadata:
labels:
app: my-pod-with-multiple-containers
annotations:
instrumentation.opentelemetry.io/inject-java: "true"
instrumentation.opentelemetry.io/container-names: "myapp,myapp2"
spec:
containers:
- name: myapp
image: myImage1
- name: myapp2
image: myImage2
- name: myapp3
image: myImage3
在上述情况下,myapp 和 myapp2 容器将被 instrumentation,myapp3 不会。
[!NOTE] Go 自动插桩不支持多容器 Pod。注入 Go 自动插桩时,第一个容器应是您唯一需要插桩的容器。
为 Init 容器插桩
可以通过在 container-names 注解中包含 init 容器的名称来为其插桩。当目标 init 容器被指定进行插桩时,操作员会在 Pod 的 init 容器序列中,自动将插桩 init 容器插入到目标 init 容器之前。这确保了目标 init 容器运行时,插桩代理文件已可用。
支持为 init 容器进行插桩的类型:
不支持为 init 容器进行插桩的类型:
[!NOTE] Kubernetes 保证在 Pod 规范中的
initContainers和containers列表中,容器名称是唯一的。这使操作员能够明确识别容器名称是指 init 容器还是常规容器。
同时为 init 容器和常规容器插桩的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-with-init-container
spec:
selector:
matchLabels:
app: my-app
replicas: 1
template:
metadata:
labels:
app: my-app
annotations:
instrumentation.opentelemetry.io/inject-python: "true"
instrumentation.opentelemetry.io/container-names: "my-init-job,myapp"
spec:
initContainers:
- name: my-init-job
image: my-python-init-image
containers:
- name: myapp
image: my-python-app-image
在此示例中,my-init-job(init 容器)和 myapp(常规容器)都将使用 Python 自动插桩进行插桩。
OpenTelemetry Operator 包含一个可选组件——目标分配器(Target Allocator)(TA)。创建 OpenTelemetryCollector 自定义资源(CR)并启用 TA 后,Operator 将创建新的 Deployment 和 Service,为该 CR 中的每个 Collector Pod 提供特定的 http_sd_config 指令。它还会重写 CR 中的 Prometheus receiver 配置,以使其使用已部署的目标分配器。以下示例展示了如何开始使用目标分配器:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: collector-with-ta
spec:
mode: statefulset
targetAllocator:
enabled: true
config:
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'otel-collector'
scrape_interval: 10s
static_configs:
- targets: [ '0.0.0.0:8888' ]
metric_relabel_configs:
- action: labeldrop
regex: (id|name)
- action: labelmap
regex: label_(.+)
replacement: $1
exporters:
debug: {}
service:
pipelines:
metrics:
receivers: [prometheus]
exporters: [debug]
EOF
上述示例中替换键中 `# Kubernetes 的 OpenTelemetry Operator
OpenTelemetry Operator 是 Kubernetes Operator 的一个实现。
该 operator 管理:
您可以通过 opentelemetry-helm-charts 仓库中的 https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator 安装 OpenTelemetry Operator。更多信息可在 https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator 获取。
要在现有集群中安装 operator,请确保已安装 cert-manager 并运行:
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
当 opentelemetry-operator 部署就绪后,创建 OpenTelemetry Collector(otelcol)实例,例如:
kubectl apply -f -
[!NOTE] 此时,Operator 不会验证配置文件的全部内容:如果配置无效,实例仍可能被创建,但底层 OpenTelemetry Collector 可能会崩溃。
Operator 会出于以下几个目的检查配置文件:
发现已配置的接收器及其端口。如果发现带端口的接收器,它会创建一对 Kubernetes 服务(一个无头服务),在集群内暴露这些端口。如果端口使用环境变量展开或无法解析,将返回错误。无头服务包含 service.beta.openshift.io/serving-cert-secret-name 注解,该注解会使 OpenShift 创建包含证书和密钥的 Secret。此 Secret 可作为卷挂载,证书和密钥可用于这些接收器的 TLS 配置。
检查是否启用了 Collector 可观测性(由 spec.observability.metrics.enableMetrics 控制)。在这种情况下,会为 Collector 实例创建 Service 和 ServiceMonitor/PodMonitor。因此,如果指标服务地址包含无效端口或对端口使用环境变量展开,将返回错误。环境变量情况下的解决方法是将 enableMetrics 设置为 false,并在需要时手动创建具有正确端口的上述对象。
如前所述,OpenTelemetry Collector 格式仍在不断发展。不过,会尽最大努力升级所有受管理的 OpenTelemetryCollector 资源。
在某些场景下,可能需要阻止 operator 升级特定的 OpenTelemetryCollector 资源。例如,当资源配置了自定义 .Spec.Image 时,最终用户可能希望自行管理配置,而不是由 operator 升级。这可以通过暴露的 .Spec.UpgradeStrategy 属性按资源进行配置。
通过将资源的 .Spec.UpgradeStrategy 配置为 none,operator 会在升级过程中跳过该实例。
.Spec.UpgradeStrategy 的默认值和唯一其他可接受值是 automatic。
以下是每种部署模式的示例:
DeploymentDaemonSetStatefulSetSidecar边车注入
通过将 pod 注解 sidecar.opentelemetry.io/inject 设置为 "true" 或具体 OpenTelemetryCollector 的名称,可将带有 OpenTelemetry Collector 的边车注入基于 pod 的工作负载,如下例所示:
kubectl apply -f -
kubectl create secret docker-registry --docker-server= \
--docker-username=DUMMY_USERNAME --docker-password=DUMMY_DOCKER_PASSWORD \
--docker-email=DUMMY_DOCKER_EMAIL
kubectl patch serviceaccount -p '{"imagePullSecrets": [{"name": " "}]}'
operator 可以注入和配置 OpenTelemetry 自动 instrumentation 库。目前支持 Apache HTTPD、DotNet、Go、Java、Nginx、NodeJS 和 Python。
要使用自动 instrumentation,请配置 Instrumentation 资源,包含 SDK 和 instrumentation 的配置。
kubectl apply -f -
[!NOTE] 对于
DotNet自动 instrumentation,operator 默认会设置OTEL_DOTNET_AUTO_TRACES_ENABLED_INSTRUMENTATIONS环境变量,该变量指定要启用的跟踪源 instrumentation 列表。operator 默认设置的值为镜像中包含的openTelemery-dotnet-instrumentation版本所支持的所有可用 instrumentation,即AspNet,HttpClient,SqlClient。可通过显式配置该环境变量来覆盖此值。
具有单一 instrumentation 的多容器 pod
如果未指定其他配置,instrumentation 会对 pod 规范中的第一个容器(来自 .spec.containers,而非 init 容器)执行。在某些情况下(例如注入 Istio 边车时),需要指定必须对哪些容器执行此注入。
为此,可以微调要执行注入的 pod。
我们将使用 instrumentation.opentelemetry.io/container-names 注解,在其中指定一个或多个容器名称(来自 .spec.containers.name 或 .spec.initContainers.name),必须对这些容器执行注入:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-with-multiple-containers
spec:
selector:
matchLabels:
app: my-pod-with-multiple-containers
replicas: 1
template:
metadata:
labels:
app: my-pod-with-multiple-containers
annotations:
instrumentation.opentelemetry.io/inject-java: "true"
instrumentation.opentelemetry.io/container-names: "myapp,myapp2"
spec:
containers:
- name: myapp
image: myImage1
- name: myapp2
image: myImage2
- name: myapp3
image: myImage3
在上述情况下,myapp 和 myapp2 容器将被 instrumentation,myapp3 不会。
[!NOTE] Go 自动插桩不支持多容器 Pod。注入 Go 自动插桩时,第一个容器应是您唯一需要插桩的容器。
为 Init 容器插桩
可以通过在 container-names 注解中包含 init 容器的名称来为其插桩。当目标 init 容器被指定进行插桩时,操作员会在 Pod 的 init 容器序列中,自动将插桩 init 容器插入到目标 init 容器之前。这确保了目标 init 容器运行时,插桩代理文件已可用。
支持为 init 容器进行插桩的类型:
不支持为 init 容器进行插桩的类型:
[!NOTE] Kubernetes 保证在 Pod 规范中的
initContainers和containers列表中,容器名称是唯一的。这使操作员能够明确识别容器名称是指 init 容器还是常规容器。
同时为 init 容器和常规容器插桩的示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-with-init-container
spec:
selector:
matchLabels:
app: my-app
replicas: 1
template:
metadata:
labels:
app: my-app
annotations:
instrumentation.opentelemetry.io/inject-python: "true"
instrumentation.opentelemetry.io/container-names: "my-init-job,myapp"
spec:
initContainers:
- name: my-init-job
image: my-python-init-image
containers:
- name: myapp
image: my-python-app-image
在此示例中,my-init-job(init 容器)和 myapp(常规容器)都将使用 Python 自动插桩进行插桩。
OpenTelemetry Operator 包含一个可选组件——目标分配器(Target Allocator)(TA)。创建 OpenTelemetryCollector 自定义资源(CR)并启用 TA 后,Operator 将创建新的 Deployment 和 Service,为该 CR 中的每个 Collector Pod 提供特定的 http_sd_config 指令。它还会重写 CR 中的 Prometheus receiver 配置,以使其使用已部署的目标分配器。以下示例展示了如何开始使用目标分配器:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: collector-with-ta
spec:
mode: statefulset
targetAllocator:
enabled: true
config:
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'otel-collector'
scrape_interval: 10s
static_configs:
- targets: [ '0.0.0.0:8888' ]
metric_relabel_configs:
- action: labeldrop
regex: (id|name)
- action: labelmap
regex: label_(.+)
replacement: $1
exporters:
debug: {}
service:
pipelines:
metrics:
receivers: [prometheus]
exporters: [debug]
EOF
上述示例中替换键中 的使用基于 Prometheus receiver https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/prometheusreceiver/README.md 文档提供的信息,该文档指出:
[!NOTE] 注意:由于 Collector 配置支持环境变量替换,因此 Prometheus 配置中的 $ 字符会被解释为环境变量。如果要在 Prometheus 配置中使用 $ 字符,必须使用 $$ 进行转义。
在幕后,OpenTelemetry Operator 会在调和后将 Collector 的配置转换为以下内容:
receivers:
prometheus:
target_allocator:
endpoint: http://collector-with-ta-targetallocator:80
interval: 30s
collector_id: $POD_NAME
exporters:
debug:
service:
pipelines:
metrics:
receivers: [prometheus]
exporters: [debug]
OpenTelemetry Operator 还会在调和后将目标分配器的 Prometheus 配置转换为以下内容:
config:
scrape_configs:
- job_name: otel-collector
scrape_interval: 10s
static_configs:
- targets: ["0.0.0.0:8888"]
metric_relabel_configs:
- action: labeldrop
regex: (id|name)
- action: labelmap
regex: label_(.+)
replacement: $1
请注意,在这种情况下,Operator 会将替换键中的 "$$" 替换为单个 "$"。这是因为 Collector 支持环境变量替换,而 TA(目标分配器)不支持。因此,为确保兼容性,TA 配置应仅包含单个 "$" 符号。
有关 TargetAllocator 的更多信息,请参见 此处。
使用 Prometheus 自定义资源进行服务发现
目标分配器可以使用 prometheus-operator 生态系统中的自定义资源(如 ServiceMonitor 和 PodMonitor)进行服务发现,其功能类似于 prometheus-operator 本身。这可通过 Collector CR 中的 prometheusCR 部分启用。
以下是一个最小化示例:
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: collector-with-ta-prometheus-cr
spec:
mode: statefulset
targetAllocator:
enabled: true
serviceAccount: everything-prometheus-operator-needs
prometheusCR:
enabled: true
serviceMonitorSelector: {}
podMonitorSelector: {}
scrapeClasses: []
config:
receivers:
prometheus:
config: {}
exporters:
debug: {}
service:
pipelines:
metrics:
receivers: [prometheus]
exporters: [debug]
EOF
scrapeClasses 属性引用 Prometheus Operator 的 ScrapeClass 功能。有关 scrape class 的更多信息,请参阅 [***]
资源属性设置的优先级如下(最先找到的值生效):
OTEL_RESOURCE_ATTRIBUTES 和 OTEL_SERVICE_NAME 环境变量设置的资源属性resource.opentelemetry.io/ 前缀)设置的资源属性app.kubernetes.io/name)设置的资源属性(前提是 Instrumentation CR 的 defaults.useLabelsForResourceAttributes 设为 true,见上文)k8s.pod.name)Instrumentation CR(在 spec.resource.resourceAttributes 部分)设置的资源属性此优先级对每个资源属性单独应用,因此可以通过注解设置某些属性,同时通过标签设置其他属性。
以下资源属性是从 Pod 元数据计算得出的。
service.name 的计算方式
选择最先找到的值:
pod.annotation[resource.opentelemetry.io/service.name]if (config[useLabelsForResourceAttributes]) pod.label[app.kubernetes.io/name]k8s.deployment.namek8s.replicaset.namek8s.statefulset.namek8s.daemonset.namek8s.cronjob.namek8s.job.namek8s.pod.namek8s.container.nameservice.version 的计算方式
选择最先找到的值:
pod.annotation[resource.opentelemetry.io/service.version]if (cfg[useLabelsForResourceAttributes]) pod.label[app.kubernetes.io/version]if (contains(container docker image tag, '/') == false) container docker image tagservice.instance.id 的计算方式
选择最先找到的值:
pod.annotation[resource.opentelemetry.io/service.instance.id]concat([k8s.namespace.name, k8s.pod.name, k8s.container.name], '.')service.namespace 的计算方式
选择最先找到的值:
pod.annotation[resource.opentelemetry.io/service.namespace]k8s.namespace.name来自真实用户的反馈,见证轩辕镜像的优质服务