问题描述
我在启用了入口插件的Ubuntu 18.04的minikube中使用Kubernetes。 我希望通过仅通过Ingress控制器发出请求,将NextJS服务与通过Ingress服务器连接的Express Service通信。因此,当我使用跨名称空间通信时,它将无法正常使用,如本教程所示。由于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
预期的请求网址为: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 公开部署 ingress-nginx-controller --target-port=80 --type=ClusterIP -n kube-system