首页 > 解决方案 > 连接到私有 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)

标签: reactjskubernetesgraphql

解决方案


从外部访问内部 kubernetes 服务的 3 种主要方法是:NodePortLoadBalancerIngress

您可以在此处阅读它们之间的一些主要区别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 方式处理流量。


推荐阅读