Kubernetes 可以从集群外部访问服务,但不能从集群内部访问

Kubernetes 可以从集群外部访问服务,但不能从集群内部访问,kubernetes,port,Kubernetes,Port,我被困在一个让我相当困惑的问题上。我有两个Kubernetes服务,我们称它们为frontend和middleware,它们执行以下操作: frontend服务于一个网站,并位于入口控制器后面,入口控制器将其暴露在端口80上 中间件接受来自前端的REST请求,并将请求的信息(从后台数据库)传回 我的问题如下: 如果我在Kubernetes群集上运行中间件,并将其作为负载平衡器公开,然后在本地运行前端(配置为连接到负载平衡器的外部IP),则一切正常。但是,如果我在Kubernetes群集上运行fr

我被困在一个让我相当困惑的问题上。我有两个Kubernetes服务,我们称它们为
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