1 - 在 Kubernetes 环境中调试 Dapr

如何在 Kubernetes 集群中调试 Dapr

在 Kubernetes 集群中调试 Dapr 是确保应用程序正常运行的关键。通过调试,开发者可以识别并解决 Dapr 组件之间的通信问题、actor 的状态管理问题,以及其他与 Dapr 集成相关的挑战。

在开始调试之前,请确保您的 Kubernetes 集群已正确配置,并且 Dapr 已成功部署。您可以使用以下命令检查 Dapr 的状态:

```bash
kubectl get pods -n dapr-system

这将列出所有正在运行的 Dapr 组件的 pod。确保所有 pod 都处于 Running 状态。

常见调试步骤

  1. 检查 Dapr sidecar 日志:Dapr sidecar 是每个应用程序 pod 中的重要组件。通过查看 sidecar 的日志,您可以获取有关服务调用、发布订阅、绑定等的详细信息。

    kubectl logs <pod-name> daprd
    
  2. 验证配置和密钥:确保您的 Dapr 配置和 Kubernetes 密钥正确无误。错误的配置可能导致服务无法正常工作。

  3. 测试服务调用:使用 Dapr CLI 工具测试服务调用,以确保服务之间的通信正常。

    dapr invoke --app-id <app-id> --method <method-name>
    
  4. 监控状态存储:检查 actor 的状态存储,确保数据持久化和检索正常。

通过这些步骤,您可以有效地调试和优化 Dapr 在 Kubernetes 集群中的运行

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 调试二进制文件

如果 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

然后进入本指南开头从 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 sidecar (daprd)

概述

有时我们需要了解 Dapr sidecar (daprd) 的运行情况,特别是在诊断 Dapr 应用程序时,怀疑 Dapr 本身是否存在问题。此外,您可能正在为 Kubernetes 上的 Dapr 开发新功能,并需要调试您的代码。

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

前提条件

  • 请参阅本指南了解如何将 Dapr 部署到您的 Kubernetes 集群。
  • 按照本指南构建您将在下一步中部署的 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 服务的支持

在本地调试 Dapr 应用程序,同时保持与 Kubernetes 集群的连接

Bridge to Kubernetes 允许您在开发计算机上运行和调试代码,同时保持与 Kubernetes 集群中其他应用程序或服务的连接。这种调试方式通常被称为本地隧道调试

了解更多 Bridge to Kubernetes 信息

调试 Dapr 应用程序

Bridge to Kubernetes 支持在您的计算机上调试 Dapr 应用程序,同时与 Kubernetes 集群中的服务和应用程序进行交互。以下示例展示了 Bridge to Kubernetes 如何帮助开发人员调试分布式计算器快速入门

进一步阅读

3 - 在 Docker Compose 中调试 Dapr 应用

本地调试作为 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 应用