在Kubernetes上调试daprd

如何在你的 Kubernetes 集群中调试 Dapr sidecar(daprd)

概述

有时有必要了解 Dapr sidecar(daprd) 中发生了什么,它作为 sidecar 运行在您的应用程序旁边,尤其是当您诊断您的 Dapr 应用程序并想知道 Dapr 本身是否出了问题时。 此外,你可能正在为 Kubernetes 中的 Dapr 开发一个新功能,并且想调试你的代码。

这份指南将展示如何使用内置的 Dapr 调试功能来调试 Kubernetes pods 中的 Dapr sidecar。 要了解如何在 Kubernetes 中查看日志和排查 Dapr 问题,请参阅 配置和查看 Dapr 日志指南

先决条件

在调试模式下初始化 Dapr

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

dapr uninstall -k

我们将使用 “helm” 来安装 Dapr 调试二进制文件。 有关更多信息,请参阅使用Helm安装

首先配置名为 values.yml 的文件,使用这些选项:

global:
   registry: docker.io/<your docker.io id>
   tag: "dev-linux-amd64"

然后进入到 ‘dapr’ 目录中,如果你没有这个目录,请参照本指南开始的说明,从 GithHub 中克隆下来。然后执行下面的命令:

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

全部完成。 现在您可以从您喜欢的 IDE 中指向端口40000,并开始对 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 Community Call #36中查看有关在Kubernetes上排除故障Dapr的演示。

相关链接