我正在使用我的电脑学习 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:**
以下流程的正确配置是什么\我的部署中缺少什么:
如果我遗漏了任何内容,请提及,我将编辑问题
谢谢!
使用我的客户端部署,我设法使用 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 上公开服务器,以便浏览器可以(从集群外部)访问它,就像访问客户端服务一样。