Ошибка: getaddrinfo НЕ НАШЕЛ вход-nginx.вход-nginx-controller.svc.cluster.local

#nginx #next.js #kubectl #kubernetes-ingress

#nginx #next.js #kubectl #kubernetes-вход

Вопрос:

Я работаю с NextJS, и мне нужно, чтобы он знал, когда он отправляет запрос на сервер или в браузере. Чтобы сделать это на стороне сервера, потому что я создаю это внутри архитектуры микросервисов, мне нужно получить имя службы и пространство имен службы, чтобы заполнить URL-адрес следующим образом http://SERVICENAME.NAMESPACE.svc.cluster.local .

Итак, в моем терминале я распечатал все свои разные пространства имен следующим образом:

 $kubectl get namespace

NAME              STATUS   AGE
default           Active   9d
ingress-nginx     Active   9d
kube-node-lease   Active   9d
kube-public       Active   9d
kube-system       Active   9d
  

Это ingress-nginx то, что я ищу. Затем я запустил:

 $kubectl get services -n ingress-nginx

NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.100.129.149   localhost     80:30463/TCP,443:31399/TCP   9d
ingress-nginx-controller-admission   ClusterIP      10.111.40.184    <none>        443/TCP                      9d
  

Насколько я понимаю ingress-nginx-controller , это название моей службы.

Итак, я делаю запрос http://ingress-nginx.ingress-nginx-controller.svc.cluster.local/api/users/currentuser , но мне также пришлось указать хост следующим образом:

 LandingPage.getInitialProps = async () => {
  if (typeof window === "undefined") {
    const { data } = await axios.get(
      "http://ingress-nginx.ingress-nginx-controller.svc.cluster.local/api/users/currentuser",
      {
        headers: {
          Host: "ticketing.dev",
        },
      }
    );

    return data;
  } else {
    const { data } = await axios.get("/api/users/currentuser");

    return data;
  }
};
  

но когда я делаю запрос, я все еще получаю эту распечатку в браузере:

введите описание изображения здесь

Я вытащил kubectl журналы, и все 200 :

 192.168.65.3 - - [06/Nov/2020:01:30:15  0000] "GET /_next/static/chunks/pages/_app.js?ts=1604626215582 HTTP/2.0" 200 600778 "https://ticketing.dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" 51 0.131 [default-client-srv-3000] [] 10.1.0.244:3000 601240 0.132 200 406761022b9aad1a8cd45b9574f3082c
192.168.65.3 - - [06/Nov/2020:01:30:15  0000] "GET /_next/static/chunks/main.js?ts=1604626215582 HTTP/2.0" 200 1141017 "https://ticketing.dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" 46 0.259 [default-client-srv-3000] [] 10.1.0.244:3000 1141886 0.258 200 da2d882e400bebe57a8ce403acd55c8b
192.168.65.3 - - [06/Nov/2020:01:30:16  0000] "GET /_next/static/chunks/0.js HTTP/2.0" 200 1578 "https://ticketing.dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" 32 0.003 [default-client-srv-3000] [] 10.1.0.244:3000 1595 0.003 200 264ab274cf006691d92b1f03f05ffbca
192.168.65.3 - - [06/Nov/2020:01:30:27  0000] "GET /_next/webpack-hmr?page=/ HTTP/2.0" 200 1499 "https://ticketing.dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" 34 11.495 [default-client-srv-3000] [] 10.1.0.244:3000 1543 11.495 200 99420f1d80b74b84c0cb42ead9981d43
  

Чего мне не хватает? Я не думаю, что проблема в ingress-srv.yml файле:

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

Комментарии:

1. http://SERVICENAME.NAMESPACE.svc.cluster.local так и должно быть http://ingress-nginx-controller.ingress-nginx.svc.cluster.local . ? Верно ?

2. @ThanhNguyenVan, спасибо. Пожалуйста, продолжайте и опубликуйте свой ответ. Кстати, я обнаружил, что этот способ также работает: http://10-1-0-238.ingress-nginx.pod.cluster.local

3. вы должны получить доступ, используя имя службы, потому что оно будет использоваться для балансировки нагрузки, если балансировщик нагрузки существует.

4. @ThanhNguyenVan, хорошая мысль. Еще раз спасибо.

Ответ №1:

Основанный на URL-адресе доступа к сервису:

 http://SERVICENAME.NAMESPACE.svc.cluster.local 
  

так и должно быть

 http://ingress-nginx-controller.ingress-nginx.svc.cluster.local
  

Ответ №2:

С minikube иногда контроллер nginx не отображается.

 $ kubectl expose deployment ingress-nginx-controller --target-port=80 --type=NodePort -n kube-system
  

Комментарии:

1. Если вы используете minikube, у вас может возникнуть проблема с тем, что вы не предоставляете ingress-nginx-controller

Ответ №3:

Если ничего не работает, попробуйте использовать cluser-ip службы

 $ kubectl get services -n ingress-nginx

NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort       10.100.129.149   localhost     80:30463/TCP,443:31399/TCP   9d
ingress-nginx-controller-admission   ClusterIP      10.111.40.184    <none>        443/TCP                      9d
  

index.js

 const { data } = await axios.get(
      "http://10.100.129.149/api/users/currentuser",
      {
        headers: {
          Host: "ticketing.dev",
        },
      }
    );
  

или

   # This worked for me
  const { data } = await axios.get(
          "http://ingress-nginx-controller.ingress-nginx",
          {
            headers: {
              Host: "ticketing.dev",
            },
          }
        );



export default Landing;
  

И продолжайте учебник