我陷入一个困扰我的问题。我有两个Kubernetes服务,我们称它们为frontend
和middleware
,它们执行以下操作:
frontend
服务于一个网站,位于入口控制器后面,该入口控制器将其暴露在端口80上。
middleware
接受来自frontend
的REST请求,并将其传递回请求的信息(从后台数据库)。
我的问题如下:
如果我在Kubernetes集群上运行middleware
并将其作为LoadBalancer公开,然后在本地运行frontend
(配置为连接到LoadBalancer的外部IP),则一切正常。但是,如果我在Kubernetes集群(无论是配置为连接到LoadBalancer的外部IP还是使用内部IP)上运行frontend
而不是本地,则可以连接到前端,但是前端无法获取数据来自middleware
,即无法连接。
我对此有些茫然。在这两种情况下,middleware
的配置都完全相同,我看不出frontend
的配置会如何影响它。
对于任何有关配置错误的想法,我将不胜感激。
以下是相关的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(他在浏览器中键入xxxxaaaaabbbbbzzz.elb.eu-central-1.amazonaws.com
之类的)或自定义注册域(即我的)传递用户。 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
我完全无法理解的是,如果我直接在浏览器中转到xxxxaaaaabbbbbzzz.elb.eu-central-1.amazonaws.com
,则对middleware
的查询可以正常工作。但是,如果我通过my.domain.com
去那里,他们不会。那怎么可能?这两个地址都只是转发到frontend-service
,我不明白为什么它们会与middleware
进行不同的交互。
编辑编辑
还有其他信息:登录frontend
容器并调用curl http://middleware_ip_address:8081
和curl http://middleware_elb_address:8081
都可以。 curl http://middleware_elb_address:8081
也可以在集群外部使用。
EDIT EDIT EDIT
我在通过http://my.domain.com
访问时工作,但在通过https://my.domain.com
访问时工作。当前未设置证书。可能是原因吗?