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

时间:2020-10-26 08:49:08

标签: kubernetes port

我陷入一个困扰我的问题。我有两个Kubernetes服务,我们称它们为frontendmiddleware,它们执行以下操作:

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:8081curl http://middleware_elb_address:8081都可以。 curl http://middleware_elb_address:8081也可以在集群外部使用。

EDIT EDIT EDIT

我在通过http://my.domain.com访问时工作,但在通过https://my.domain.com访问时工作。当前未设置证书。可能是原因吗?

0 个答案:

没有答案