Cilium动手实验室: 精通之旅---19.Golden Signals with Hubble and Grafana

Cilium动手实验室: 精通之旅---19.Golden Signals with Hubble and Grafana

  • 1. Lab 环境
  • 2. 部署测试应用
    • 2.1 7层可见性的网络
      • 2.1.1 允许所有命名空间
      • 2.1.2 DNS 可见性
      • 2.1.3 L7-egress-visibility
    • 2.2 检查 Deployments
    • 2.3 在 Hubble UI 中查看
  • 3. Grafana 选项卡
    • 3.1 Grafana 中的 Hubble L7 HTTP 指标
    • 3.2 L7 Hubble 仪表板
  • 4. 吞吐量
    • 4.1 提高请求速率
  • 5. 增加错误率
  • 6. 延迟
    • 6.1 增加请求持续时间
  • 7. 跟踪集成
    • 7.1 介绍
    • 7.2 Grafana 中的痕迹
    • 7.3 访问 Tempo
  • 8. 最终实验
    • 8.1 题目
    • 8.2 解题
      • 8.2.1 图形化界面确认问题
      • 8.2.2 命令行下确认问题

1. Lab 环境

LAB访问地址

https://isovalent.com/labs/hubble-grafana-golden-signals/

在本实验中,我们部署了:

  • 启用 Hubble 和度量标准的 Cilium 1.17.1
  • Kube Prometheus Stack Helm 图表(包括 Prometheus 和 Grafana)

特别是,使用了以下 Cilium Helm 参数(完整的值文件位于 /tmp/helm/cilium-values.yaml):

root@server:~# yq /tmp/helm/cilium-values.yaml 
kubeProxyReplacement: true
k8sServiceHost: kind-control-plane
k8sServicePort: 6443
operator:# only 1 replica needed on a single node setupreplicas: 1prometheus:enabled: trueserviceMonitor:enabled: true
hubble:relay:# enable relay in 02# enabled: trueservice:type: NodePortprometheus:enabled: trueserviceMonitor:enabled: truemetrics:serviceMonitor:enabled: trueenableOpenMetrics: trueenabled:- dns- drop- tcp- icmp- "flow:sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"- "kafka:labelsContext=source_namespace,source_workload,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"- "httpV2:exemplars=true;labelsContext=source_ip,source_namespace,source_workload,destination_ip,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity"dashboards:enabled: truenamespace: monitoringannotations:grafana_folder: "Hubble"ui:# enable UI in 02# enabled: trueservice:type: NodePort
prometheus:enabled: trueserviceMonitor:enabled: true

在本实验中,我们将使用 Cilium 的 Hubble 子系统生成的 Prometheus 指标来监控 HTTP 黄金信号。

具体而言,我们使用以下命令启用了 httpv2 Hubble 指标:

httpV2:exemplars=true;labelsContext=source_ip,source_namespace,source_workload,destination_ip,destination_namespace,destination_workload,traffic_direction;sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity

这是一条相当长的队伍。让我们拆分选项以了解它们的作用:

  • examplars=true 将允许我们将应用程序跟踪中的 OpenTelemetry 跟踪点显示为 Grafana 图形上的叠加层
  • labelsContext 设置为向指标添加额外的标签,包括源/目标 IP、源/目标命名空间、源/目标工作负载以及流量方向(入口或出口)
  • sourceContext 设置源标签的构建方式,在这种情况下,尽可能使用工作负载名称,否则使用保留身份(例如 world
  • destinationContext 对目标执行相同的作

检查 Cilium 是否已正确安装并准备就绪

root@server:~# cilium status --wait/¯¯\/¯¯\__/¯¯\    Cilium:             OK\__/¯¯\__/    Operator:           OK/¯¯\__/¯¯\    Envoy DaemonSet:    OK\__/¯¯\__/    Hubble Relay:       disabled\__/       ClusterMesh:        disabledDaemonSet              cilium                   Desired: 3, Ready: 3/3, Available: 3/3
DaemonSet              cilium-envoy             Desired: 3, Ready: 3/3, Available: 3/3
Deployment             cilium-operator          Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium                   Running: 3cilium-envoy             Running: 3cilium-operator          Running: 1clustermesh-apiserver    hubble-relay             
Cluster Pods:          8/8 managed by Cilium
Helm chart version:    1.17.1
Image versions         cilium             quay.io/cilium/cilium:v1.17.1@sha256:8969bfd9c87cbea91e40665f8ebe327268c99d844ca26d7d12165de07f702866: 3cilium-envoy       quay.io/cilium/cilium-envoy:v1.31.5-1739264036-958bef243c6c66fcfd73ca319f2eb49fff1eb2ae@sha256:fc708bd36973d306412b2e50c924cd8333de67e0167802c9b48506f9d772f521: 3cilium-operator    quay.io/cilium/operator-generic:v1.17.1@sha256:628becaeb3e4742a1c36c4897721092375891b58bae2bfcae48bbf4420aaee97: 1

2. 部署测试应用

我们在后台部署了 jobs-app demo 工作负载应用程序,以生成将要分析的 HTTP 流量。

2.1 7层可见性的网络

jobs-app 应用程序附带一组 Cilium 网络策略资源,这些资源使用 Cilium 的 Envoy 代理实现第 7 层可见性。

List them with: 列出它们:

root@server:~# kubectl -n tenant-jobs get cnp
NAME                         AGE     VALID
allow-all-within-namespace   3m30s   True
dns-visibility               3m30s   False
l7-egress-visibility         3m30s   True
l7-ingress-visibility        3m30s   True

2.1.1 允许所有命名空间

使用以下命令检查策略:

root@server:~# kubectl -n tenant-jobs get cnp allow-all-within-namespace -o yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:annotations:meta.helm.sh/release-name: jobs-appmeta.helm.sh/release-namespace: tenant-jobscreationTimestamp: "2025-06-03T09:02:53Z"generation: 1labels:app.kubernetes.io/managed-by: Helmname: allow-all-within-namespacenamespace: tenant-jobsresourceVersion: "4789"uid: 9de56664-8f96-4eb2-a842-09f215f7685f
spec:description: Allow all within namespaceegress:- toEndpoints:- {}endpointSelector: {}ingress:- fromEndpoints:- {}
status:conditions:- lastTransitionTime: "2025-06-03T09:02:53Z"message: Policy validation succeededstatus: "True"type: Valid

此策略可确保默认情况下允许所有流量。虽然从安全角度来看,这不是最佳实践,但它使本练习的设置更加容易。查看 Zero Trust Visibility 实验室,了解有关保护命名空间的最佳方法的更多信息。

2.1.2 DNS 可见性

使用以下命令检查策略:

root@server:~# kubectl -n tenant-jobs get cnp dns-visibility -o yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:annotations:meta.helm.sh/release-name: jobs-appmeta.helm.sh/release-namespace: tenant-jobscreationTimestamp: "2025-06-03T09:02:53Z"generation: 1labels:app.kubernetes.io/managed-by: Helmname: dns-visibilitynamespace: tenant-jobsresourceVersion: "4819"uid: c2739fed-3c39-451d-85bc-a2481eef3446
spec:egress:- toEndpoints:- matchLabels:k8s:io.kubernetes.pod.namespace: kube-systemk8s:k8s-app: kube-dnstoPorts:- ports:- port: "53"protocol: ANYrules:dns:- matchPattern: '*'- toFQDNs:- matchPattern: '*'- toEntities:- allendpointSelector:matchLabels: {}
status:conditions:- lastTransitionTime: "2025-06-03T09:02:53Z"message: FQDN regex compilation LRU not yet initializedstatus: "False"type: Valid

此策略允许命名空间中的 Pod 访问 Kube DNS 服务。它还添加了一个 DNS 规则,用于通过 Cilium 的 DNS 代理获取 DNS 流量,这使得解析 Hubble 流中的 DNS 名称成为可能。

2.1.3 L7-egress-visibility

使用以下命令检查策略:

root@server:~# kubectl -n tenant-jobs get cnp l7-ingress-visibility -o yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:annotations:meta.helm.sh/release-name: jobs-appmeta.helm.sh/release-namespace: tenant-jobscreationTimestamp: "2025-06-03T09:02:53Z"generation: 1labels:app.kubernetes.io/managed-by: Helmname: l7-ingress-visibilitynamespace: tenant-jobsresourceVersion: "4829"uid: 0a049efb-6bd8-475f-a607-adbfebaccc5f
spec:description: L7 policyendpointSelector: {}ingress:- toPorts:- ports:- port: "9080"protocol: TCP- port: "50051"protocol: TCP- port: "9200"protocol: TCPrules:http:- {}
status:conditions:- lastTransitionTime: "2025-06-03T09:02:53Z"message: Policy validation succeededstatus: "True"type: Valid

最后一个策略允许从命名空间中的所有 Pod 到 TCP 中的端口 9080、50051 和 9200 的入口流量。它强制这些流量通过 Cilium 的 Envoy 代理来实现第 7 层可见性。

2.2 检查 Deployments

让我们等到一切准备就绪。这可能需要几分钟时间才能部署所有组件:

kubectl rollout -n tenant-jobs status deployment/coreapi
kubectl rollout -n tenant-jobs status deployment/crawler
kubectl rollout -n tenant-jobs status deployment/jobposting
kubectl rollout -n tenant-jobs status deployment/loader
kubectl rollout -n tenant-jobs status deployment/recruiter
kubectl rollout -n tenant-jobs status deployment/resumes

2.3 在 Hubble UI 中查看

检查 Hubble UI 是否已正确部署:

root@server:~# cilium status --wait/¯¯\/¯¯\__/¯¯\    Cilium:             OK\__/¯¯\__/    Operator:           OK/¯¯\__/¯¯\    Envoy DaemonSet:    OK\__/¯¯\__/    Hubble Relay:       OK\__/       ClusterMesh:        disabledDaemonSet              cilium                   Desired: 3, Ready: 3/3, Available: 3/3
DaemonSet              cilium-envoy             Desired: 3, Ready: 3/3, Available: 3/3
Deployment             cilium-operator          Desired: 1, Ready: 1/1, Available: 1/1
Deployment             hubble-relay             Desired: 1, Ready: 1/1, Available: 1/1
Deployment             hubble-ui                Desired: 1, Ready: 1/1, Available: 1/1
Containers:            cilium                   Running: 3cilium-envoy             Running: 3cilium-operator          Running: 1clustermesh-apiserver    hubble-relay             Running: 1hubble-ui                Running: 1
Cluster Pods:          21/21 managed by Cilium
Helm chart version:    1.17.1
Image versions         cilium             quay.io/cilium/cilium:v1.17.1@sha256:8969bfd9c87cbea91e40665f8ebe327268c99d844ca26d7d12165de07f702866: 3cilium-envoy       quay.io/cilium/cilium-envoy:v1.31.5-1739264036-958bef243c6c66fcfd73ca319f2eb49fff1eb2ae@sha256:fc708bd36973d306412b2e50c924cd8333de67e0167802c9b48506f9d772f521: 3cilium-operator    quay.io/cilium/operator-generic:v1.17.1@sha256:628becaeb3e4742a1c36c4897721092375891b58bae2bfcae48bbf4420aaee97: 1hubble-relay       quay.io/cilium/hubble-relay:v1.17.1@sha256:397e8fbb188157f744390a7b272a1dec31234e605bcbe22d8919a166d202a3dc: 1hubble-ui          quay.io/cilium/hubble-ui-backend:v0.13.1@sha256:0e0eed917653441fded4e7cdb096b7be6a3bddded5a2dd10812a27b1fc6ed95b: 1hubble-ui          quay.io/cilium/hubble-ui:v0.13.1@sha256:e2e9313eb7caf64b0061d9da0efbdad59c6c461f6ca1752768942bfeda0796c6: 1

选择 tenant-jobs 命名空间以可视化应用程序组件以及它们如何相互通信。

请添加图片描述

组件在相互通信时出现,因为 Hubble 显示服务之间的实时流。

请注意,某些块(例如 zookeeper)具有端口号,后跟 TCP,而其他块则具有额外的 HTTP 标签。这是因为该流量通过 Cilium 的 Envoy Proxy 进行重定向,用于第 7 层解析,从而提供应用层可观察性。

例如,单击 coreapi 块。您将看到使用 HTTP 协议从 resumes 组件到端口 9080/TCP 的通信。该块实际上显示 /applications 路径上的 resumes 应用程序正在使用 POST 方法访问该服务:

请添加图片描述

我们之前描述的 l7-ingress-visibility Cilium 网络策略强制通过 Envoy 代理在端口 9080/TCP 上传输入口流量,从而允许 Hubble 提供这些额外的数据。

3. Grafana 选项卡

3.1 Grafana 中的 Hubble L7 HTTP 指标

在本实验中,我们设置了一个 Grafana 服务器,其数据源指向 Prometheus,并导入了 L7 HTTP 指标控制面板以可视化 Hubble 相关指标。

控制面板中的所有内容都使用 Hubble HTTP 指标,应用程序不需要任何插桩,也不需要向应用程序注入任何内容。

请添加图片描述

Incoming Requests by Source and Response Code 图表应在 0.3 到 0.4 req/s 之间变化。

3.2 L7 Hubble 仪表板

导航仪表板。

请注意您现在如何访问各种 HTTP 指标:

  • Incoming Request Volume
  • Incoming Request Success Rate
  • Request Duration
  • Requests by Response Code

请注意如何按源查看指标(第二部分, 按来源划分的请求 ,带有三个面板)或按目标(第三部分, 按目标划分的请求 ,具有三个面板)。这将使您能够找到异常所在的位置。

Requests by Source 部分中,检查 HTTP Request Duration by Source。请注意,有几个可用的统计数据:P50、P95 和 P99。我们通常用第 99 个百分位或 P99 来描述延迟。

如果我们基于 HTTP 的 Web 应用程序的 P99 延迟小于或等于 2 毫秒,则意味着 99% 的 Web 调用的响应时间低于 2 毫秒。相反,只有 1% 的调用获得超过 2 毫秒的延迟响应。

4. 吞吐量

4.1 提高请求速率

找到页面顶部的 Destination Workload 变量,并确保已选择 loader

请添加图片描述

接下来,通过配置crawler以生成更多简历,并运行crawlerresumes的更多副本来增加请求量 部署。

运行:

helm upgrade jobs-app ./helm/jobs-app.tgz \--namespace tenant-jobs \--reuse-values \--set crawler.replicas=3 \--set crawler.crawlFrequencyLowerBound=0.2 \--set crawler.crawlFrequencyUpperBound=0.5 \--set resumes.replicas=2

观察 Incoming Requests by Source and Response Code 面板。当爬网程序加载程序提交简历时,您应该会看到请求速率增加,因为爬网程序的简历生成速率增加。速率应稳定在 3 req/s 左右。

现在,选择 coreapi 作为页面顶部的 Destination Workload 变量。

Incoming Requests by Source and Response Code 视图中,您还应该看到 coreapi 的请求速率增加。速率应稳定在 6 req/s 左右。

请添加图片描述

5. 增加错误率

让我们部署一个新的 jobs-app 配置,并使用我们的指标来查看请求错误率的变化。

helm upgrade jobs-app ./helm/jobs-app.tgz \--namespace tenant-jobs \--reuse-values \--set coreapi.errorRate=0.5 \--set coreapi.sleepRate=0.01

确保选择 coreapi 作为 Destination Workload

大约一分钟后,您将看到 Incoming Request Success Rate (non-5xx responses) By Source (按源) 图表开始下降。

最后,Incoming Request Success Rate (non-5xx responses) 面板应稳定在 93% 左右。

请添加图片描述

6. 延迟

6.1 增加请求持续时间

接下来,我们将升级 jobs-app 设置以增加响应之间的睡眠时间,从而延长请求持续时间。

运行:

helm upgrade jobs-app ./helm/jobs-app.tgz \--namespace tenant-jobs \--reuse-values \--set coreapi.sleepRate=0.2 \--set coreapi.sleepLowerBound=0.5 \--set coreapi.sleepUpperBound=5.0

并选择 coreapi 作为 Destination Workload。

大约一分钟后,您将看到 HTTP Request Duration by Source (按源划分的 HTTP 请求持续时间 ) 图表中的值增加到 800 毫秒左右。

请添加图片描述

请注意,P50、P95 和 P99 的三条曲线具有截然不同的值。这意味着延迟会增加,但仅限于一小部分请求。

例如,上面的屏幕截图显示,虽然 99% 的请求的延迟低于 ~1 秒(P99 曲线),但其中 95% 的请求延迟低于 600 毫秒(P95 曲线),其中 50% 的请求速度要快得多(P50 曲线)。

单击图形下的 tenant-jobs/resumes P50 标签,仅查看以下值:

请添加图片描述

您可以看到 50% 的请求实际上需要 ~30 毫秒才能得到处理。

检查图表图例中每个序列的最小值、最大值和平均值。这对于识别延迟问题非常有用。

7. 跟踪集成

7.1 介绍

Grafana Tempo 以及 OpenTelemetry Operator 和 Collector 已添加到集群中。

升级 jobs-app 设置以启用 OpenTelemetry 跟踪。

运行:

helm upgrade jobs-app ./helm/jobs-app.tgz \--namespace tenant-jobs \--reuse-values \--set tracing.enabled=true

这将使应用程序生成 OpenTelemetry 跟踪。

当 Cilium 的 Envoy 代理处理第 7 层数据时,Hubble 将能够从 HTTP 标头中提取 Trace ID,并将它们与 Hubble 的数据相关联,以丰富 Grafana 仪表板。

7.2 Grafana 中的痕迹

选择 coreapi 作为 Destination Workload(目标工作负载 )。

HTTP Request Duration by Source/Destination 面板中,您应该开始看到示例显示为点,并位于折线图可视化图表旁边。

请添加图片描述

这些示例中的每个示例都表示单个请求的持续时间,并链接到跟踪 ID。

您可以通过将鼠标悬停在点上来查看跟踪详细信息。选择图表顶部的跟踪点。检查详细信息。

请添加图片描述

7.3 访问 Tempo

接下来,单击弹出窗口底部的 “Query with Tempo” 按钮。这将允许您可视化应用程序的 OpenTelemetry 跟踪。

请添加图片描述

请添加图片描述

请注意, 加载程序请求的末尾(第 3 行,带有深粉色标记)和简历回复的开头(第 4 行,带有非常浅的粉红色标记)之间有一个长空格。这解释了为什么此请求具有较高的延迟(这是因为您从图表顶部选择了一个示例)。

在 Trace View 的顶部,有一个 Node graph 面板。打开它可查看显示交易中花费时间的有向图。

请添加图片描述

请添加图片描述

使用 Web 浏览器中的后退⬅️按钮返回预览视图。

现在,在图表的最底部选择一个请求,然后单击 “Query with Tempo” 按钮:

请添加图片描述

请添加图片描述

您很可能会在跟踪中看到 coreapi 服务的错误。resumes 组件正在尝试连接到 coreapi 但请求没有通过。resumes 实际上会多次重试连接,从而导致多个错误,直到成功为止。

如果您打开 Node graph (节点图形 ) 视图,您也将在那里重试:

请添加图片描述

8. 最终实验

8.1 题目

应用程序已使用原始参数再次部署,但其中一个服务已损坏。

使用每项服务的 Grafana 控制面板,确定哪个服务损坏并修复它。

如果您遇到困难,请考虑以下提示。

  1. 提示1

首先查看传入的请求和相关错误。

浏览 Grafana 上的三个仪表板(coreapiloaderelasticsearch-master)。

其中一项服务返回错误,是哪一项?

另一个服务根本不接受传入请求,是哪一个?

加载程序服务的请求数会减少,但这不是问题。这只是因为我们已将请求速率重置为其原始值。

  1. 提示2

分析跟踪以查找中断的请求。

在 Tempo 中打开一个跟踪,在跟踪中查找失败的服务以及重试的提示。这说明了服务失败的什么情况?

  1. 提示3

使用 Hubble UI 查看组件如何相互链接。

这将帮助您了解哪些缺失的依赖项会导致组件失败。

  1. 提示4

检查组件副本。

确定哪个服务失败后,请使用 kubectl 检查它有多少个副本正在运行。

当心:Kubernetes 中有不止一种类型的工作负载控制器,请考虑所有类型。

  1. 提示5

使用 kubectl 修复问题。该特定服务应使用一个副本运行。

8.2 解题

8.2.1 图形化界面确认问题

coreapi看上去没有数据

请添加图片描述

loader有返回

请添加图片描述

elasticsearch-master看上去好像也没数据

请添加图片描述

进一步调查发现coreapi是存在问题的

请添加图片描述

8.2.2 命令行下确认问题

查看下tenant-jobs下的pod情况

显然问题出在elasticsearch-master.tenant-jobs.svc.cluster.local:9200这个服务上

root@server:~# k get po -n tenant-jobs 
NAME                                        READY   STATUS     RESTARTS   AGE
coreapi-54dfb497c4-n8t5p                    1/1     Running    0          19m
coreapi-585f9f77bb-48twp                    0/1     Init:0/1   0          3m57s
crawler-77886f5878-g84qj                    1/1     Running    0          18m
jobposting-67c6445f96-7dtll                 1/1     Running    0          19m
jobs-app-entity-operator-7bc4cd6568-tg5ck   3/3     Running    0          22m
jobs-app-kafka-0                            1/1     Running    0          22m
jobs-app-zookeeper-0                        1/1     Running    0          23m
loader-dd4b97f64-f8d7q                      1/1     Running    0          19m
recruiter-5c7b8dd845-clx42                  1/1     Running    0          19m
resumes-6954d48bf-s5tpl                     1/1     Running    0          19m
strimzi-cluster-operator-699cd75b77-nb4fw   1/1     Running    0          23m
root@server:~# k describe po -n tenant-jobs coreapi-585f9f77bb-48twp 
Name:             coreapi-585f9f77bb-48twp
Namespace:        tenant-jobs
Priority:         0
Service Account:  default
Node:             kind-worker2/172.18.0.3
Start Time:       Wed, 04 Jun 2025 02:33:28 +0000
Labels:           app=coreapipod-template-hash=585f9f77bb
Annotations:      <none>
Status:           Pending
IP:               10.244.2.233
IPs:IP:           10.244.2.233
Controlled By:  ReplicaSet/coreapi-585f9f77bb
Init Containers:wait-for-elasticsearch:Container ID:  containerd://4e12c079de57cdc32f0dc851a3185de25c4ac3011afa8f578efa04bcd07fd650Image:         curlimages/curl:latestImage ID:      docker.io/curlimages/curl@sha256:d43bdb28bae0be0998f3be83199bfb2b81e0a30b034b6d7586ce7e05de34c3fdPort:          <none>Host Port:     <none>Command:sh-cuntil curl -s -o /dev/null http://elasticsearch-master.tenant-jobs.svc.cluster.local:9200; do echo waiting for elasticsearch; sleep 5; doneState:          RunningStarted:      Wed, 04 Jun 2025 02:33:29 +0000Ready:          FalseRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dmpxc (ro)
Containers:coreapi:Container ID:   Image:          quay.io/isovalent/jobs-app-coreapi:v0.10.0Image ID:       Port:           9080/TCPHost Port:      0/TCPState:          WaitingReason:       PodInitializingReady:          FalseRestart Count:  0Environment:ES_ENDPOINT:                        http://elastic:changeme@elasticsearch-master.tenant-jobs.svc.cluster.local:9200/BOOTSTRAP:                          trueDEBUG:                              falseENABLE_TRACING:                     trueLOG_SPANS:                          falseOTL_EXPORTER_ENABLED:               trueHOST_IP:                             (v1:status.hostIP)OTEL_EXPORTER_OTLP_ENDPOINT:        http://$(HOST_IP):4317ERROR_RATE:                         0.01SLEEP_RATE:                         0.1SLOW_REQUEST_DURATION_LOWER_BOUND:  0.1SLOW_REQUEST_DURATION_UPPER_BOUND:  0.2Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dmpxc (ro)
Conditions:Type                        StatusPodReadyToStartContainers   TrueInitialized                 FalseReady                       FalseContainersReady             FalsePodScheduled                True
Volumes:kube-api-access-dmpxc:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age    From               Message----    ------     ----   ----               -------Normal  Scheduled  4m10s  default-scheduler  Successfully assigned tenant-jobs/coreapi-585f9f77bb-48twp to kind-worker2Normal  Pulling    4m9s   kubelet            Pulling image "curlimages/curl:latest"Normal  Pulled     4m9s   kubelet            Successfully pulled image "curlimages/curl:latest" in 664ms (664ms including waiting). Image size: 9555383 bytes.Normal  Created    4m9s   kubelet            Created container wait-for-elasticsearchNormal  Started    4m9s   kubelet            Started container wait-for-elasticsearch

再确认这个svc发现elasticsearch-master没有ep存在

root@server:~# k get svc -n tenant-jobs elasticsearch-master
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGE
elasticsearch-master   ClusterIP   10.96.117.68   <none>        9200/TCP,9300/TCP   25m
root@server:~# k get ep -n tenant-jobs elasticsearch-master
NAME                   ENDPOINTS   AGE
elasticsearch-master   <none>      25m

通过命令发现statefulset的elasticsearch-master是0/0

root@server:~# k get all -n tenant-jobs |grep ela
service/elasticsearch-master            ClusterIP   10.96.117.68    <none>        9200/TCP,9300/TCP                              26m
service/elasticsearch-master-headless   ClusterIP   None            <none>        9200/TCP,9300/TCP                              26m
statefulset.apps/elasticsearch-master   0/0     26m

调度statefulset副本数

root@server:~# k scale -n tenant-jobs statefulset --replicas=1 elasticsearch-master 
statefulset.apps/elasticsearch-master scaled

稍等片刻后tenant命名空间下面的pod都正常了

root@server:~# k get po -n tenant-jobs 
NAME                                        READY   STATUS    RESTARTS   AGE
coreapi-585f9f77bb-48twp                    1/1     Running   0          9m52s
crawler-77886f5878-g84qj                    1/1     Running   0          24m
elasticsearch-master-0                      1/1     Running   0          99s
jobposting-67c6445f96-7dtll                 1/1     Running   0          24m
jobs-app-entity-operator-7bc4cd6568-tg5ck   3/3     Running   0          28m
jobs-app-kafka-0                            1/1     Running   0          28m
jobs-app-zookeeper-0                        1/1     Running   0          29m
loader-dd4b97f64-f8d7q                      1/1     Running   0          24m
recruiter-5c7b8dd845-clx42                  1/1     Running   0          24m
resumes-6954d48bf-s5tpl                     1/1     Running   0          24m
strimzi-cluster-operator-699cd75b77-nb4fw   1/1     Running   0          29m

此时Grafana这边也正常了

请添加图片描述

看来应该没什么问题了.提交!

请添加图片描述

新徽章GET!
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见文件系统格式有哪些

PART.01 常见文件系统格式有哪些 常见的文件系统格式有很多&#xff0c;通常根据使用场景&#xff08;Windows、Linux、macOS、移动设备、U盘、硬盘等&#xff09;有所不同。以下是一些主流和常见的文件系统格式及其特点&#xff1a; 一、Windows 常见文件系统格式 Digital …

React Native 弹窗组件优化实战:解决 Modal 闪烁与动画卡顿问题

&#x1f4cc; 前言 在移动端开发中&#xff0c;用户对动画的流畅性和过渡自然性有着极高的期待。最近我对一个使用 react-native-modal 实现的 Alert 弹窗组件进行了优化&#xff0c;成功解决了闪烁和卡顿问题&#xff0c;并显著提升了用户体验。 本篇博客将带你深入了解优化…

智能客服系统开发方案:RAG+多智能体技术实现

智能客服系统开发方案:RAG+多智能体技术实现 一、系统架构设计 #mermaid-svg-hKDXil2J0xV064Q5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hKDXil2J0xV064Q5 .error-icon{fill:#552222;}#mermaid-svg-hKDXil2…

【Kafka】消息队列Kafka知识总结

【Kafka】消息队列Kafka知识总结 【一】消息队列【1】什么是消息队列【2】消息队列有什么用&#xff08;1&#xff09;异步处理&#xff08;2&#xff09;削峰/限流&#xff08;3&#xff09;降低系统耦合性&#xff08;4&#xff09;实现分布式事务&#xff08;5&#xff09;顺…

微信小程序开发 RangeError: Maximum call stack size exceeded

通常是由于​​调用栈深度超限​​&#xff08;如无限递归、过深的函数调用链或数据绑定循环&#xff09;导致。以下是具体解决方案&#xff1a; 一、核心原因分析 ​​无限递归​​ 函数直接或间接调用自身且无终止条件&#xff0c;例如事件处理函数中错误触发自身。​​数据…

mapbox进阶,切片网格生成实现

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式1.4 ☘️symbol符号图层…

Mysql 函数concat、concat_ws和group_concat

1.concat concat()函数是将多个字符串组合在一起&#xff0c;形成一个大的字符串&#xff1b;如果连接的字符串中存在一个为NULL&#xff0c;则输出的结果为NULL&#xff0c;语法格式为&#xff1a; concat(str1,str2,....strn) -- 1、字符之间不加连接符 mysql> select c…

“在同一事务中“ 的含义

一、"在同一事务中" 的核心含义 "在同一事务中" 指多个数据库操作共享同一个事务上下文&#xff0c;具有以下特点&#xff1a; 原子性保证&#xff1a;所有操作要么全部成功提交&#xff0c;要么全部失败回滚。隔离性共享&#xff1a;操作使用相同的隔离…

【Create my OS】从零编写一个操作系统

前言&#xff1a; 相信每个自学操作系统的同学&#xff0c;大致学习路线都离不开 HIT-OS、MIT-6.S081、MIT-6.824、MIT-6.828等经典的公开课。但学习完这些经典公开课并完成相应的Lab&#xff0c;很多同学脑海中对于操作系统的知识其实都是零散的&#xff0c;让你从头开始编写一…

计算机视觉与深度学习 | 低照度图像增强算法综述(开源链接,原理,公式,代码)

低照度图像增强算法综述 1 算法分类与原理1.1 传统方法1.2 深度学习方法2 核心算法详解2.1 多尺度Retinex (MSRCR) 实现2.2 SCI自校准光照学习2.3 自适应伽马校正2.4 WaveletMamba架构3 开源资源与实现3.1 主流算法开源库3.2 关键代码实现4 评估与实验对比4.1 客观评价指标4.2 …

【工具教程】批量PDF识别提取区域的内容重命名,将PDF指定区域位置的内容提取出来改名的具体操作步骤

在企业运营过程中&#xff0c;时常会面临处理海量 PDF 文件的挑战。从 PDF 指定区域提取内容并用于重命名文件&#xff0c;能极大地优化企业内部的文件管理流程&#xff0c;提升工作效率。以下为您详细介绍其在企业中的应用场景、具体使用步骤及注意事项。​ 详细使用步骤​ 选…

【Java多线程从青铜到王者】定时器的原理和实现(十一)

定时器 定时器时我们日常开发中会用到的组件工具&#xff0c;类似于一个"闹钟"&#xff0c;设定一个时间&#xff0c;等到了时间&#xff0c;定时器最自动的去执行某个逻辑&#xff0c;比如博客的定时发布&#xff0c;就是使用到了定时器 Java标准库里面也提供了定时…

深入剖析AI大模型:Prompt 优化的底层逻辑

记得看到一篇NLP的文章&#xff0c;就 Prompt 时序效应的论文揭示了一个有趣现象&#xff0c;文章中说&#xff1a;模型对指令的解析存在 "注意力衰减" 特性 —— 就像人类阅读时会更关注段落开头&#xff0c;模型对 Prompt 前 20% 的内容赋予的权重高达 60%。这个发…

【备忘】PHP web项目一般部署办法

【PHP项目一般部署办法】 操作步骤 代码&#xff1a; 把php项目代码clone到指定位置如www/下新建php站点&#xff0c;填写域名&#xff0c;把站点根目录设置为项目根目录项目入口设置&#xff0c;一般为public/项目权限改为766(特殊时候可设置为777)&#xff0c;如果有特殊要求…

【60 Pandas+Pyecharts | 箱包订单数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 数据信息2.3 去除订单金额为空的数据2.5 提取季度和星期 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 每月订单量和订单金额分布3.2 各季…

玩转Docker | 使用Docker部署vaultwarden密码管理器

玩转Docker | 使用Docker部署vaultwarden密码管理器 前言一、vaultwarden介绍Vaultwarden 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署vaultwarden服务下载vaultwarden镜像编辑部署文件创建容器检查容器状态检查服务端口安全设置四、配置…

晶振的多面舞台:从日常电子到高精尖科技的应用探秘

在现代科技的宏大舞台上&#xff0c;晶振宛如一位低调却至关重要的幕后主角&#xff0c;以其稳定的频率输出&#xff0c;为各类电子设备赋予了精准的“脉搏”。从我们日常生活中须臾不离的电子设备&#xff0c;到引领时代前沿的高精尖科技领域&#xff0c;晶振都发挥着不可替代…

uni-app 小程序 Cannot read property ‘addEventListener‘ of undefined, mounted hook

在用 uni-app 开发微信小程序时&#xff0c;提示 Cannot read property addEventListener of undefined, mounted hook document.addEventListener("mousemove", this.touchmove) 在小程序开发里&#xff0c;addEventListener 并非通用的标准 API&#xff0c;不过与…

《专业小词开课啦》——幂等

在系统对接过程中&#xff0c;当出现接口调用异常的情况时&#xff0c;程序员可能会用一些专业术语来答疑......对于0基础同学&#xff0c;自然是需要自行百度一番&#xff0c;学习一下&#xff01; 接下来&#xff0c;先学习【幂等】 PS&#xff1a; 小白参考1.1~1.4内容即…

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…