如何修复命名空间 [非默认命名空间] 中名称为 [spark-wordcount-driver] 的种类 [pod] 的操作 [get] 失败

hp2*_*326 5 docker apache-spark kubernetes kube-dns

我正在尝试在 Kubernetes 上的 Spark 中运行一个简单的 wordcount 应用程序。我遇到以下问题。

Caused by: io.fabric8.kubernetes.client.KubernetesClientException: Operation: [get]  for kind: [Pod]  with name: [spark-wordcount-1545506479587-driver]  in namespace: [non-default-namespace]  failed.
    at io.fabric8.kubernetes.client.KubernetesClientException.launderThrowable(KubernetesClientException.java:62)
    at io.fabric8.kubernetes.client.KubernetesClientException.launderThrowable(KubernetesClientException.java:71)
    at io.fabric8.kubernetes.client.dsl.base.BaseOperation.getMandatory(BaseOperation.java:228)
    at io.fabric8.kubernetes.client.dsl.base.BaseOperation.get(BaseOperation.java:184)
    at org.apache.spark.scheduler.cluster.k8s.ExecutorPodsAllocator$$anonfun$1.apply(ExecutorPodsAllocator.scala:57)
    at org.apache.spark.scheduler.cluster.k8s.ExecutorPodsAllocator$$anonfun$1.apply(ExecutorPodsAllocator.scala:55)
    at scala.Option.map(Option.scala:146)
    at org.apache.spark.scheduler.cluster.k8s.ExecutorPodsAllocator.<init>(ExecutorPodsAllocator.scala:55)
    at org.apache.spark.scheduler.cluster.k8s.KubernetesClusterManager.createSchedulerBackend(KubernetesClusterManager.scala:89)
    at org.apache.spark.SparkContext$.org$apache$spark$SparkContext$$createTaskScheduler(SparkContext.scala:2788)
    ... 20 more
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
Run Code Online (Sandbox Code Playgroud)

我已按照RBAC 设置中提到的所有步骤进行操作。我唯一不能做的是我无法创建集群绑定 spark-role,因为我无权访问默认命名空间。相反,我创建了角色绑定。

kubectl create rolebinding spark-role --clusterrole=edit --serviceaccount=non-default-namespace:spark --namespace=non-default-namespace
Run Code Online (Sandbox Code Playgroud)

我正在使用以下 spark-submit 命令。

spark-submit \
 --verbose \
 --master k8s://<cluster-ip>:<port> \
 --deploy-mode cluster --supervise \
 --name spark-wordcount \
 --class WordCount \
 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark-test \
 --conf spark.kubernetes.driver.limit.cores=1 \
 --conf spark.kubernetes.executor.limit.cores=1 \
 --conf spark.executor.instances=1 \
 --conf spark.kubernetes.container.image=<image> \
 --conf spark.kubernetes.namespace=non-default-namespace \
 --conf spark.kubernetes.driver.pod.name=spark-wordcount-driver \
 local:///opt/spark/work-dir/spark-k8s-1.0-SNAPSHOT.jar
Run Code Online (Sandbox Code Playgroud)

更新:我能够修复第一个 SockerTimeoutException 问题。我没有定义网络策略,因此驱动程序和执行程序无法相互交谈。这就是它超时的原因。我将网络策略从默认拒绝所有更改为允许所有入口和出口,超时异常消失了。但是,我仍然收到 Operation get for kind pod not found 错误,并带有以下异常。

Caused by: java.net.UnknownHostException: kubernetes.default.svc: Try again
Run Code Online (Sandbox Code Playgroud)

任何建议或帮助将不胜感激。

use*_*730 3

这是因为你的dns无法解析。kubernetes.default.svc。这可能是你的网络和 iptables 的问题。

在特定节点上运行它

kubectl run -it --rm --restart=Never --image=infoblox/dnstools:latest dnstools   
Run Code Online (Sandbox Code Playgroud)

并检查

nslookup  kubernetes.default.svc
Run Code Online (Sandbox Code Playgroud)

编辑:我遇到这个问题,因为在我的情况下,flannel 使用不同的网络(10.244.xx),任何我的 kubernetes 集群都配置了网络(172.xxx)

我盲目地从https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml运行默认的,其中 pod 网络配置为 10.244.xx 要修复它,我下载文件,更改它来纠正 pod 网络并应用它。