NGINX Ingress Controller не работает на Amazon EKS

NGINX Ingress Controller не работает на Amazon EKS

Я создал кластер Amazon EKS в частной подсети с помощью eksctl.

eksctl create cluster \
--name eks101 \
--version 1.18 \
--region af-south-1 \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--nodes-min 1 \
--nodes-max 4 --managed \
--vpc-private-subnets=subnet-123,subnet-456,subnet-789 \
--node-private-networking

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

aws ec2 create-tags \
    --resources subnet-123 subnet-456 subnet-789 \
    --tags Key=kubernetes.io/cluster/eks101,Value=owned   Key=kubernetes.io/role/elb,Value=1 

Затем я установил NGINX Ingress Controller, следуя этим инструкциям по установке: https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/

Я установил Ingress Controller, используя Deployment, а не DaemonSet.

Мне пришлось добавить следующую аннотацию в loadbalancer-aws-elb.yaml, чтобы создать балансировщик нагрузки:

service.beta.kubernetes.io/aws-load-balancer-internal: "true"

Все поды и сервисы работают:

# kubectl get pod -n nginx-ingress
NAME                             READY   STATUS    RESTARTS   AGE
nginx-ingress-576565b59c-s9c6b   1/1     Running   0          3h15m

# kubectl get service -n nginx-ingress
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP                                                                        PORT(S)                      AGE
nginx-ingress   LoadBalancer   172.20.44.89   internal-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-123456789.af-south-1.elb.amazonaws.com   80:30694/TCP,443:31260/TCP   33s

Когда я подключаюсь к балансировщику нагрузки, я получаю ошибку 404 Not Found, что правильно.

curl -k http://internal-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-123456789.af-south-1.elb.amazonaws.com/

Затем я установил пример приложения

kubectl apply -f apache-app.yaml

# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
apache-app-84f76964b5-9c4wc   1/1     Running   0          114s
apache-app-84f76964b5-xvmzx   1/1     Running   0          114s

# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
apache-app   ClusterIP   172.20.243.80   <none>        80/TCP    24s

# kubectl get ing
NAME         CLASS    HOSTS                 ADDRESS   PORTS   AGE
apache-app   <none>   apache.mydomain.com             80      39s

curl -k -H "Host: apache.mydomain.com" http://internal-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-123456789.af-south-1.elb.amazonaws.com/

Это не маршрутизация к приложению.
Даже когда я добавляю заголовок хоста apache.mydomain.com. Все равно получите 404 Not Found.
Тот же ответ, что и при вызове без заголовка хоста. Когда я смотрю на журналы модуля nginx-ingress, все, что я вижу, это:

kubectl get pod -n nginx-ingress
kubectl logs -f --tail 20 $(kubectl get pod -n nginx-ingress | grep Running | awk '{print $1}') -n nginx-ingress

10.249.225.11 - - [14/Dec/2020:11:53:41 +0000] "GET / HTTP/1.1" 404 153 "-" "curl/7.58.0" "-"
10.249.225.11 - - [14/Dec/2020:11:54:31 +0000] "GET / HTTP/1.1" 404 153 "-" "curl/7.58.0" "-"
10.249.225.11 - - [14/Dec/2020:11:58:03 +0000] "GET / HTTP/1.1" 404 153 "-" "curl/7.58.0" "-"
10.249.225.11 - - [14/Dec/2020:12:01:08 +0000] "GET / HTTP/1.1" 404 153 "-" "curl/7.58.0" "-"
10.249.225.11 - - [14/Dec/2020:12:01:11 +0000] "GET / HTTP/1.1" 404 153 "-" "curl/7.58.0" "-"
10.249.225.11 - - [14/Dec/2020:12:01:16 +0000] "GET / HTTP/1.1" 404 153 "-" "curl/7.58.0" "-"

Где еще искать проблему?

Если я изменю свою службу приложений на LoadBalancer вместо использования входа, это сработает.

---
apiVersion: v1
kind: Service
metadata:
  name: apache-app
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
  labels:
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: apache-app
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Несмотря на то, что класс входа установлен по умолчанию:

apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: nginx.org/ingress-controller

Мне все еще нужно было указать класс входа в моем входе приложения:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: apache-app
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
Ответ принят как подходящий

Если я обновлю apiVersion до apiVersion: networking.k8s.io/v1beta1, мне не нужно будет указывать входной контроллер в входе моего приложения.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: apache-app
  namespace: default

Другие вопросы по теме