客户端无法访问 Kubernetes 本地集群中的服务器

问题描述 投票:0回答:1

我正在使用我的电脑学习 helm 和 k8s 上的部署,并且有几个问题。

一些背景:
一个简单的 TodoList - 客户端和服务器,连接到数据库(数据库当前不相关)。
我正在使用 graphql,因此当您连接到客户端时,它会向服务器加载请求以运行对我的初始客户端状态的查询。
那是我收到 CORS 错误和 NS_ERROR_DOM_BAD_URI 的时候。

这是我的客户端\服务器 yaml:

客户

# templates/client-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.client.name }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Values.client.name }} # this will make it recieve traffic
  template:
    metadata:
      labels:
        app: {{ .Values.client.name }}
    spec:
      containers:
      - name: {{ .Values.client.name }}
        image:  "Client\image:{{ .Values.client.tag }}"
        ports:
        - containerPort: 3000
        envFrom:
        - configMapRef:
            name: client-configmap
---
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.client.name }}
spec:
  type: NodePort
  selector:
    app: {{ .Values.client.name }}  # send traffic to the matching label
  ports:
    - protocol: TCP
      port: 3000 # port of the service
      targetPort: 3000 # forward traffic to a pod to the following port
      nodePort: {{ .Values.client.nodePort }} # recieve traffic from this port
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: client-configmap
data:
{{- $jsonData := tpl (.Files.Get "clientconfig.json") . | fromJson }}
{{- range $key, $value := $jsonData }}
  {{ $key }}: {{ quote $value | trimSuffix "\n" }}
{{- end }}

服务器

# templates/server-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Values.server.name }}
  template:
    metadata:
      labels:
        app: {{ .Values.server.name }}
    spec:
      containers:
      - name: server
        image:  "server\image:{{ .Values.server.tag }}"
        ports:
        - containerPort: 4000
        envFrom:
        - configMapRef:
            name: server-configmap

---
apiVersion: v1
kind: Service
metadata:
  name: {{ .Values.server.name }}
spec:
  type: ClusterIP
  selector:
    app: {{ .Values.server.name }}  # send traffic to the matching label
  ports:
    - protocol: TCP
      port: 4000
      targetPort: 4000

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: server-configmap
data:
{{- $jsonData := tpl (.Files.Get "serverconfig.json") . | fromJson }}
{{- range $key, $value := $jsonData }}
  {{ $key }}: {{ quote $value | trimSuffix "\n" }}
{{- end }}

问题1:
使用我的客户端部署,我设法使用 localhost:3xxxx 访问我的客户端 而不是客户端服务创建的IP,这是因为k8s集群和主机在同一台机器上吗?如果不是,我如何在不使用本地主机的情况下访问客户端,但是

问题2:
我假设发生 CORS 错误是因为客户端正在访问 Uri

http://server:4000
我假设客户不知道什么是
server
但是,请求是否应该在 集群而不是在浏览器中运行? 如果不是,正确的方法是什么?

** 问题 3:**
以下流程的正确配置是什么\我的部署中缺少什么:

  1. 输入 localhost:3XXXX 连接客户端。
  2. 客户端通过服务器服务连接到服务器。
  3. 从数据库接收数据并返回给客户端

如果我遗漏了任何内容,请提及,我将编辑问题
谢谢!

kubernetes docker-compose cors client-server kubernetes-helm
1个回答
0
投票

使用我的客户端部署,我设法使用 localhost:3xxxx 而不是客户端服务创建的 IP 来访问我的客户端,这是因为 k8s 集群和主机位于同一台计算机上吗?

很可能是的。您的客户端

Service
属于
NodePort
类型,因此它绑定到您的“节点”(本地主机)上的端口。
.Values.client.nodePort
的价值是多少?

如果不是,我如何在不使用本地主机的情况下访问客户端,但是

取决于集群的网络设置。如果您的本地主机是 kubernetes 节点本身(无虚拟化或桥接网络)。如果您打算从集群外部访问客户端服务,则可以使用

node_ip:node_port
。根据集群与本地主机的联网方式,
cluster_ip:node_port
也可能是可行的。
cluster_ip:node_port
在集群内绝对是可能的。

我假设发生 CORS 错误是因为客户端正在访问 Uri http://server:4000 我假设客户端不知道服务器是什么,但是,请求不应该在集群内发出而不是在浏览器中运行吗?如果不是,正确的方法是什么?

如果这个简短的答案还不够,那么这可能需要一个新的 StackOverflow 问题:从您的描述来看,听起来“客户端”正在提供 HTTP 页面和包含客户端应用程序的 javascript 包。服务器大概是一个用于保存和查询数据的 API 后端(通过 GraphQL)。

在这种情况下,您的浏览器会加载位于

localhost:3XXXX

 的 HTML 页面,但随后尝试向 
server:4000
 发出 HTTP 请求?如果这一切属实,那么您的“客户端”pod 不会向 
server:4000
 发出请求,而是您的浏览器。由于 
server:4000
 是不同的域,因此适用 CORS 策略。浏览器是唯一执行 CORS 的工具。

以下流程的正确配置是什么\我的部署中缺少什么

在我看来,您可能将“客户端”pod 与浏览器本身混为一谈。如果您的浏览器正在从客户端 Pod 请求页面,并且浏览器也将向服务器服务发出请求,那么您将需要以与公开客户端服务相同的方式公开您的服务器服务

AND 添加CORS 标头允许原点上的浏览器 localhost

 发出这些请求。

根据您当前的配置,您的服务器仅通过 ClusterIP 在集群内部公开。如果 NodePort 适合您,也可以在 NodePort 上公开服务器,以便浏览器可以(从集群外部)访问它,就像访问客户端服务一样。

© www.soinside.com 2019 - 2024. All rights reserved.