当前位置: 首页 > 知识库问答 >
问题:

NGINX入口控制器不在Amazon EKS上工作

郏志诚
2023-03-14

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入口控制器:https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/

我使用部署而不是DaemonSet安装了入口控制器

我不得不向loadbalancer aws elb添加以下注释。yaml为it创建负载平衡器:

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

POD和服务都在运行:

# 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没有找到,这是正确的。

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
与不带主机标头调用时的响应相同
当我查看nginx入口吊舱日志时,我看到的是:

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

共有2个答案

党星鹏
2023-03-14

如果我将apiVersion升级到apiVersion:networking.k8s.io/v1beta1,那么我不需要在应用程序入口中指定入口控制器。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: apache-app
  namespace: default
胡昊
2023-03-14

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

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"
 类似资料:
  • 具体来说,当我按照谷歌网站上的指示在GKE上设置nginx ingress时,为什么最终会有两个外部IP地址? 这两个IP地址用于LoadBalancer类型的入口资源和服务资源: 以下是我的想法: 这基本上就是我链接到的教程页面上的图表。因此,我希望负载平衡器是L4类型的,并且有一个外部IP(并且不需要花费任何金钱来使用!)。我希望入口(尽管其名称)没有外部IP,因为我用注释标记了它 谷歌应该承

  • 我正在AWS EKS上设置NGINX入口控制器。 我浏览了k8s入口资源,它非常有助于理解我们将LB端口映射到k8s服务端口,例如file Def。我安装了nginx控制器,直到必要的步骤。然后教程指示我创建一个入口资源。 我错过了什么?

  • 我不知道如何在Kubernetes集群(不是minikube)上设置入口控制器。我遵循的每一个nginx入口设置都产生了一个错误,控制器设置不正确。基本上,我想要一个与minikube插件等效的命令来启用入口。谢谢 编辑1- 我正在遵循中提到的安装步骤https://kubernetes.github.io/ingress-nginx/deploy/我已经尝试了baremetal、cloud和其他

  • 操作系统:RHEL7|k8s版本:1.12/13|kubes祈祷|裸机 我部署了一个标准的kubespray裸机集群,我正在尝试了解部署nginx ingress controller的最简单推荐方法是什么,它将允许我部署简单的服务。没有提供负载平衡器。我希望我的主公共IP作为我的服务的endpoint。 Github k8s ingress nginx建议将节点端口服务作为“强制”步骤,这似乎不

  • 我在RedHat EC2实例上安装了Minikube v1.3.1以进行一些测试。 由于nginx-ingress-控制器默认使用的端口已经在使用中,我正在尝试在部署中更改它们,但没有结果。有人能建议如何做吗? 如何知道端口已在使用? 当我使用命令kubectl-n kube system get deployment | grep nginx列出系统吊舱时,我得到: nginx入口控制器0/1

  • 我试图创建一个入口控制器,它指向我通过Nodeport公开的服务。 以下是入口控制器的yaml文件(摘自https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/):