首页 > 解决方案 > EKS LoadBalancer 服务未从 EKS 外部返回响应

问题描述

我有一个带有 VPC 的 EKS 集群,其中包含几个 pod 和服务一个 pod 连接到使用LoadBalancer类型定义的服务。负载均衡器是内部的(在 PVC 上运行)

部署 pod 和服务后,我遇到了奇怪的问题:

部署完成后,我运行“kubectl get svc”并复制外部 IP,IP 看起来像这样:

internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com

我测试了我的笔记本电脑(连接到 VPC)的连接并运行以下命令

telnet internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com 8081

并得到以下回复

Trying 10.0.0.1 (some internal IP)...
Connected to internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com

所以结果基本上说我可以访问服务后面的 pod,但是当我运行 WGET 命令时,我得到了以下结果

--2020-10-05 13:55:14--  http://internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com:8081/
Resolving internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com (internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com)... 10.0.0.1, 10.0.0.2
Connecting to internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com (internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com)|10.0.0.1|:8081... connected.
HTTP request sent, awaiting response... Read error (Operation timed out) in headers.
Retrying.

但是当我在 EKS 上运行的其他 pod 中运行相同的 WGET 命令时,我得到了有效的响应(下载了 index.html 文件)

因此,似乎只能从 EKS 中的其他 pod 访问该 pod,但不能从 EKS 外部访问该 pod(尽管存在与该服务的连接)

任何人也遇到同样的问题并可以提供帮助吗?这是我的 pod 和服务描述输出:

服务:

Name:                     service
Namespace:                default
Labels:                   app.kubernetes.io/managed-by=Helm
Annotations:              meta.helm.sh/release-name: help_repo
                          meta.helm.sh/release-namespace: default
                          service.beta.kubernetes.io/aws-load-balancer-internal: true
Selector:                 app=test-app
Type:                     LoadBalancer
IP:                       172.X.X.X
LoadBalancer Ingress:     internal-XXXXXXXXXXXXXXXXXXXXX.<region>.elb.amazonaws.com
Port:                     rpc  6123/TCP
TargetPort:               6123/TCP
NodePort:                 rpc  32648/TCP
Endpoints:                **<same-pod-ip>**:6123
Port:                     blob  6124/TCP
TargetPort:               6124/TCP
NodePort:                 blob  31041/TCP
Endpoints:                **<same-pod-ip>**:6124
Port:                     ui  8081/TCP
TargetPort:               8081/TCP
NodePort:                 ui  30608/TCP
Endpoints:                **<same-pod-ip>**:8081
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

荚:

Name:         test-app-ff8c566c7-rfkrh
Namespace:    default
Priority:     0
Node:         <node ip>
Start Time:   Mon, 05 Oct 2020 13:42:19 +0300
Labels:       app=test-app
              pod-template-hash=ff8c566c7
Annotations:  kubernetes.io/psp: eks.privileged
Status:       Running
IP:           **<same-pod ip>**
IPs:
  IP:           **<same-pod ip>**
Controlled By:  ReplicaSet/test-app-ff8c566c7
Containers:
  test-app:
    Container ID:  docker://XXXXXXXXX
    Image:         ECR_URL

    Ports:         6123/TCP, 6124/TCP, 8081/TCP
    Host Ports:    0/TCP, 0/TCP, 0/TCP
    Args: <run app command>
    State:          Running
      Started:      Mon, 05 Oct 2020 13:42:33 +0300
    Ready:          True
    Restart Count:  0
    Liveness:       tcp-socket :6123 delay=30s timeout=1s period=60s #success=1 #failure=3
    Environment:    <none>
    

谢谢!

标签: kuberneteskubernetes-podamazon-eksaws-load-balancer

解决方案


您可以使用Ingress,根据定义,这是集群的入口。在 EKS 中,您应该使用一个名为“alb”的入口控制器,意思是“应用程序负载均衡器”。您可以使用的入口如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: <your-ingress-name>
  annotations:
    kubernetes.io/ingress.class: alb
    # required to use ClusterIP
    alb.ingress.kubernetes.io/target-type: ip
    # required to place on public-subnet
    alb.ingress.kubernetes.io/scheme: internet-facing
    # use TLS registered to our domain, ALB will terminate the certificate
    alb.ingress.kubernetes.io/certificate-arn: <acm-certificate-arn>
    # respond to both ports
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    # redirect to port 80 to port 443
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
  rules:
  - host: <your.host.com>
    http:
      paths:
      - backend:
          serviceName: <your-service-name> # this should be a ClusterIp service
          servicePort: <yout-service-port>
        path: /

重要提示:这将在您的 aws 账户中配置 Application Load Balancer

之后,您可以将主机名流量重定向到应用程序负载均衡器。如果您使用的是 Route53,您可以按照本教程进行操作。


推荐阅读