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

Return to the regular view of this page.

在 Kubernetes 模式下调试 Dapr

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

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 启动远程调试会话。

相关链接

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 问题的演示。

相关链接