在 Kubernetes 环境中调试 Dapr
如何在 Kubernetes 集群中调试 Dapr
在 Kubernetes 集群中调试 Dapr 是确保应用程序正常运行的关键。通过调试,开发者可以识别并解决 Dapr 组件之间的通信问题、actor 的状态管理问题,以及其他与 Dapr 集成相关的挑战。
在开始调试之前,请确保您的 Kubernetes 集群已正确配置,并且 Dapr 已成功部署。您可以使用以下命令检查 Dapr 的状态:
```bash
kubectl get pods -n dapr-system
这将列出所有正在运行的 Dapr 组件的 pod。确保所有 pod 都处于 Running
状态。
常见调试步骤
检查 Dapr sidecar 日志:Dapr sidecar 是每个应用程序 pod 中的重要组件。通过查看 sidecar 的日志,您可以获取有关服务调用、发布订阅、绑定等的详细信息。
kubectl logs <pod-name> daprd
验证配置和密钥:确保您的 Dapr 配置和 Kubernetes 密钥正确无误。错误的配置可能导致服务无法正常工作。
测试服务调用:使用 Dapr CLI 工具测试服务调用,以确保服务之间的通信正常。
dapr invoke --app-id <app-id> --method <method-name>
监控状态存储:检查 actor 的状态存储,确保数据持久化和检索正常。
通过这些步骤,您可以有效地调试和优化 Dapr 在 Kubernetes 集群中的运行
1 - 在 Kubernetes 上调试 Dapr 控制平面
如何在 Kubernetes 集群上调试 Dapr 控制平面
概述
有时我们需要了解 Dapr 控制平面(即 Kubernetes 服务)的运行情况,包括 dapr-sidecar-injector
、dapr-operator
、dapr-placement
和 dapr-sentry
,特别是在诊断 Dapr 应用程序时,想知道 Dapr 本身是否存在问题。此外,您可能正在为 Kubernetes 上的 Dapr 开发新功能,并希望调试您的代码。
本指南将介绍如何使用 Dapr 调试二进制文件来调试 Kubernetes 集群上的 Dapr 服务。
调试 Dapr Kubernetes 服务
前置条件
1. 构建 Dapr 调试二进制文件
为了调试 Dapr Kubernetes 服务,需要重新构建所有 Dapr 二进制文件和 Docker 镜像以禁用编译器优化。为此,执行以下命令:
git clone https://github.com/dapr/dapr.git
cd dapr
make release GOOS=linux GOARCH=amd64 DEBUG=1
在 Windows 上下载 MingGW 并使用 ming32-make.exe
替代 make
。
在上述命令中,通过将 ‘DEBUG’ 设置为 ‘1’ 来禁用编译器优化。‘GOOS=linux’ 和 ‘GOARCH=amd64’ 也是必要的,因为二进制文件将在下一步中打包到基于 Linux 的 Docker 镜像中。
二进制文件可以在 ‘dapr’ 目录下的 ‘dist/linux_amd64/debug’ 子目录中找到。
2. 构建 Dapr 调试 Docker 镜像
使用以下命令将调试二进制文件打包到 Docker 镜像中。在此之前,您需要登录您的 docker.io 账户,如果还没有账户,您可能需要考虑在 “https://hub.docker.com/" 注册一个。
export DAPR_TAG=dev
export DAPR_REGISTRY=<your docker.io id>
docker login
make docker-push DEBUG=1
一旦 Dapr Docker 镜像构建并推送到 Docker hub 上,您就可以在 Kubernetes 集群中重新安装 Dapr。
3. 安装 Dapr 调试二进制文件
如果 Dapr 已经安装在您的 Kubernetes 集群中,首先卸载它:
我们将使用 ‘helm’ 来安装 Dapr 调试二进制文件。在接下来的部分中,我们将以 Dapr operator 为例,演示如何在 Kubernetes 环境中配置、安装和调试 Dapr 服务。
首先配置一个 values 文件,包含以下选项:
global:
registry: docker.io/<your docker.io id>
tag: "dev-linux-amd64"
dapr_operator:
debug:
enabled: true
initialDelaySeconds: 3000
注意
如果您需要调试 Dapr 服务的启动时间,您可以将 initialDelaySeconds
配置为一个较长的时间值,例如 “3000” 秒。如果不需要,请将其配置为一个较短的时间值,例如 “3” 秒。然后进入本指南开头从 GitHub 克隆的 ‘dapr’ 目录中,如果还没有,执行以下命令:
helm install dapr charts/dapr --namespace dapr-system --values values.yml --wait
4. 转发调试端口
要调试目标 Dapr 服务(在本例中为 Dapr operator),其预配置的调试端口需要对您的 IDE 可见。为此,我们需要首先找到目标 Dapr 服务的 pod:
$ kubectl get pods -n dapr-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dapr-dashboard-64b46f98b6-dl2n9 1/1 Running 0 61s 172.17.0.9 minikube <none> <none>
dapr-operator-7878f94fcd-6bfx9 1/1 Running 1 61s 172.17.0.7 minikube <none> <none>
dapr-placement-server-0 1/1 Running 1 61s 172.17.0.8 minikube <none> <none>
dapr-sentry-68c7d4c7df-sc47x 1/1 Running 0 61s 172.17.0.6 minikube <none> <none>
dapr-sidecar-injector-56c8f489bb-t2st9 1/1 Running 0 61s 172.17.0.10 minikube <none> <none>
然后使用 kubectl 的 port-forward
命令将内部调试端口暴露给外部 IDE:
$ kubectl port-forward dapr-operator-7878f94fcd-6bfx9 40000:40000 -n dapr-system
Forwarding from 127.0.0.1:40000 -> 40000
Forwarding from [::1]:40000 -> 40000
一切就绪。现在您可以指向端口 40000 并从您喜欢的 IDE 开始远程调试会话。
相关链接
2 - 在 Kubernetes 上调试 daprd
如何在 Kubernetes 集群上调试 Dapr sidecar (daprd)
概述
有时我们需要了解 Dapr sidecar (daprd) 的运行情况,特别是在诊断 Dapr 应用程序时,怀疑 Dapr 本身是否存在问题。此外,您可能正在为 Kubernetes 上的 Dapr 开发新功能,并需要调试您的代码。
本指南介绍如何使用 Dapr 的内置调试功能来调试 Kubernetes pod 中的 Dapr sidecar。要了解如何查看日志和排查 Kubernetes 中的 Dapr 问题,请参阅配置和查看 Dapr 日志指南。
前提条件
- 请参阅本指南了解如何将 Dapr 部署到您的 Kubernetes 集群。
- 按照本指南构建您将在下一步中部署的 Dapr 调试二进制文件。
初始化 Dapr 调试模式
如果 Dapr 已经安装在您的 Kubernetes 集群中,请先卸载它:
我们将使用 ‘helm’ 来安装 Dapr 调试二进制文件。有关更多信息,请参阅使用 Helm 安装。
首先配置一个名为 values.yml
的值文件,选项如下:
global:
registry: docker.io/<your docker.io id>
tag: "dev-linux-amd64"
然后进入从您的克隆 dapr/dapr 仓库 中的 ‘dapr’ 目录,并执行以下命令:
helm install dapr charts/dapr --namespace dapr-system --values values.yml --wait
要为 daprd 启用调试模式,您需要在应用程序的部署文件中添加一个额外的注解 dapr.io/enable-debug
。让我们以 quickstarts/hello-kubernetes 为例。像下面这样修改 ‘deploy/node.yaml’:
diff --git a/hello-kubernetes/deploy/node.yaml b/hello-kubernetes/deploy/node.yaml
index 23185a6..6cdb0ae 100644
--- a/hello-kubernetes/deploy/node.yaml
+++ b/hello-kubernetes/deploy/node.yaml
@@ -33,6 +33,7 @@ spec:
dapr.io/enabled: "true"
dapr.io/app-id: "nodeapp"
dapr.io/app-port: "3000"
+ dapr.io/enable-debug: "true"
spec:
containers:
- name: node
注解 dapr.io/enable-debug
会指示 Dapr 注入器将 Dapr sidecar 置于调试模式。您还可以通过注解 dapr.io/debug-port
指定调试端口,否则默认端口将是 “40000”。
使用以下命令部署应用程序。完整指南请参阅 Dapr Kubernetes 快速入门:
kubectl apply -f ./deploy/node.yaml
使用以下命令找出目标应用程序的 pod 名称:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nodeapp-78866448f5-pqdtr 1/2 Running 0 14s
然后使用 kubectl 的 port-forward
命令将内部调试端口暴露给外部 IDE:
$ kubectl port-forward nodeapp-78866448f5-pqdtr 40000:40000
Forwarding from 127.0.0.1:40000 -> 40000
Forwarding from [::1]:40000 -> 40000
一切就绪。现在您可以指向端口 40000 并从您喜欢的 IDE 开始远程调试会话到 daprd。
常用的 kubectl
命令
在调试 daprd 和在 Kubernetes 上运行的应用程序时,使用以下常用的 kubectl
命令。
获取所有 pod、事件和服务:
kubectl get all
kubectl get all --n <namespace>
kubectl get all --all-namespaces
分别获取每个:
kubectl get events --n <namespace>
kubectl get events --sort-by=.metadata.creationTimestamp --n <namespace>
检查日志:
kubectl logs <podId> daprd
kubectl logs <podId> <myAppContainerName>
kuebctl logs <deploymentId> daprd
kubectl logs <deploymentId> <myAppContainerName>
kubectl describe pod <podId>
kubectl describe deploy <deployId>
kubectl describe replicaset <replicasetId>
通过运行以下命令重启 pod:
kubectl delete pod <podId>
这将导致 replicaset
控制器在删除后重启 pod。
观看演示
在 Dapr 社区电话 #36 中观看关于在 Kubernetes 上排查 Dapr 问题的演示。
相关链接