Kubernetes:没有通往主机的途径

时间:2018-10-03 04:43:40

标签: networking kubernetes kubernetes-service

我有一个裸机Kubernetes定制设置(手动使用Kubernetes困难方式设置集群)。一切似乎正常,但是我无法从外部访问服务。

我可以在curl时获得服务列表:

https://<ip-addr>/api/v1/namespaces/kube-system/services

但是,当我尝试代理时(使用kubectl proxy,也使用<master-ip-address>:<port>):

https://<ip-addr>/api/v1/namespaces/kube-system/services/toned-gecko-grafana:80/proxy/

我得到:

Error: 'dial tcp 10.44.0.16:3000: connect: no route to host'
Trying to reach: 'http://10.44.0.16:3000/'
  • 即使我正常卷曲http://10.44.0.16:3000/,我也会遇到相同的错误。这是我是否从安装Kubernetes的VM内部卷曲的结果。能够解决此问题,请在下面进行检查。

  • 我可以使用NodePort从外部访问我的服务。

  • 如果通过Nginx-Ingress公开我的服务,我就可以访问它们。

  • 我将Weave用作CNI,并且日志很正常,除了开头几行有关无法访问命名空间的日志行(RBAC错误)。尽管此后记录还可以。

  • 使用CoreDNS,日志看起来很正常。 APIServer和Kubelet日志看起来很正常。 Kubernetes-Events也看起来很正常。

  • 附加说明 :我分配的DNS服务IP是10.3.0.10,服务IP范围是:10.3.0.0/24, POD网络为10.2.0.0/16。我不确定10.44.x.x是什么或它来自哪里。

以下是其中一项服务的输出:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "kubernetes-dashboard",
    "namespace": "kube-system",
    "selfLink": "/api/v1/namespaces/kube-system/services/kubernetes-dashboard",
    "uid": "5c8bb34f-c6a2-11e8-84a7-00163cb4ceeb",
    "resourceVersion": "7054",
    "creationTimestamp": "2018-10-03T00:22:07Z",
    "labels": {
      "addonmanager.kubernetes.io/mode": "Reconcile",
      "k8s-app": "kubernetes-dashboard",
      "kubernetes.io/cluster-service": "true"
    },
    "annotations": {
      "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"annotations\":{},\"labels\":{\"addonmanager.kubernetes.io/mode\":\"Reconcile\",\"k8s-app\":\"kubernetes-dashboard\",\"kubernetes.io/cluster-service\":\"true\"},\"name\":\"kubernetes-dashboard\",\"namespace\":\"kube-system\"},\"spec\":{\"ports\":[{\"port\":443,\"targetPort\":8443}],\"selector\":{\"k8s-app\":\"kubernetes-dashboard\"}}}\n"
    }
  },
  "spec": {
    "ports": [
      {
        "protocol": "TCP",
        "port": 443,
        "targetPort": 8443,
        "nodePort": 30033
      }
    ],
    "selector": {
      "k8s-app": "kubernetes-dashboard"
    },
    "clusterIP": "10.3.0.30",
    "type": "NodePort",
    "sessionAffinity": "None",
    "externalTrafficPolicy": "Cluster"
  },
  "status": {
    "loadBalancer": {

    }
  }
}

我不确定如何调试此方法,即使某些指向正确方向的指针也会有所帮助。如果还有其他要求,请告诉我。


kubectl get svc的输出:

NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
coredns-primary        ClusterIP   10.3.0.10    <none>        53/UDP,53/TCP,9153/TCP   4h51m
kubernetes-dashboard   NodePort    10.3.0.30    <none>        443:30033/TCP            4h51m

编辑:

原来,尽管有CoreDNS运行,但由于某种原因我没有运行kube-dns服务。如此处所述:https://github.com/kubernetes/kubeadm/issues/1056#issuecomment-413235119

现在,我可以成功地从VM内部卷曲,但是代理访问仍然给我同样的错误:No route to host。我不确定为什么或如何解决此问题,因为我在这里看不到DNS,但它解决了该问题。也希望对此有任何可能的解释。

4 个答案:

答案 0 :(得分:1)

使用/etc/nginx/nginx.conf时,默认情况下,应使用kubectl proxy作为HTTP Kube API URL。然后,您对127.0.0.1:8001的请求将增加身份验证标头,并传递到API服务器。因此,您应该尝试使用http://127.0.0.1:8001而不是使用https和api ip

还要确保在kube节点上安装了socat。

答案 1 :(得分:1)

对我来说,解决方案是按照here

所述修改iptables中的规则
sudo iptables -D  INPUT -j REJECT --reject-with icmp-host-prohibited
sudo iptables -D  FORWARD -j REJECT --reject-with icmp-host-prohibited

答案 2 :(得分:0)

尝试运行curl https://<master-ip-address>:<port>

如果端口打开,您应该收到一条与证书或HTTPS相关的消息。

该端口已关闭(可能是您遇到的问题)-出现no route to host消息。

(!)不要禁用iptables。

通过SSH进入主节点并运行以下命令来打开端口:
A)sudo firewall-cmd --add-port=<relevant-port>/tcp --permanent(我假设已安装firewalld)。

B)sudo firewall-cmd --reload

C)sudo firewall-cmd --list-all-您应该看到<relevant-port>已更新。

public
  target: default
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: <relevant-port>/tcp <---- Here
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

答案 3 :(得分:-1)

我遇到了相同的问题,并通过运行以下命令解决了该问题:

iptables --flush<br>
iptables -tnat --flush<br>
systemctl stop firewalld<br>
systemctl disable firewalld<br>
systemctl restart docker<br>