【问题标题】:Ingress controller NodePort not reachable from outside入口控制器 NodePort 无法从外部访问
【发布时间】:2020-02-20 18:03:33
【问题描述】:

我有一个 3 个 vm 的集群,我在上面安装了 kubernetes 并部署了一些我希望从外部访问的 pod 和服务(例如我的本地电脑)

我按照本教程https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal 安装了我的入口控制器。 我创建了一个 NodePort 类型的服务。 我创建了一个如下所示的入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
      kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: my.service.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 9090

kubectl get svc myservice 给我:

NAME        TYPE       CLUSTER-IP        EXTERNAL-IP   PORT(S)          AGE
myservice   NodePort   xxx.xxx.xxx.xxx   <none>        9090:31220/TCP   47m

kubectl get ingress test-ingress给我

NAME            HOSTS            ADDRESS          PORTS   AGE
test-ingress    my.service.com   xx.xxx.xxx.xxx   80      49m

在我的本地计算机上,我已添加到 /etc/hosts 我已将入口的 IP 地址映射到名称 my.service.com 当我尝试 ping my.service.com 或直接 ip 我去请求超时 100% 丢包。 我尝试使用网络浏览器访问我的服务可视化界面,但它也不起作用。

如何进一步调查为什么我无法从集群外部访问我的服务?

【问题讨论】:

  • 你能打NodeIP:NodePort吗?
  • 是的,我可以点击 NodeIP:NodePort,但不能使用我在入口文件中提供的名称。
  • 我猜它很可能是防火墙问题。检查您的防火墙设置

标签: kubernetes kubernetes-ingress


【解决方案1】:

您的防火墙可能存在问题。检查防火墙规则是否阻止从外部访问该端口。

您还应该在部署入口控制器时从您创建的服务的 NodePort 访问该服务。

同时编辑您的入口并添加带有my.service.com 的自签名证书的 tls 和 hosts 属性

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
      ingress.kubernetes.io/rewrite-target: /
      kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - my.service.com
    secretName: tls-secret-for my service
  rules:
  - host: my.service.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myservice
          servicePort: 9090

【讨论】:

  • 所有节点上的防火墙都已停用。我将尝试使用 tls 和 hosts 属性,谢谢您的示例。
  • 当然也可以使用kubectl create secret generic &lt;name&gt; --from-file=tls.crt=&lt;path to .crt file&gt; --from-file=tls.key=&lt;path to .key file&gt; -n &lt;namespace&gt; 创建 tls 机密。以防万一你需要知道秘密的结构。
  • 嘿@jerome 问题出在哪里?让我们知道,以便未来的访问者可以轻松获得它。
  • 不,这不是证书。我仍然无法从 my.service.com 上的浏览​​器访问它
  • 从浏览器访问时 nginx 显示任何错误还是只是超时?
【解决方案2】:

无法ping Kubernetes 服务 IP。

服务的 IP 是虚拟 IP,因此它们不可 ping。
要测试您的入口,您应该尝试使用 curl 访问您的服务。

【讨论】:

    【解决方案3】:

    您应该能够使用设置为 www.my.service.com 的主机标头进行 curl

    curl --verbose --header 'Host: www.my.service.com' http://nodeip:nodeport/
    

    【讨论】:

    • 确实 curl 有效。现在如何使用 my.service.com 从浏览器访问它
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 2020-03-19
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2018-03-21
    • 2013-12-22
    相关资源
    最近更新 更多