This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

调试 Dapr 应用程序和 Dapr 控制平面

关于如何调试 Dapr 应用程序和 Dapr 控制平面的指南

1 - 在 Kubernetes 模式下调试 Dapr

如何在您的 Kubernetes 集群上调试 Dapr

1.1 - 在 Kubernetes 上调试 Dapr 控制平面

如何在 Kubernetes 集群上调试 Dapr 控制平面

概述

有时有必要了解 Dapr 控制平面(即 Kubernetes 服务)内部发生了什么,包括 dapr-sidecar-injectordapr-operatordapr-placementdapr-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 调试二进制文件

如果 Kubernetes 集群中已经安装了 Dapr,请先卸载:

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

然后进入本指南开始时从 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

如何在你的 Kubernetes 集群上调试 Dapr 边车(daprd)

概述

有时需要了解 Dapr 边车(daprd)的运行状态,它作为边车运行在你的应用旁边,尤其是在诊断 Dapr 应用并怀疑 Dapr 本身存在问题时。此外,你可能正在为 Kubernetes 上的 Dapr 开发新功能,并希望调试你的代码。

本指南介绍如何在 Kubernetes Pod 中使用内置的 Dapr 调试功能来调试 Dapr 边车。要了解如何在 Kubernetes 中查看日志和排查 Dapr 问题,请参阅配置和查看 Dapr 日志指南

前置条件

  • 参考本指南了解如何将 Dapr 部署到你的 Kubernetes 集群。
  • 按照本指南构建你将在下一步部署的 Dapr 调试二进制文件。

以调试模式初始化 Dapr

如果 Dapr 已经安装在你的 Kubernetes 集群中,请先卸载它:

dapr uninstall -k

我们将使用 ‘helm’ 来安装 Dapr 调试二进制文件。更多信息请参考使用 Helm 安装

首先配置一个名为 values.yml 的 values 文件,包含以下选项:

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 边车。你还可以使用注解 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 命令

在 Kubernetes 上调试 daprd 和应用时使用以下常用 kubectl 命令。

获取所有 pods、事件和服务:

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 Community Call #36 中关于在 Kubernetes 上排查 Dapr 问题的演示。

相关链接

2 - 调试在 Docker Compose 中运行的 Dapr 应用

在本地调试属于 Docker Compose 部署一部分的 Dapr 应用

本文的目标是演示一种方法,在保持与 docker compose 环境中部署的其他应用程序集成的同时,调试一个或多个 daprized 应用程序(通过你的 IDE,在本地)。

让我们来看一个 docker compose 文件的最小示例,它只包含两个服务:

  • nodeapp - 你的应用程序
  • nodeapp-dapr - 你的 nodeapp 服务的 dapr 边车进程

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 边车进程集成的同时调试 nodeapp,以及通过 Docker compose 文件部署的其他任何内容呢?

让我们首先引入一个名为 compose.debug.yml第二个 docker compose 文件。当运行 up 命令时,这第二个 compose 文件将与第一个 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"] # 使边车在主机上查找 App Channel
    network_mode: !reset "" # 重置 network_mode...
    networks: # ...以便边车可以进入正常网络
      - hello-dapr
    ports:
      - "3500:3500" # 将 HTTP 端口暴露给主机
      - "50001:50001" # 将 GRPC 端口暴露给主机(Dapr Workflows 依赖于 GRPC 通道)

接下来,确保你的 nodeapp 在你选择的 IDE 中运行/调试,并在你在上面的 compose.debug.yml 中指定的同一端口上暴露 - 在上面的示例中,这设置为端口 8080

接下来,停止你可能已启动的任何现有 compose 会话,并运行以下命令来将两个 docker compose 文件组合运行:

docker compose -f compose.yml -f compose.debug.yml up

现在你应该发现,dapr 边车和你的调试应用程序将具有双向通信,就像它们在 Docker compose 环境中正常运行一样。

注意:需要强调的是,docker compose 环境中的 nodeapp 服务实际上仍在运行,但它已从 docker 网络中移除,因此实际上已被孤立,没有任何东西可以与之通信。

演示:观看此视频,了解如何使用 Docker Compose 调试本地 Dapr 应用