#kubernetes #kubernetes-ingress #nginx-ingress
Вопрос:
Я пытаюсь протестировать вход Kubernetes на Minikube. Моя ОС — Windows 10. Minikube установлен успешно, как и входной контроллер Nginx.
> minikube addons enable ingress
Ниже приведен мой файл манифеста Kubernetes:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/default-backend: app-nginx-svc
spec:
rules:
- host: boot.aaa.com
http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: app-nginx-svc
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: app-nginx-svc
namespace: ingress-nginx
spec:
type: NodePort
selector:
app: test-nginx
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30000
---
apiVersion: v1
kind: Pod
metadata:
name: app-nginx
namespace: ingress-nginx
labels:
app: test-nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
Модуль и служба Kubernetes создаются в мини-кубе без ошибок. Когда я тестирую службу с помощью приведенных ниже команд, модуль показывает правильные значения.
> minikube service -n ingress-nginx app-nginx-svc --url
* app-nginx-svc 서비스의 터널을 시작하는 중
|--------------------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|--------------------|---------------|-------------|------------------------|
| ingress-nginx | app-nginx-svc | | http://127.0.0.1:63623 |
|-------------------|---------------|-------------|------------------------|
http://127.0.0.1:63623
Но проблема возникает во входном объекте. Входящий мини-куб генерирует конечную точку и домен хоста.
Я ввожу имя хоста сопоставления домена в файле хоста Windows 10
192.168.49.2 boot.aaa.com
Но я не могу получить никакого ответа от контейнера Nginx:
Приведенный выше URL-адрес вообще не работает.
Ответ №1:
При попытке доступа http://boot.aaa.com/path — предоставляете ли вы порт, на котором он прослушивается? Из того, что я вижу на выходе:
minikube service -n ingress-nginx app-nginx-svc --url
* app-nginx-svc 서비스의 터널을 시작하는 중
|--------------------|---------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|--------------------|---------------|-------------|------------------------|
| ingress-nginx | app-nginx-svc | | http://127.0.0.1:63623 |
|--------------------|---------------|-------------|------------------------|
==> http://127.0.0.1:63623 <==
Я думаю, что вам нужно сделать запрос на: http://boot.aaa.com:63623/path
Если вы не хотите использовать имя хоста в своем входе, просто удалите его из манифеста.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-nginx
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: 'nginx'
nginx.ingress.kubernetes.io/default-backend: app-nginx-svc
spec:
rules:
- http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: app-nginx-svc
port:
number: 80
Тогда вы сможете получить доступ к своему pod только по http:// {IP}:{PORT}/path
Мои дополнительные вопросы:
- Вы пытаетесь сделать запрос из той же ОС, в которой установлен мини-куб?
- Редактируется ли файл hostfile в ОС, из которой вы отправляете запросы?
- Если да, включен ли брандмауэр Windows?
Кроме того, я вижу, что ваша служба предоставляет порт узла непосредственно вашему приложению на порту 30000 (он не будет проходить через контроллер входа).
Обычно, если мы настраиваем конечную точку входа в модуль, мы делаем это, чтобы избежать ее прямого доступа к порту узла. Для этого будет использоваться тип службы ClusterIP.
apiVersion: v1
kind: Service
metadata:
name: app-nginx-svc
namespace: ingress-nginx
spec:
type: ClusterIP
selector:
app: test-nginx
ports:
- name: http
port: 80
targetPort: 80