【问题标题】:How does cross namespace communication works in minkubeminikube 中的跨命名空间通信是如何工作的
【发布时间】:2020-08-29 16:48:26
【问题描述】:

我在 Ubuntu 18.04 上的 minikube 中使用 Kubernetes,并启用了入口插件。 我希望我的 NextJS 服务通过仅通过入口控制器发出请求来与通过入口服务器连接的 Express 服务进行通信。因此,当我使用跨命名空间通信时,它不会像本教程中所示的那样工作。由于 minikube 中的 ingress-nginx 在 kube-system 命名空间上运行。

$ 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(这是服务之间的直接通信)

【问题讨论】:

    标签: microservices kubernetes-ingress minikube nginx-ingress kubernetes-service


    【解决方案1】:

    做起来很简单

    您添加了错误的命名空间名称

    而不是

    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
    

    这里将&lt;servicename&gt;&lt;namespace&gt; 替换为适当的值。

    在 Kubernetes 中,命名空间用于创建虚拟环境,但它们都是相互连接的。

    【讨论】:

    • ingress-nginx.kube-system.svc.cluster.local, ingress-nginx.kube-system 都给出了地址未找到。
    • 检查您的服务和控制器在哪里运行。在 kube-system 或 ingress-nnginx 命名空间内
    • 服务和命名空间如问题中所述。有 default 和 kube-system 命名空间,没有 ingress-nginx 命名空间。
    【解决方案2】:

    偶然发现了这个。我认为默认情况下,作为 ClusterIP 的服务 ingress-nginx-controller-admission 只有 443,它是暴露的 HTTPS 端口,因此它无法解决它。要解决这个问题,您需要做的是公开一个新的 clusterIP 服务。

    kubectl 暴露部署 ingress-nginx-controller --target-port=80 --type=ClusterIP -n kube-system

    【讨论】:

      猜你喜欢
      • 2021-03-05
      • 2021-11-10
      • 2021-02-02
      • 2017-05-01
      • 2015-09-10
      • 2021-10-16
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多