Входной контроллер NGINX не работает на Amazon EKS

#nginx-ingress #amazon-eks

#nginx-вход #amazon-eks

Вопрос:

Входной контроллер NGINX не работает на 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, используя следующие инструкции по установке: https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests /

Я установил входной контроллер, используя развертывание, а не набор демонов

Мне пришлось добавить следующую аннотацию к 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, который не найден.
Тот же ответ, что и при вызове без заголовка host.
Когда я смотрю на журналы модуля 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" "-"
 

Где еще я могу найти проблему?

Если я поменяю свою службу приложений на балансировщик нагрузки вместо использования ingress, это сработает.

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

Ответ №1:

Даже если класс входа установлен по умолчанию:

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

Мне все равно пришлось указать класс входа в моем приложении ingress:

 apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: apache-app
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
 

Ответ №2:

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

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