首页 > 解决方案 > 如何对在 Docker Desktop (Kubernetes) 中运行的 pod 进行 HTTP 调用

问题描述

因此,当我尝试从设置为 Ingress 的前端拨打电话时,我遇到了 ERR_CONNECTION_REFUSED 的问题。我的后端快速服务器在端口 5000 上运行,并设置为 ClusterIP。我已经阅读了 docker for mac local cluster ip is the same as localhost 所以这就是我设置它的方式。

我有信心我有正确的文件和网络。我只是不确定将 API 调用指向后端的位置。它也是本地主机吗?我将包括以下文件。

前端部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-deployment
spec:
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: frontend-container
        image: mrich6347/vue-frontend:5
        resources:
          requests:
            memory: "32Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 8080

前端服务

apiVersion: v1
    kind: Service
    metadata:
      name: frontend-service
    spec:
      type: ClusterIP
      selector:
        app: frontend
      ports:
      - port: 8080
        targetPort: 8080

快速服务器部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: express-server-deployment
spec:
  selector:
    matchLabels:
      app: express-server
  template:
    metadata:
      labels:
        app: express-server
    spec:
      containers:
      - name: express-server
        image: mrich6347/express-server:5
        resources:
          requests:
            memory: "32Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 5000

快递服务器服务

apiVersion: v1
kind: Service
metadata:
  name: express-server-service
spec:
  type: ClusterIP
  selector:
    app: express-server
  ports:
  - port: 5000
    targetPort: 5000

这是我来自 vue 的 api 调用

export default {
  name: 'app',
  components: {
    HelloWorld
  },
  created: async () => {
    console.log("SERVER IS UP")
    let res = await axios.get("http://127.0.0.1:5000/test");
    console.log(res)
  }
}

最后是我的简单快递 API

const app = require('express')();
var cors = require('cors')

app.use(cors())

app.get("/test", (req, res) => {
    res.send("WORKING!")
})


app.listen(5000, () => {
    console.log("Server is up on 5000")
})

入口控制器

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traffic-router
  annotations:
    ingress.kubernetes.io/rewrite-target: /


spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: frontend-service
              servicePort: 8080

标签: dockerkubernetesdevops

解决方案


我已经阅读了 docker for mac local cluster ip is the same as localhost 所以这就是我设置它的方式

Docker for Mac Kubernetes 中的服务不能直接用于您的桌面。集群 IP 有很多,而且只有一个localhost,所以如果它们都暴露出来,你很快就会在 localhost 上遇到端口冲突。

Docker for Mac 将自动公开类型为LoadBalanceron 的服务localhost。这个概念类似于跑步docker run -p 80:30843 ...。请参阅EXTERNAL-IP此入口控制器上的 。

$ kubectl get service m-nginx-nginx-ingress-controller
NAME                               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
m-nginx-nginx-ingress-controller   LoadBalancer   10.108.201.47   localhost     80:30843/TCP,443:31419/TCP   22h
$ curl http://localhost:80
default backend - 404

听起来您已经有一个用于前端服务的入口控制器,因此重用该入口并将另一个主机名或 URI 路径映射到后端服务是最简单的。


推荐阅读