我在Ubuntu 18.04上的minikube中使用Kubernetes,并启用了ingress插件。我希望我的NextJS服务通过ingress控制器发出请求,与通过ingress服务器连接的Express服务通信。因此,当我使用跨命名空间通信时,它不会像教程中所示的那样工作。由于minikube中的ingress nginx运行在kube系统命名空间上。
$ kubectl get service -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller-admission ClusterIP 10.103.20.47 none 443/TCP 15d
kube-dns ClusterIP 10.96.0.10 none 53/UDP,53/TCP,9153/TCP 36d
我正在运行的服务
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
exp-mongo-srv ClusterIP 10.103.255.125 <none> 27017/TCP 42s
exp-srv ClusterIP 10.103.118.45 <none> 3000/TCP 42s
next-srv ClusterIP 10.108.158.184 <none> 3000/TCP 39s
所需的请求url为:http://ingress-nginx.ingress-nginx.svc.cluster.local(通过nginx进行通信(
但我必须通过http://exp-srv:3000
(服务之间的直接通信(
这么简单
您添加了错误的命名空间名称
而不是
http://ingress-nginx.ingress-nginx.svc.cluster.local
应该是
http://ingress-nginx.kube-system.svc.cluster.local
如果你想用它作为主机并想解决它
如果您使用大使到任何其他API网关的服务位于另一个名称空间,它总是建议使用:
Use : <service name>
Use : <service.name>.<namespace name>
Not : <service.name>.<namespace name>.svc.cluster.local
它将类似于:servicename.namespacename.svc.cluster.local
这将向您提到的名称空间内的特定服务发送请求。
示例:
kind: Service
apiVersion: v1
metadata:
name: service
spec:
type: ExternalName
externalName: <servicename>.<namespace>.svc.cluster.local
这里用适当的值替换<servicename>
和<namespace>
。
在Kubernetes中,名称空间用于创建虚拟环境,但所有名称空间都是相互连接的。
刚刚偶然发现了这个。我认为默认情况下,作为ClusterIP的服务ingress-nginx-controller-admission
只有443,它是HTTPS端口公开的,因此它无法解决它。要解决这个问题,你需要做的是公开一个新的ClusterIP服务。
kubectl暴露部署入口nginx控制器--目标端口=80--类型=ClusterIP-n kube系统