使用Flink Kubernetes Operator部署Flink任务失败求助
解决Flink Kubernetes Operator部署启动错误问题
场景一错误根源与修复
错误原因
- FLINK_HOME路径配置错误:自定义
docker-entrypoint.sh中FLINK_HOME被设置为/opt/flink/bin,正确路径应为/opt/flink。这导致脚本无法正确定位Flink的启动脚本目录,进而找不到kubernetes-jobmanager.sh命令。 - 未适配Operator的启动命令:Flink Operator会传入
kubernetes-jobmanager.sh kubernetes-application这类K8s专属启动命令,但原脚本仅处理job-cluster/task-manager两种命令,无法直接执行传入的命令。
修复后的docker-entrypoint.sh
#!/bin/bash ### If unspecified, the hostname of the container is taken as the JobManager address FLINK_HOME=${FLINK_HOME:-"/opt/flink"} export PATH=$FLINK_HOME/bin:$PATH JOB_CLUSTER="job-cluster" TASK_MANAGER="task-manager" CMD="$1" shift; if [ "${CMD}" == "--help" -o "${CMD}" == "-h" ]; then echo "Usage: $(basename $0) (${JOB_CLUSTER}|${TASK_MANAGER})" exit 0 elif [ "${CMD}" == "${JOB_CLUSTER}" -o "${CMD}" == "${TASK_MANAGER}" ]; then echo "Starting the ${CMD}" if [ "${CMD}" == "${TASK_MANAGER}" ]; then exec $FLINK_HOME/bin/taskmanager.sh start-foreground "$@" else exec $FLINK_HOME/bin/standalone-job.sh start-foreground "$@" fi fi exec "$@"
场景二错误根源与修复
错误原因
- 自定义脚本缺少执行权限:Dockerfile中仅复制了
custom-docker-entrypoint.sh到容器,但未添加执行权限,导致容器启动时无法执行该脚本。 - Jar路径配置错误:原FlinkDeployment中
jarURI指向/home/gradle/app/lib/job.jar,但Dockerfile已将Jar复制到/opt/flink/lib/job.jar,路径不匹配会导致Job无法加载。
修复后的Dockerfile
FROM openjdk:11 AS job-build WORKDIR /home/gradle/app/ COPY build.gradle settings.gradle ./ COPY gradlew ./ COPY gradle gradle RUN echo "class Dummy {}" > Dummy.java RUN ./gradlew build COPY . . RUN rm Dummy.java RUN ./gradlew build RUN mv /home/gradle/app/build/libs/rrr-rule-calculation_v1*-deploy.jar /home/gradle/app/build/libs/rrr-rule-calculation_v1-deploy.jar FROM flink:1.17 COPY --from=job-build /home/gradle/app/build/libs/rrr-rule-calculation_v1-deploy.jar lib/job.jar COPY custom-docker-entrypoint.sh / # 添加脚本执行权限 RUN chmod +x /custom-docker-entrypoint.sh USER flink EXPOSE 8081 6123 ENTRYPOINT ["/custom-docker-entrypoint.sh"]
修复后的FlinkDeployment配置
apiVersion: flink.apache.org/v1beta1 kind: FlinkDeployment metadata: name: basic-example-w-file-path spec: image: flink-job-fraud-demo:latest flinkVersion: v1_17 flinkConfiguration: taskmanager.numberOfTaskSlots: "2" kubernetes.entry.path: "/custom-docker-entrypoint.sh" serviceAccount: flink jobManager: resource: memory: "2048m" cpu: 1 taskManager: resource: memory: "2048m" cpu: 1 job: jarURI: local:///opt/flink/lib/job.jar parallelism: 2 upgradeMode: stateless state: running
验证步骤
- 在Minikube环境下执行
eval $(minikube docker-env)切换到本地镜像环境 - 重新构建镜像:
docker build -t flink-job-fraud-demo:latest . - 重新部署:
kubectl apply -f <your-deployment-file.yaml> - 查看Pod状态与日志:
kubectl get pods kubectl logs -f <pod-name>
内容的提问来源于stack exchange,提问作者yokus
相关产品推荐
相关产品推荐

