无法从集群内访问入口服务

时间:2021-02-06 21:07:37

标签: kubernetes next.js kubernetes-helm minikube nginx-ingress

我是 kubernetes 的新手,我的 linux mint 20 上安装了 minikube。 我正在尝试使用 nextjs 实现服务器端渲染,我已经使用 helm 安装了 ingress-nginx。

ingess-service.yaml :

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: example.dev
      http:
        paths:
          - backend:
              serviceName: users-srv
              servicePort: 4000
            path: /api/users/?(.*)

          - backend:
              serviceName: ui-srv
              servicePort: 3000
            path: /?(.*)

在下一个 js 应用程序 ui 中,我想访问入口控制器以便从服务器端进行 api 调用。我试过了:

axios.get('http://ingress-nginx-controller-admission/api/users/currentuser')

axios.get('http://ingress-nginx-controller/api/users/currentuser')

axios.get('http://ingress-service/api/users/currentuser')

但没有任何效果。

kubctl 获取服务:

 NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE 
ingress-nginx-controller             LoadBalancer   10.107.45.123    172.42.42.100   80:31205/TCP,443:32568/TCP   80m 
ingress-nginx-controller-admission   ClusterIP      10.111.229.112   <none>          443/TCP                      80m 
kubernetes                           ClusterIP      10.96.0.1        <none>          443/TCP                6d1h 
ui-srv                               ClusterIP      10.99.20.51      <none>          3000/TCP                     89s 
users-mongo-srv                      ClusterIP      10.103.187.200   <none>          27017/TCP              89s 
users-srv                            ClusterIP      10.99.15.244     <none>          4000/TCP                     89s

谁能帮帮我? 提前致谢...

2 个答案:

答案 0 :(得分:1)

入口旨在处理到集群的外部流量,因此,它期望请求到达您指定的域(又名 example.dev)

要从 Pod 内部访问您的 API,您绝对应该直接使用 Ingress 提供的服务,例如 users-srvui-srv

如果你真的想联系入口而不是服务,你可以尝试一些事情:

  • 使 example.dev 指向 LoadBalancer IP 地址,例如将其添加到集群节点的 /etc/hosts 应该可以工作 8 甚至在 Pod 内部)。但请注意,这意味着当您可以使用服务名称访问服务时,需要通过很长的路径访问服务。

  • 从您的规则中删除主机参数,这意味着服务通常应在 nginx 控制器的 IP 地址处提供,这应该使使用 ingress-nginx-controller 按预期工作。并非所有 Ingress Controller 都支持此功能,但它可以工作。

答案 1 :(得分:0)

对于在浏览器中执行的代码

在您的笔记本电脑上运行:

echo "172.42.42.100 example.dev"  |  sudo tee -a /etc/hosts

对于在浏览器js中执行的js代码使用:

axios.get('http://example.dev/api/users/currentuser')

用于在 k8s 上的节点中执行的代码

在js中使用:

axios.get('http://users-srv.cluster.local/api/users/currentuser')