#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