kubernetes - 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>
谢谢!
解决方案
您可以使用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,您可以按照本教程进行操作。
推荐阅读
- c# - html 路由值未传递到 url/控制器
- r - 将数据类型因子转换为数据类型数值
- latex - 使用 LaTeX 文本渲染将 matplotlib 的 pdf 输出增加了 20 倍。有没有办法避免文件大小的增加?
- docker - 连续重试下载后 Docker pull 失败
- python - ubuntu wsl 上的 postgres 在 ::1 上运行,而不是在 localhost/127.0.0.1 上运行
- javascript - 使用等待时返回空?
- xml - XSLT 按条件对标记化的值进行分组
- algorithm - 无法创建具有正确结构的树
- javascript - 在这种情况下,find 和 findOne 有什么区别?为什么它不起作用?
- linux - 在 Travis-CI 中采购 .bashrc 不起作用