自定义 OpenTelemetry Collector
本指南解释了如何配置 Admission Controller 将遥测数据发送到已经在集群上部署的 OpenTelemetry Collector。
您应该在集群中仅部署一个 OpenTelemetry Collector 实例。
安装依赖项
首先,开始安装 OpenTelemetry Collector 的依赖项。
您需要在 SUSE Security Admission Controller 组件与 Collector 之间进行加密通信。您可以使用 cert-manager 来管理所有需要的证书,以确保安全通信。
OpenTelemetry Collector 的追踪信息会发送到 Jaeger 实例。
Admission Controller 堆栈将指标发送到 OpenTelemetry Collector。 这个实例将指标暴露为 Prometheus 端点。然后,这些指标会被 Prometheus 实例收集并存储在其数据库中。同一个 Prometheus 实例还提供一个 UI 来查看和使用这些指标。
您创建的资源在 kubewarden 名称空间中定义,或者期望其存在。因此,您应该首先创建名称空间:
kubectl create namespace suse-sec-adm-controller
kubectl create secret docker-registry application-collection \
--namespace suse-sec-adm-controller \
--docker-server=dp.apps.rancher.io \
--docker-username=<your-username> \
--docker-password=<your-token>
安装 cert-manager 和 OpenTelemetry
您可以通过以下方式安装 cert-manager 和 OpenTelemetry operator:
for ns in cert-manager open-telemetry; do
kubectl create namespace $ns
kubectl create secret docker-registry application-collection \
--namespace $ns \
--docker-server=dp.apps.rancher.io \
--docker-username=<your-username> \
--docker-password=<your-token>
done
helm install --wait \
--namespace cert-manager \
--set crds.enabled=true \
--set global.imagePullSecrets={application-collection} \
--version 1.21.2 \
cert-manager oci://dp.apps.rancher.io/charts/cert-manager
helm install --wait \
--namespace open-telemetry \
--version 0.124.1 \
--set global.imagePullSecrets={application-collection} \
--set manager.collectorImage.tag=0.160.0-contrib \
my-opentelemetry-operator oci://dp.apps.rancher.io/charts/opentelemetry-operator
您通过 mTLS 在 Admission Controller 组件和 OpenTelemetry Collector 之间建立通信。
为此,您需要创建整个公共密钥基础结构 (PKI):
# pki.yaml file
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-client-certificate
namespace: suse-sec-adm-controller
spec:
dnsNames:
- kubewarden.suse-sec-adm-controller.svc
- kubewarden.suse-sec-adm-controller.svc.cluster.local
issuerRef:
kind: Issuer
name: my-selfsigned-issuer
secretName: my-client-cert
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: my-certificate
namespace: suse-sec-adm-controller
spec:
dnsNames:
- my-collector-collector.suse-sec-adm-controller.svc
- my-collector-collector.suse-sec-adm-controller.svc.cluster.local
issuerRef:
kind: Issuer
name: my-selfsigned-issuer
secretName: my-server-cert
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: my-selfsigned-issuer
namespace: suse-sec-adm-controller
spec:
selfSigned: {}
应用清单:
kubectl apply -f pki.yaml
安装 Jaeger 和 Prometheus
之后,您安装 Jaeger 来存储和可视化追踪事件。
kubectl create namespace jaeger
kubectl create secret docker-registry application-collection \
--namespace jaeger \
--docker-server=dp.apps.rancher.io \
--docker-username=<your-username> \
--docker-password=<your-token>
helm upgrade -i --wait \
--namespace jaeger \
--version 2.57.0 \
jaeger-operator oci://dp.apps.rancher.io/charts/jaeger-operator \
--set global.imagePullSecrets={application-collection} \
--set rbac.clusterRole=true
kubectl apply -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: my-open-telemetry
namespace: jaeger
spec:
imagePullSecrets:
- name: application-collection
EOF
如果您在 OpenTelemetry 快速入门中安装了 Traefik,请使用以下 Ingress 来公开 Jaeger 查询 UI:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind:Ingress +
metadata: +
name: my-open-telemetry-query +
namespace: jaeger +
spec: +
ingressClassName: traefik +
rules: +
- http: +
paths: +
- path: / +
pathType:Prefix +
backend: +
service: +
name: my-open-telemetry-query +
port: +
number:16686
EOF
现在您安装 Prometheus 来存储和可视化指标。
cat <<EOF > kube-prometheus-stack-values.yaml
prometheus:
additionalServiceMonitors:
- name: kubewarden
selector:
matchLabels:
app.kubernetes.io/instance: suse-sec-adm-controller.my-collector
namespaceSelector:
matchNames:
- suse-sec-adm-controller
endpoints:
- port: prometheus
interval: 10s
EOF
kubectl create namespace prometheus
kubectl create secret docker-registry application-collection \
--namespace prometheus \
--docker-server=dp.apps.rancher.io \
--docker-username=<your-username> \
--docker-password=<your-token>
helm install --wait \
--namespace prometheus \
--version 92.1.0 \
--values kube-prometheus-stack-values.yaml \
--set global.imagePullSecrets={application-collection} \
prometheus oci://dp.apps.rancher.io/charts/prometheus-operator
|
Prometheus 服务监视器通过抓取在 |
安装 OpenTelemetry Collector
现在您可以在 kubewarden 名称空间中部署自定义 OpenTelemetry Collector。
# otel-collector.yaml file
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-collector
namespace: suse-sec-adm-controller
imagePullSecrets:
- name: application-collection
---
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
metadata:
name: my-collector
namespace: suse-sec-adm-controller
spec:
mode: deployment # This configuration is omittable.
serviceAccount: my-collector
volumes:
- name: server-certificate
secret:
secretName: my-server-cert
- name: client-certificate
secret:
secretName: my-client-cert
volumeMounts:
- name: server-certificate
mountPath: /tmp/etc/ssl/certs/my-server-cert
readOnly: true
- name: client-certificate
mountPath: /tmp/etc/ssl/certs/my-client-cert
readOnly: true
config:
receivers:
otlp:
protocols:
grpc:
tls:
cert_file: /tmp/etc/ssl/certs/my-server-cert/tls.crt
key_file: /tmp/etc/ssl/certs/my-server-cert/tls.key
client_ca_file: /tmp/etc/ssl/certs/my-client-cert/ca.crt
processors: {}
exporters:
debug:
verbosity: normal
prometheus:
endpoint: ":8080"
otlp/jaeger:
endpoint: "my-open-telemetry-collector.jaeger.svc.cluster.local:4317"
tls:
insecure: true
service:
pipelines:
metrics:
receivers: [otlp]
processors: []
exporters: [debug, prometheus]
traces:
receivers: [otlp]
processors: []
exporters: [debug, otlp/jaeger]
应用清单:
kubectl apply -f otel-collector.yaml
该配置使用简单的处理管道来接收追踪事件并将其转发到 Jaeger。它还接收指标并将其公开以供 Prometheus 收集。
您通过 mTLS 保护 Admission Controller 堆栈与 OpenTelemetry Collector 之间的通信。然而,OpenTelemetry Collector 与 Jaeger 之间的通信并未加密,以减少示例的复杂性。
安装 Admission Controller 堆栈
当 OpenTelemetry Collector 正在运行时,您可以以通常的方式部署 Admission Controller。
您需要配置 Admission Controller 组件,以便它们将事件和指标发送到 OpenTelemetry Collector。
# values.yaml
telemetry:
mode: custom
metrics: True
tracing: True
custom:
endpoint: "https://my-collector-collector.suse-sec-adm-controller.svc:4317"
insecure: false
otelCollectorCertificateSecret: "my-server-cert"
otelCollectorClientCertificateSecret: "my-client-cert"
由 otelCollectorCertificateSecret 键引用的 Secret 必须有一个名为 ca.crt 的条目。它包含颁发用于 OpenTelemetry Collector 的证书的 CA 的证书。
由 otelCollectorClientCertificateSecret 键引用的 Secret 必须有以下条目:tls.crt 和 tls.key 键。这些是 Admission Controller 堆栈用于对 OpenTelemetry Collector 进行身份验证的客户端证书及其密钥。
如果您不使用加密或 mTLS,请将这些值留空。
安装 Admission Controller 堆栈:
helm install --wait \
--namespace suse-sec-adm-controller \
--values values.yaml \
--set global.imagePullSecrets={application-collection} \
--set recommendedPolicies.enabled=True \
--set recommendedPolicies.defaultPolicyMode=monitor \
suse-sec-adm-controller oci://dp.apps.rancher.io/charts/suse-security-admission-controller
现在一切都已就绪。
探索 Jaeger UI
您可以通过使用 Jaeger UI 查看由 Admission Controller 生成的追踪事件。它们被归类在 kubewarden-policy-server 服务下:
要通过 Traefik 访问 Jaeger UI,请对 Traefik 服务进行端口转发:
kubectl -n traefik port-forward service/traefik 8080:80
网络 UI 可在 http://localhost:8080 上访问。
如果您希望绕过 Traefik,请直接对 Jaeger 查询服务进行端口转发:
kubectl -n jaeger port-forward service/my-open-telemetry-query 16686
网络 UI 可在 http://localhost:16686 上访问。