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
Несмотря на то, что класс входа установлен по умолчанию:
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