如果你使用 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%E8%8E%B7%E5%8F%96%E3%80%82
要在现有集群中安装 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 服务(一个为 headless 服务),在集群内暴露这些端口。如果端口使用环境变量扩展或无法解析,将返回错误。headless 服务包含 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。
以下是每种部署模式的示例:
Sidecar 注入
通过将 pod 注解 sidecar.opentelemetry.io/inject 设置为 "true" 或具体的 OpenTelemetryCollector 名称,可以将带有 OpenTelemetry Collector 的 sidecar 注入基于 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 sidecar 时),需要指定必须在哪些容器上执行此注入。
为此,可以微调要执行注入的 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
为初始化容器注入 instrumentation
可以通过在 container-names 注解中包含初始化容器的名称来为其注入 instrumentation。当目标为初始化容器注入 instrumentation 时,operator 会在 Pod 的初始化容器序列中,自动将 instrumentation 初始化容器插入到目标初始化容器之前。这确保了在目标初始化容器运行时,instrumentation 代理文件是可用的。
初始化容器支持的 instrumentation:
初始化容器不支持的 instrumentation:
[!NOTE] Kubernetes 保证在 Pod 规范中的
initContainers和containers列表中,容器名称是唯一的。这使得 operator 能够明确识别容器名称是指初始化容器还是常规容器。
同时为初始化容器和常规容器注入 instrumentation 的示例:
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(初始化容器)和 myapp(常规容器)都将使用 Python 自动注入 instrumentation。
OpenTelemetry Operator 包含一个可选组件:Target Allocator(TA)。创建 OpenTelemetryCollector 自定义资源(CR)并启用 TA 后,Operator 会创建新的部署和服务,为该 CR 中的每个 Collector pod 提供特定的 http_sd_config 指令。它还会重写 CR 中的 Prometheus 接收器配置,使其使用已部署的目标分配器。以下示例展示了如何开始使用 Target Allocator:
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%E8%8E%B7%E5%8F%96%E3%80%82
要在现有集群中安装 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 服务(一个为 headless 服务),在集群内暴露这些端口。如果端口使用环境变量扩展或无法解析,将返回错误。headless 服务包含 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。
以下是每种部署模式的示例:
Sidecar 注入
通过将 pod 注解 sidecar.opentelemetry.io/inject 设置为 "true" 或具体的 OpenTelemetryCollector 名称,可以将带有 OpenTelemetry Collector 的 sidecar 注入基于 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 sidecar 时),需要指定必须在哪些容器上执行此注入。
为此,可以微调要执行注入的 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
为初始化容器注入 instrumentation
可以通过在 container-names 注解中包含初始化容器的名称来为其注入 instrumentation。当目标为初始化容器注入 instrumentation 时,operator 会在 Pod 的初始化容器序列中,自动将 instrumentation 初始化容器插入到目标初始化容器之前。这确保了在目标初始化容器运行时,instrumentation 代理文件是可用的。
初始化容器支持的 instrumentation:
初始化容器不支持的 instrumentation:
[!NOTE] Kubernetes 保证在 Pod 规范中的
initContainers和containers列表中,容器名称是唯一的。这使得 operator 能够明确识别容器名称是指初始化容器还是常规容器。
同时为初始化容器和常规容器注入 instrumentation 的示例:
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(初始化容器)和 myapp(常规容器)都将使用 Python 自动注入 instrumentation。
OpenTelemetry Operator 包含一个可选组件:Target Allocator(TA)。创建 OpenTelemetryCollector 自定义资源(CR)并启用 TA 后,Operator 会创建新的部署和服务,为该 CR 中的每个 Collector pod 提供特定的 http_sd_config 指令。它还会重写 CR 中的 Prometheus 接收器配置,使其使用已部署的目标分配器。以下示例展示了如何开始使用 Target Allocator:
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 接收器 https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/prometheusreceiver/README.md 文档中的说明:
注意:由于 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 还会在调和后将 Target Allocator 的 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(Target Allocator)不支持。因此,为确保兼容性,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 的更多信息,请参阅 [***]
请参见 CONTRIBUTING.md。
除了 https://github.com/open-telemetry/community/blob/main/community-membership.md 外,operator 项目要求审批者和维护者负责项目的发布。有关更多信息和发布计划,请参见 RELEASE.md。
有关维护者角色的更多信息,请参见 https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#maintainer%E3%80%82
有关审批者角色的更多信息,请参见 https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#approver%E3%80%82
有关问题分类者角色的更多信息,请参见 https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#triager%E3%80%82
有关荣誉角色的更多信息,请参见 https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#emeritus-maintainerapprovertriager%E3%80%82
有关荣誉角色的更多信息,请参见 https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#emeritus-maintainerapprovertriager%E3%80%82
感谢所有已贡献的人员!
来自真实用户的反馈,见证轩辕镜像的优质服务