无法从外部访问入口控制器 NodePort

Ingress controller NodePort not reachable from outside

我有一个由 3 个虚拟机组成的集群,我在上面安装了 kubernetes 并部署了一些 pods 和我希望可以从外部访问的服务(例如我的本地电脑)

我按照本教程 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% 数据包丢失。 我试图通过网络浏览器访问我的服务可视化界面,但它也不起作用。

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

无法ping Kubernetes 服务 IP。

服务的 IP 是虚拟 IP,因此无法 ping 通。
要测试您的入口,您应该尝试使用 curl 访问您的服务。

您应该能够将主机 header 设置为 www.my.service.com

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

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

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

同时编辑您的入口并添加 tls 和主机 属性 以及 my.service.com

的自签名证书
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