Kubernetes 无法访问Kubenetes负载平衡器
我正在尝试在AWS EKS群集中主持以下(部署前端)Kubernetes部署,部署部署并创建服务和入口后,所有内容都成功部署和创建,但当我尝试从外部访问负载平衡器DNS时,无法访问此负载平衡器。 有人能指出原因吗 **下面的代码(部署-2048)正在工作,可以访问负载平衡器,但在(部署前端)**的情况下无法访问Kubernetes 无法访问Kubenetes负载平衡器,kubernetes,kubernetes-ingress,amazon-eks,aws-load-balancer,Kubernetes,Kubernetes Ingress,Amazon Eks,Aws Load Balancer,我正在尝试在AWS EKS群集中主持以下(部署前端)Kubernetes部署,部署部署并创建服务和入口后,所有内容都成功部署和创建,但当我尝试从外部访问负载平衡器DNS时,无法访问此负载平衡器。 有人能指出原因吗 **下面的代码(部署-2048)正在工作,可以访问负载平衡器,但在(部署前端)**的情况下无法访问 containerPort设置为8080,service targetPort设置为80,在原始问题中(没有编辑和附加信息),在部署中,您的端口值配置错误 端口在群集中的指定端口
containerPort设置为8080,service targetPort设置为80,在原始问题中(没有编辑和附加信息),在部署中,您的端口值配置错误
- 端口在群集中的指定端口上公开Kubernetes服务。群集中的其他POD可以通过指定端口与此服务器通信
- TargetPort是服务将向其发送请求的端口,您的pod将监听该端口。容器中的应用程序也需要侦听此端口
- ContainerPort定义可在容器内访问应用程序的端口
容器端口
必须与服务中的目标端口
具有相同的值
User@herbertgoto有一个好主意,但不幸的是没有明确说明应该做什么。当您将containerPort
从8080
更改为80
时,它应该可以工作,但我猜在所有资源中重新填充此更改时会出现问题(重新创建入口资源,重新部署pod)
故障排除的第一步应该是检查您的容器是否正在侦听正确的端口。这就是我请求$netstat
输出的原因
要检查的有用命令是使用$kubectl get ep
检查服务端点
注意
如果您将跳过服务中的目标端口
,并且只有端口
,Kubernetes会根据端口
自动分配目标端口
值
当我只将containerPort和TargetPort设置为8080时。其他的都是80岁。为什么会这样
服务的默认端口为80
。因此,当您使用端口80创建服务
时,不需要指定任何其他内容。当您将服务中的端口设置为8080
时,您还需要指定它
我已经用端口8080
no myGKE
集群创建了服务
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.104.0.1 <none> 443/TCP 153m
my-nginx LoadBalancer 10.104.14.137 34.91.230.207 8080:31311/TCP 9m39s
$ curl 34.91.230.207
curl: (7) Failed to connect to 34.91.230.207 port 80: Connection timed out
$ curl 34.91.230.207:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
...
$kubectl获得svc
名称类型CLUSTER-IP外部IP端口年龄
kubernetes ClusterIP 10.104.0.1 443/TCP 153m
my nginx LoadBalancer 10.104.14.137 34.91.230.207 8080:31311/TCP 9m39s
$34.91.230.207
curl:(7)无法连接到34.91.230.207端口80:连接超时
$34.91.230.207:8080
欢迎来到nginx!
身体{
...
来自浏览器的响应:
仅外部性p
ExternalIP:8080
正如您所见,当我没有使用默认的80
端口时,我需要在浏览器中指定端口8080
,并使用curl命令
结论:
部署containerPort
和服务targetPort
必须具有相同的值。当您使用port
不同于80
的服务时,您需要通过添加:
来指定它。这就是为什么在internet上的几乎所有指南中,您都可以看到带有值80
的服务port
仍然是相同的问题。我将服务的端口从8080更改为8080,尝试使用类型:NodePort而不是类型:LoadBalancer。我尝试了NodePort,但它不起作用,所以我改为LB,所以它在一个端口中起作用,而不是在其他好主意中(向上投票)但是你应该详细说明你的答案,避免只提供一行答案。你想从集群内部访问LB
?还是你的意思是从外部?编辑-好的,我错过了从外部访问LB
。因此,通过从外部访问LB
,你必须首先将其暴露给外部世界。也许这将有助于在上面的注释中,检查从我之前评论的文档中创建负载平衡器服务。@Aristole感谢您的注释。请查看上述两个代码是否有任何差异,一个代码中的LB是可访问的,而另一个代码中没有。唯一的区别是选择器名称:/app.kubernetes.io/
从您的输出来看,它看起来像您的frontend在端口8080上公开。如果您将服务设置为targetPort:8080
并将部署containerPort:8080
。您没有任何奇怪的防火墙规则可以阻止80或8080?出于测试目的,您是否可以在2048alexwhen/docker-2048
的前端映像中使用?它可能与ImageThank相关你的解释给出了正确的方向。
---
apiVersion: v1
kind: Namespace
metadata:
name: game-2048
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: game-2048
name: deployment-2048
spec:
selector:
matchLabels:
app.kubernetes.io/name: app-2048
replicas: 5
template:
metadata:
labels:
app.kubernetes.io/name: app-2048
spec:
containers:
- image: alexwhen/docker-2048
imagePullPolicy: Always
name: app-2048
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
namespace: game-2048
name: service-2048
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: LoadBalancer
selector:
app.kubernetes.io/name: app-2048
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: game-2048
name: ingress-2048
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: service-2048
servicePort: 80
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.104.0.1 <none> 443/TCP 153m
my-nginx LoadBalancer 10.104.14.137 34.91.230.207 8080:31311/TCP 9m39s
$ curl 34.91.230.207
curl: (7) Failed to connect to 34.91.230.207 port 80: Connection timed out
$ curl 34.91.230.207:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
...