我正在部署一些 Flink 作业,这些作业需要访问通过 Linkerd 实现的服务网格下的某些服务。有时,我遇到这个错误:
java.lang.NoClassDefFoundError: Could not initialize class foo.bar.Job
这很奇怪,因为我有一些工作运行良好,但其他工作却出现此错误。我可以确认 jar 文件包含显然找不到的类,所以这不是 jar 本身的问题,但似乎与 Linkerd 有关。特别是,我对 jobmanager 和 taskmanager pod 使用了以下 pod 注释(取自我的 Helm Chart 值文件):
podAnnotations:
linkerd.io/inject: enabled
config.linkerd.io/skip-outbound-ports: 6123,6124
config.linkerd.io/proxy-await: enabled
值得一提的是,我正在使用 Ververica 平台(社区版)将我的工作部署到 Kubernetes,尽管我不认为这个问题是特定于 VVP 的:
{{- define "vvp.deployment" }}
kind: Deployment
apiVersion: v1
metadata:
name: my-job
spec:
template:
spec:
artifact:
kind: jar
flinkImageRegistry: {{ .Values.flink.imageRegistry }}
flinkVersion: "1.15.1"
flinkImageTag: 1.15.1-stream1-scala_2.12-java11-linkerd
entryClass: foo.bar.Job
kubernetes:
jobManagerPodTemplate:
metadata:
{{- with .Values.flink.podAnnotations }}
annotations:
{{- toYaml . | nindent 14 }}
{{- end }}
spec:
containers:
- name: flink-jobmanager
command:
- linkerd-entrypoint.sh
taskManagerPodTemplate:
metadata:
{{- with .Values.flink.podAnnotations }}
annotations:
{{- toYaml . | nindent 14 }}
{{- end }}
{{- end }}
其中
linkered-entrypoint.sh
的内容是:
#!/bin/bash
set -e
exec linkerd-await --shutdown -- "$@"
对于额外的上下文,VVP 和 flink 作业被部署到不同的命名空间中。此外,对于 VVP pod,我没有使用任何 linkerd 注释。
明确地说,如果我从 jobmanager/taskmanager pod 中删除注释/与 Linkerd 相关的所有内容,一切都会按预期进行。
有没有人遇到过类似的问题?我错过了什么吗?我还应该为 VVP pod 使用
linkerd.io/inject: enabled
注释吗?到目前为止,我找到的最接近的故障排除资源/指南是这个,它针对的是 Istio 而不是 Linkerd。