无法从外部访问入口控制器 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
我有一个由 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