reactjs - 连接到私有 IP 地址 - graphql - kubernetes
问题描述
如何连接graphql
在私有网络上且可通过私有 IP 地址访问的 api。我的前端服务器和 api 在VNET
.
import { ApolloClient } from 'apollo-client'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { createUploadLink } from 'apollo-upload-client'
const uploadLink = createUploadLink({
uri: 'http://10.0.0.10:3000'+'/api'
})
const client = new ApolloClient({
link: uploadLink,
cache: new InMemoryCache()
})
export default client
两个应用程序都在kubernetes
同一个集群的不同 pod 上运行。可以在集群内访问私有服务,当我exec
进入前端 pod 时,我可以使用私有 IP 地址访问graphql
端点。
但是,在浏览器上,它没有连接并给出此错误:ERR_CONNECTION_REFUSED
前端(公共 IP)-> graphql(私人 IP)
解决方案
从外部访问内部 kubernetes 服务的 3 种主要方法是:NodePort、LoadBalancer和Ingress。
您可以在此处阅读它们之间的一些主要区别https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0
节点端口
将某个范围内随机或手动选择的高端口以 1 对 1 的方式映射到服务。
要么允许 kubernetes 随机选择一个高端口,要么从一个预定义的范围内手动定义一个高端口,默认为 30000-32767(但可以更改),并将其以 1 对 1 的方式映射到内部服务端口。
警告:虽然可以为每个服务手动定义一个 NodePort 端口号,但由于可能存在端口冲突等问题,通常不建议这样做。所以在大多数情况下,您应该让集群为您随机选择一个 NodePort 端口号。
来自官方文档:https ://kubernetes.io/docs/concepts/services-networking/service/#nodeport
如果将 type 字段设置为 NodePort,Kubernetes master 将从 --service-node-port-range 标志指定的范围内分配一个端口(默认值:30000-32767),每个节点将代理该端口(相同的端口每个节点上的编号)到您的服务中。
负载均衡器
将服务附加到由 IP Provider 服务(例如云提供商 Public IP Service)提供的外部 ip。
此服务类型的功能取决于外部驱动程序/插件。大多数现代云都支持为 LoadBalancer 定义提供公共 IP。但是,如果您正在旋转一个无法分配公共 IP 的自定义集群(例如使用没有 IP 提供程序插件的 Rancher),那么您可能做的最好的事情就是将主机的 IP 分配给单个服务。
来自官方文档:https ://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer
在支持外部负载均衡器的云提供商上,将 type 字段设置为 LoadBalancer 将为您的服务提供负载均衡器。负载均衡器的实际创建是异步发生的,有关已配置均衡器的信息将发布在服务的 .status.loadBalancer 字段中。
入口
运行一个中央应用程序路由器服务,该服务接收某个端口(或多个端口)上的所有流量,并根据请求的域和路径等参数将其路由到服务。
要安装它,您必须创建一个应用程序路由器服务(例如 nginx),该服务在您的集群中运行并分析创建的每个 Ingress 类型的新资源。然后创建定义路由规则的 Ingress 资源,例如侦听哪个 DNS 请求以及将请求转发到哪个服务。
尽管为此目的存在多种解决方案,但我推荐 Nginx Ingress
https://github.com/helm/charts/tree/master/stable/nginx-ingress https://github.com/kubernetes/ingress-nginx
官方文档:
什么是入口?通常,服务和 Pod 的 IP 只能由集群网络路由。最终到达边缘路由器的所有流量要么被丢弃,要么被转发到其他地方。从概念上讲,这可能看起来像:
internet | ------------ [ Services ] An Ingress is a collection of rules that allow inbound connections to reach the cluster services. internet | [ Ingress ] --|-----|-- [ Services ] It can be configured to give services externally-reachable URLs, load balance
流量、终止 SSL、提供基于名称的虚拟主机等。用户通过将 Ingress 资源 POST 到 API 服务器来请求 Ingress。Ingress 控制器负责实现 Ingress,通常使用负载均衡器,但它也可以配置边缘路由器或其他前端以帮助以 HA 方式处理流量。
推荐阅读
- sql-server - 检测批处理中的重复行 - T-SQL
- node.js - 错误:在 npm start 上找不到模块 '../utils/appleAuth'
- laravel - 此集合实例上不存在属性 [图像]
- mysql - 如何优化/测量 MYSQL 上的 UPSERT 性能?
- r - R Shiny - 用一个反应构造两个变量
- html - 如何美化pycharm控制台中的HTML代码?
- r - R中Vroom包中列号的列名
- css - 我怎样才能让弹性项目双向增长
- json - 如何在 Angular 中将嵌套的 json 对象读取到表中?
- fortran - Fortran 中 (1) 的赋值中不兼容的等级 0 和 1