AWS Kubernetes 1.8启用Calico后Flink上传Jar至JobManager失败
解决Flink在Calico网络下Jar上传失败的问题
我来帮你搞定这个问题——之前我在类似的K8s+Calico环境里也碰到过一模一样的情况,核心原因基本是Calico的网络策略(NetworkPolicy)阻断了Flink客户端和JobManager之间的关键通信端口。毕竟Flannel默认不做网络策略限制,而Calico天生支持这个功能,换上去后很容易不小心拦住了Jar上传需要的流量。下面是具体的排查和解决步骤:
1. 先确认基础网络连通性
首先得搞清楚是不是真的是网络阻断导致的。你可以在提交Jar的客户端所在Pod(或者你用来提交任务的节点)上,测试一下能不能访问JobManager的几个关键端口:
- 执行命令测试REST端口(Jar上传会用到这个接口):
# 替换成你的JobManager服务名或者Pod IP curl -v http://<jobmanager-service>:8081/jars/upload - 再测试Blob服务器端口(Flink用来传输Jar包的核心端口,默认是6124):
telnet <jobmanager-service> 6124
如果这两个端口连接失败或者被拒绝,那基本可以确定是Calico的策略在拦着。
2. 检查现有Calico网络策略
接下来看看你的Flink所在Namespace有没有配置NetworkPolicy,这些策略可能限制了外部访问JobManager:
- 查看当前Namespace的所有NetworkPolicy:
kubectl get networkpolicy -n <你的Flink命名空间>
如果看到有Ingress规则限制了JobManager的端口访问,那就是它的问题了。
3. 添加允许Flink通信的NetworkPolicy
如果没有合适的策略,或者现有策略太严格,直接创建一个专门给Flink用的NetworkPolicy,放开必要的端口:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: flink-network-policy namespace: <你的Flink命名空间> spec: podSelector: matchLabels: app: flink # 替换成你的Flink Pod实际使用的标签 policyTypes: - Ingress - Egress ingress: - from: # 允许同命名空间内的Flink组件互相通信 - podSelector: matchLabels: app: flink # 如果你的客户端在其他命名空间,这里可以指定对应的命名空间标签 # - namespaceSelector: # matchLabels: # kubernetes.io/metadata.name: client-namespace ports: - protocol: TCP port: 6123 # Flink RPC端口 - protocol: TCP port: 8081 # Flink REST API端口 - protocol: TCP port: 6124 # Blob服务器端口(Jar上传核心端口) egress: - to: - podSelector: matchLabels: app: flink ports: - protocol: TCP port: 6121 # TaskManager数据端口 - protocol: TCP port: 6122 # TaskManager RPC端口 # 如果Flink需要访问外部资源(比如AWS S3),可以在这里添加对应的egress规则
创建这个策略后,再试试上传Jar,大概率就能成功了。
4. 额外排查点(如果上面的方法没用)
如果还是不行,那可能是其他配置问题:
- 检查Calico IP池:确保Calico使用的CIDR没有和AWS VPC的CIDR重叠,执行
calicoctl get ippools -o yaml查看,有重叠的话需要调整Calico的IP池配置。 - 检查Flink Blob服务器配置:登录JobManager Pod,查看
conf/flink-conf.yaml里的blob.server.address配置,确保它绑定的是JobManager的服务名或者可被外部访问的IP,而不是localhost或者127.0.0.1。
内容的提问来源于stack exchange,提问作者VinceMD
相关产品推荐
相关产品推荐

