十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Jaeger 可观测性栈 HTTPS Ingress 配置实战:NGINX Ingress + Let‘s Encrypt 自动化证书管理

Jaeger 可观测性栈 HTTPS Ingress 配置实战:NGINX Ingress + Let‘s Encrypt 自动化证书管理 Jaeger 可观测性栈 HTTPS Ingress 配置实战NGINX Ingress Lets Encrypt 自动化证书管理【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger本文以 examples/otel-demo 演示环境为背景系统讲解如何通过 NGINX Ingress Controller 与 cert-managerLets Encrypt 生产环境签发器将 Jaeger UI、HotROD 演示应用、OpenSearch Dashboards 与 OpenTelemetry Demo Shop 四个服务安全地暴露到公网。读完本文你将掌握整套 Ingress 资源文件的编写思路、证书自动签发与续期的原理、DNS 前置配置以及一套可直接复用的排障命令集。目录结构与文件总览本环境的所有 HTTPS 入口配置集中在examples/otel-demo/ingress/目录下包含四个 YAML 清单文件作用clusterissuer-letsencrypt-prod.yamlLets Encrypt 证书签发器集群级 ClusterIssuer已部署ingress-jaeger.yaml暴露 Jaeger UI 与 HotROD 演示应用ingress-opensearch.yaml暴露 OpenSearch Dashboardsingress-otel-demo.yaml暴露 OTel Demo Shopfrontend-proxy这些清单由 deploy-all.sh 在部署流程末尾统一kubectl apply下发见该脚本中的deploy_ingress函数并在部署完成后通过 curl 对公网端点执行冒烟测试验证。整个栈的组件与命名空间布局可参考 examples/otel-demo/README.mdjaeger命名空间运行 Jaeger all-in-one 与 HotRODopensearch命名空间运行 OpenSearch 与 Dashboardsotel-demo命名空间运行 OpenTelemetry Demo。前置条件在应用任何 Ingress 清单之前集群必须具备以下条件NGINX Ingress Controller已部署这是 Ingress 实际承载流量的控制器ingressClassName: nginx将指向它cert-manager已部署负责监听 Ingress 上的签发注解并自动申请、续期 TLS 证书ClusterIssuerletsencrypt-prod已配置见下文详解DNS 记录已指向 Ingress Controller 的外部 IP本环境中为170.9.51.232否则 HTTP-01 校验无法完成。Lets Encrypt 生产签发器ClusterIssuer详解clusterissuer-letsencrypt-prod.yaml 是整套 HTTPS 能力的起点它的完整内容如下apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: email: cncf-jaeger-maintainerslists.cncf.io server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: ingressClassName: nginx要点说明kind: ClusterIssuer作用域为整个集群而非单个命名空间因此jaeger、opensearch、otel-demo三个命名空间的 Ingress 都可以引用它无需在每个命名空间重复创建签发器server指向 Lets Encrypt 生产环境 API 目录acme-v02.api.letsencrypt.org。注意与 staging 环境的区别——生产环境有速率限制调试期建议先用 stagingprivateKeySecretRefcert-manager 将 ACME 账户私钥存入名为letsencrypt-prod的 Secrethttp01solver采用 HTTP-01 校验方式要求ingressClassName: nginx——cert-manager 会临时修改目标 Ingress 的 NGINX 配置来响应 ACME 校验请求这也是DNS 必须指向 Ingress Controller 外部 IP的根本原因。三个 Ingress 资源逐个拆解1. Jaeger UI 与 HotRODingress-jaeger.yamlingress-jaeger.yaml 在一个 Ingress 对象中同时定义了两个 host 规则apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: jaeger-demo-ingress namespace: jaeger annotations: cert-manager.io/cluster-issuer: letsencrypt-prod spec: ingressClassName: nginx rules: - host: jaeger.demo.jaegertracing.io http: paths: - path: / pathType: Prefix backend: service: name: jaeger-query-clusterip port: number: 16686 - host: hotrod.demo.jaegertracing.io http: paths: - path: / pathType: Prefix backend: service: name: jaeger-hotrod port: number: 80 tls: - hosts: - jaeger.demo.jaegertracing.io - hotrod.demo.jaegertracing.io secretName: jaeger-demo-tlscert-manager.io/cluster-issuer: letscenrypt-prod注解是触发证书自动签发的开关cert-manager 看到它后会向 ClusterIssuer 发起 ACME 订单jaeger.demo.jaegertracing.io路由到jaeger-query-clusterip服务的 16686 端口。这个 ClusterIP 服务定义在 jaeger-query-service.yaml 中它通过 selectorapp.kubernetes.io/name: jaeger, app.kubernetes.io/component: all-in-one匹配到 Jaeger all-in-one Pod 的 query 端口——也就是说 Ingress 后面是一个服务 → Pod的完整链路hotrod.demo.jaegertracing.io路由到jaeger-hotrod服务的 80 端口HotROD 是 Jaeger 自带的分布式跟踪演示应用镜像 tag 1.72.0配置见 jaeger-values.yamltls块声明了这两个 host 共享同一个证书 Secretjaeger-demo-tls同一证书覆盖多个 SAN 域名证书签发成功后 cert-manager 会把证书与私钥写入该 Secret。2. OpenSearch Dashboardsingress-opensearch.yamlingress-opensearch.yaml 结构更简单只暴露一个服务apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: opensearch-demo-ingress namespace: opensearch annotations: cert-manager.io/cluster-issuer: letsencrypt-prod spec: ingressClassName: nginx rules: - host: opensearch.demo.jaegertracing.io http: paths: - path: / pathType: Prefix backend: service: name: opensearch-dashboards port: number: 5601 tls: - hosts: - opensearch.demo.jaegertracing.io secretName: opensearch-demo-tls注意该 Ingress 位于opensearch命名空间后端指向opensearch-dashboards服务的 5601 端口Dashboards 默认 HTTP 端口TLS Secret 名为opensearch-demo-tls。Ingress 与后端服务必须在同一命名空间这是 Kubernetes 的硬性约束也是本环境按命名空间拆分发证/存证的原因之一。3. OTel Demo Shopingress-otel-demo.yamlingress-otel-demo.yaml 暴露的是 OpenTelemetry 官方 Demo多服务在线商店的入口apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: otel-demo-ingress namespace: otel-demo annotations: cert-manager.io/cluster-issuer: letsencrypt-prod spec: ingressClassName: nginx rules: - host: shop.demo.jaegertracing.io http: paths: - path: / pathType: Prefix backend: service: name: frontend-proxy port: number: 8080 tls: - hosts: - shop.demo.jaegertracing.io secretName: otel-demo-tls该 Ingress 位于otel-demo命名空间后端为frontend-proxy服务的 8080 端口。这里体现了安全设计Demo 商店的负载生成器Load Generator不直接暴露而是通过 frontend-proxy 间接访问/loadgen/路径。暴露服务总览服务URL后端 Service端口Jaeger UIhttps://jaeger.demo.jaegertracing.iojaeger-query-clusterip16686HotROD Demohttps://hotrod.demo.jaegertracing.iojaeger-hotrod80OpenSearch Dashboardshttps://opensearch.demo.jaegertracing.ioopensearch-dashboards5601OTel Demo Shophttps://shop.demo.jaegertracing.iofrontend-proxy8080Load Generatorhttps://shop.demo.jaegertracing.io/loadgen/经 frontend-proxy 转发8080证书管理与自动续期证书由 cert-manager 借助 Lets Encrypt 生产签发器自动管理无需手工创建或更新 TLS Secret。查看证书状态kubectl get certificates --all-namespaces输出中应包含三个 Certificate 对象jaeger-demo-tls、opensearch-demo-tls、otel-demo-tls其READY状态为True表示签发成功。证书 Secret 归属TLS Secret命名空间jaeger-demo-tlsjaegeropensearch-demo-tlsopensearchotel-demo-tlsotel-demo强制证书续期kubectl delete certificate cert-name -n namespace # 证书会被自动重新创建并重新签发删除 Certificate 对象后cert-manager 会自动为其重建并重新走 ACME 签发流程——这是证书异常时常用的重启手段比手动删 Secret 更安全删 Secret 不会自动重建。DNS 配置与验证四个 hostname 必须全部解析到 NGINX Ingress Controller 的外部 IP170.9.51.232jaeger.demo.jaegertracing.io - 170.9.51.232 hotrod.demo.jaegertracing.io - 170.9.51.232 opensearch.demo.jaegertracing.io - 170.9.51.232 shop.demo.jaegertracing.io - 170.9.51.232验证 DNSdig jaeger.demo.jaegertracing.io short若返回值不是170.9.51.232说明 DNS 尚未生效或配置有误——此时 Lets Encrypt HTTP-01 校验必然失败证书将无法签发。部署与自动化验证Ingress 并非手工逐个 apply而是由 deploy-all.sh 的deploy_ingress函数在完整栈部署完成后统一处理依次kubectl apply三个 Ingress 清单ingress-jaeger.yaml、ingress-opensearch.yaml、ingress-otel-demo.yaml并检查返回是否包含created/configured/unchanged等待 10 秒后检查三个命名空间jaeger、opensearch、otel-demo内 Certificate 的Ready条件输出All SSL certificates ready (n/n)或提示仍有证书待签发打印四个 HTTPS 端点供访问。脚本还内置了公网冒烟测试通过环境变量RUN_PUBLIC_SMOKE_TESTStrue开启用curl验证https://jaeger.demo.jaegertracing.io/search页面包含 Jaeger UI 字样并验证/api/v3/services返回包含checkout的 JSON——这两条命令可以复用来快速确认入口和追踪数据链路是否正常工作。故障排查Ingress 未生效kubectl get ingress --all-namespaces kubectl describe ingress name -n namespace重点查看describe输出中的 Events 段若出现Error creating new order或Failed to create ACME order通常指向 DNS 解析或签发器配置问题。证书签发失败kubectl describe certificate cert-name -n namespace kubectl get certificaterequest -n namespace kubectl get challenge -n namespace排查链路由粗到细Certificate → CertificateRequest → Challenge。Challenge 对象最能直接反映 HTTP-01 校验的成败常见失败原因是 DNS 未指向 Ingress Controller IP或 80 端口被防火墙拦截导致 ACME 校验请求无法到达。Ingress Controller 日志kubectl logs -n ingress-nginx -l app.kubernetes.io/nameingress-nginx用于排查 502/504 等后端转发问题确认后端 Service 的 endpoints 是否有就绪 Pod可配合kubectl get endpoints -n ns检查。安全设计要点负载生成器不直接暴露Load Generator 仅能通过 frontend-proxy 的/loadgen/路径访问https://shop.demo.jaegertracing.io/loadgen/避免将压测流量入口直接暴露给公网全部使用生产级 Lets Encrypt 证书非自签名或 staging 证书自动续期已启用Lets Encrypt 证书有效期 90 天cert-manager 会在到期前自动续期无需人工干预。这套ClusterIssuer 多命名空间 Ingress 共享 TLS Secret的组合模式既保证了每个服务独立签发证书、互不影响又通过注解方式将证书生命周期完全托管给 cert-manager是可观测性栈对外提供 HTTPS 服务的低成本、高自动化参考方案。【免费下载链接】jaegerCNCF Jaeger, a Distributed Tracing Platform项目地址: https://gitcode.com/GitHub_Trending/ja/jaeger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表