Kubernetes 可以从集群外部访问服务,但不能从集群内部访问
我被困在一个让我相当困惑的问题上。我有两个Kubernetes服务,我们称它们为Kubernetes 可以从集群外部访问服务,但不能从集群内部访问,kubernetes,port,Kubernetes,Port,我被困在一个让我相当困惑的问题上。我有两个Kubernetes服务,我们称它们为frontend和middleware,它们执行以下操作: frontend服务于一个网站,并位于入口控制器后面,入口控制器将其暴露在端口80上 中间件接受来自前端的REST请求,并将请求的信息(从后台数据库)传回 我的问题如下: 如果我在Kubernetes群集上运行中间件,并将其作为负载平衡器公开,然后在本地运行前端(配置为连接到负载平衡器的外部IP),则一切正常。但是,如果我在Kubernetes群集上运行fr
frontend
和middleware
,它们执行以下操作:
frontend
服务于一个网站,并位于入口控制器后面,入口控制器将其暴露在端口80上
中间件
接受来自前端
的REST请求,并将请求的信息(从后台数据库)传回
我的问题如下:
如果我在Kubernetes群集上运行中间件
,并将其作为负载平衡器公开,然后在本地运行前端
(配置为连接到负载平衡器的外部IP),则一切正常。但是,如果我在Kubernetes群集上运行frontend
(无论配置为连接到负载平衡器的外部IP,还是使用内部IP),而不是本地运行,我可以连接到前端,但前端无法从中间件
获取数据,即无法连接到它
我有点不明白为什么会这样。在这两种情况下,中间件
的配置完全相同,我看不出前端
的配置会如何影响它
如果您能告诉我配置中可能出现的问题,我将不胜感激
以下是相关的YAML文件:
# middleware
apiVersion: apps/v1
kind: Deployment
metadata:
name: middleware
labels:
app: middleware
spec:
replicas: 1
selector:
matchLabels:
app: middleware
template:
metadata:
name: middleware-app
labels:
app: middleware
spec:
containers:
- name: middleware-app
image: myrepo.com/middleware:latest
imagePullPolicy: Always
ports:
- containerPort: 8081
---
kind: Service
apiVersion: v1
metadata:
name: middleware-service
spec:
type: LoadBalancer
selector:
app: middleware
ports:
- protocol: TCP
port: 8081
targetPort: 8081
---
# frontend
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
labels:
app: frontend
spec:
replicas: 1
selector:
matchLabels:
app: frontend
template:
metadata:
name: frontend-app
labels:
app: frontend
spec:
containers:
- name: frontend-app
image: myrepo.com/frontend:latest
imagePullPolicy: Always
---
kind: Service
apiVersion: v1
metadata:
name: frontend-service
spec:
type: ClusterIP
selector:
app: frontend
ports:
- port: 80
---
kind: Ingress
apiVersion: extensions/v1beta1
...
编辑:
我花了一天的大部分时间撕掉入口和身份验证层,然后慢慢地一个接一个地将它们放回去,结果如下:
假设我有一个入口,如下所示,它基本上只是将用户从入口外部ip(类似于xxxxaaaaabbbbzzz.elb.eu-central-1.amazonaws.com
他将其键入他的浏览器)或从自定义注册的域(即my.domain.com)传递,该域已设置为转发到该外部ip
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: my-ingress
spec:
rules:
- http:
paths:
- path: /
backend:
serviceName: frontend-service
servicePort: 80
- host: my.domain.com
http:
paths:
- path: /
backend:
serviceName: frontend-service
servicePort: 80
我觉得完全不可理解的是,如果我直接在浏览器中进入xxxxaaaaabbbbzzz.elb.eu-central-1.amazonaws.com
,那么对中间件的查询就可以正常工作。但是,如果我通过my.domain.com
去那里,他们不会去。这怎么可能?这两个地址都只是转发到前端服务
,我不明白为什么它们会与中间件
进行不同的交互
编辑编辑
也作为附加信息:登录到frontend
容器并调用curlhttp://middleware_ip_address:8081
以及curlhttp://middleware_elb_address:8081
这两种方法都有效<代码>卷曲http://middleware_elb_address:8081
也可以从集群外部工作
编辑
通过
http://my.domain.com
但通过https://my.domain.com
。证书当前未设置。这可能是原因吗?您能否分享前端服务如何连接到中间件服务?它是使用http客户端和IP还是其他方式?它是一个javascript应用程序,通过配置为http://the_ip_address:8081
你有没有curlhttp://the_ip_address:8081
工作正常吗?正如我已经说过的,在本地运行前端是可行的,因此后端肯定是可以访问的。如问题所示,如果部署在Kubernetes上,前端似乎无法到达。我现在还不太清楚。您是否可以使用curl确认部署在kubernetes内部的两个服务都可以在外部访问http://the_ip_address:8081
&curlhttp://the_ip_address:80
?