NGINX 入口控制器无法在 Amazon EKS 上运行

NGINX Ingress Controller not working on Amazon EKS

NGINX 入口控制器无法在 Amazon EKS 上运行

我使用 eksctl 在私有子网上创建了一个 Amazon EKS 集群。

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/

我使用 Deployment 而非 DaemonSet 安装了 Ingress Controller

我必须将以下注释添加到 loadbalancer-aws-elb.yaml 以创建负载均衡器:

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

Pods 和服务都是 运行:

# 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 主机 header.
仍然得到 404 Not Found。
与在没有主机 header.
的情况下调用时的响应相同 当我查看 nginx-ingress pod 日志时,我看到的是:

kubectl get pod -n nginx-ingress
kubectl logs -f --tail 20 $(kubectl get pod -n nginx-ingress | grep Running | awk '{print }') -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

即使入口 class 设置为默认值:

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

我仍然必须在我的应用程序入口中指定入口 class:

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