#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;
И продолжайте учебник