Входные объекты Kubernetes не возвращают ответа в мини-кубе Windows 10

#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:

http://boot.aaa.com/path

Приведенный выше 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