如何将本地 java 服务连接到远程 kubernetes 服务

How to connect local java service to remote kubernetes services

我是 Kubernetes 和 spring 云微服务的 DevOps 工程师。

我想问的问题是,如果我有一个在 kubernetes 集群上运行一些微服务的开发环境(微服务可以使用 kube-dns 相互互连)并且我有一些其他的微服务 运行 在本地(开发人员在 eclipse IDE 中工作)以便进行一些测试。

这些微服务 运行 在本地需要加入集群上的其他微服务 运行 才能完成确切的工作。我该如何解决这个问题?

有两种方法可以解决此问题:将您需要连接到的服务公开到 public (NodePort/LB/Ingress) 或使开发人员能够实际到达您的集群内部,以便他们可以连接到这些服务。

第一个应该很容易使用 NginX IngressController 和基于虚拟主机的服务公开(您也可以使用基本身份验证来保护它们)。

第二个用ie就可以搞定。 Weave Net(如果 is/can 是您使用的覆盖网络)。如果你像这样将你的开发人员连接到中央 k8s 集群,他们只需要在他们的节点上 运行 kube-proxy 并将容器指向 k8s DNS。显然,我只建议在 dev/stage 集群而不是产品的情况下这样做。

在开发过程中,使用 kubernetes 端口转发从本地主机访问 kubernetes 网络中的服务。设置端口转发后,在开发期间更改必须访问 kubernetes 网络上的其他服务的服务中的源代码

找到您的 POD:

kubectl get pods

您的 POD 名称类似于 my-service-4254283044-n9ik9。现在设置端口转发:

kubectl port-forward <POD-TO-FORWARD-TO> 8083:80

编辑: 请注意,在进行端口转发之前,您需要从终端(一次)登录到 google 云!这是一个示例,请确保在您的区域、集群和项目中输入:gcloud container clusters get-credentials example-cluster --zone europe-west1-c --project example-148812

-------- 一些示例 --------

Java/Spring/Ribbon,将application.yml改成

account-service.ribbon.listOfServers: http://account-service

被替换为

account-service.ribbon.listOfServers: http://localhost:8081

Java/Feign,更改 Feign/HystrixFeign 构建器的目标

HystrixFeign.builder().target(http://localhost:8081, <fallback>);

C#:

client = new HttpClient
{
    BaseAddress = new Uri(@"http://localhost:8081")
};

等等

所需的源码修改当然可以通过配置完成...

您还可以使用 custom Endpoints 设置服务。通常服务指向部署,但您可以让它们指向特定的 IP。如果将端点设置为主机的 IP,服务将从集群路由到您的 IDE 环境。反之亦然,从您的 IDE 您仍然可以使用通过服务类型 LoadBalancer 公开的服务。

请记住,在您的 IDE 中,您会错过 Kubernetes 设置的环境变量。我通过检测我是否在 IDE 中 运行 解决了这个问题,然后从 Kubernetes API 中获取我需要的东西。而不是使用 kubedns,您必须将 URL 替换为 localhosts:<port>

我在 how to setup the custom endpoints 上写了一篇博客 post,其中包含一个工作演示,如果您有兴趣的话。