This is the multi-page printable view of this section. Click here to print.
调试Dapr应用和控制面板
1 - 在 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.1 - 在 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 集群中,首先卸载它:
dapr uninstall -k
我们将使用 ‘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 开始远程调试会话。
相关链接
1.2 - 在 Kubernetes 上调试 daprd
概述
有时我们需要了解 Dapr sidecar (daprd) 的运行情况,特别是在诊断 Dapr 应用程序时,怀疑 Dapr 本身是否存在问题。此外,您可能正在为 Kubernetes 上的 Dapr 开发新功能,并需要调试您的代码。
本指南介绍如何使用 Dapr 的内置调试功能来调试 Kubernetes pod 中的 Dapr sidecar。要了解如何查看日志和排查 Kubernetes 中的 Dapr 问题,请参阅配置和查看 Dapr 日志指南。
前提条件
初始化 Dapr 调试模式
如果 Dapr 已经安装在您的 Kubernetes 集群中,请先卸载它:
dapr uninstall -k
我们将使用 ‘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 pods
kubectl get events --n <namespace>
kubectl get events --sort-by=.metadata.creationTimestamp --n <namespace>
kubectl get services
检查日志:
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 问题的演示。
相关链接
2 - Bridge to Kubernetes 对 Dapr 服务的支持
Bridge to Kubernetes 允许您在开发计算机上运行和调试代码,同时保持与 Kubernetes 集群中其他应用程序或服务的连接。这种调试方式通常被称为本地隧道调试。
了解更多 Bridge to Kubernetes 信息调试 Dapr 应用程序
Bridge to Kubernetes 支持在您的计算机上调试 Dapr 应用程序,同时与 Kubernetes 集群中的服务和应用程序进行交互。以下示例展示了 Bridge to Kubernetes 如何帮助开发人员调试分布式计算器快速入门:
隔离模式
隔离模式 目前不支持 Dapr 应用程序。请确保启动 Bridge to Kubernetes 模式时不使用隔离模式。进一步阅读
3 - 在 Docker Compose 中调试 Dapr 应用
本文旨在介绍一种方法,如何通过你的 IDE 在本地调试一个或多个使用 Dapr 的应用,同时保持与其他通过 Docker Compose 部署的应用的集成。
我们以一个包含两个服务的 Docker Compose 文件的简单示例为例:
nodeapp
- 你的应用nodeapp-dapr
- 你的nodeapp
服务的 Dapr sidecar 进程
compose.yml
services:
nodeapp:
build: ./node
ports:
- "50001:50001"
networks:
- hello-dapr
nodeapp-dapr:
image: "daprio/daprd:edge"
command: [
"./daprd",
"--app-id", "nodeapp",
"--app-port", "3000",
"--resources-path", "./components"
]
volumes:
- "./components/:/components"
depends_on:
- nodeapp
network_mode: "service:nodeapp"
networks:
hello-dapr
当你使用 docker compose -f compose.yml up
运行这个 Docker 文件时,它将部署到 Docker 并正常运行。
但是,如何在保持与正在运行的 Dapr sidecar 进程以及其他通过 Docker Compose 文件部署的服务集成的情况下调试 nodeapp
呢?
我们可以通过引入一个名为 compose.debug.yml
的第二个 Docker Compose 文件来实现。当运行 up
命令时,这个第二个 Compose 文件将与第一个文件结合使用。
compose.debug.yml
services:
nodeapp: # 通过移除其端口并将其从网络中移除来隔离 nodeapp
ports: !reset []
networks: !reset
- ""
nodeapp-dapr:
command: ["./daprd",
"--app-id", "nodeapp",
"--app-port", "8080", # 这必须与在 IDE 中调试时应用暴露的端口匹配
"--resources-path", "./components",
"--app-channel-address", "host.docker.internal"] # 让 sidecar 在主机上查找应用通道
network_mode: !reset "" # 重置 network_mode...
networks: # ... 以便 sidecar 可以进入正常网络
- hello-dapr
ports:
- "3500:3500" # 将 HTTP 端口暴露给主机
- "50001:50001" # 将 GRPC 端口暴露给主机(Dapr 工作流依赖于 GRPC 通道)
接下来,确保你的 nodeapp
在你选择的 IDE 中运行/调试,并在你在 compose.debug.yml
中上面指定的相同端口上暴露 - 在上面的示例中,这设置为端口 8080
。
接下来,停止你可能已启动的任何现有 Compose 会话,并运行以下命令以组合运行两个 Docker Compose 文件:
docker compose -f compose.yml -f compose.debug.yml up
现在,你应该会发现 Dapr sidecar 和你的调试应用可以相互通信,就像它们在 Docker Compose 环境中正常一起运行一样。
注意:需要强调的是,Docker Compose 环境中的 nodeapp
服务实际上仍在运行,但它已从 Docker 网络中移除,因此实际上被孤立,因为没有任何东西可以与之通信。
演示:观看此视频,了解如何使用 Docker Compose 调试本地 Dapr 应用