如何将本地 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,其中包含一个工作演示,如果您有兴趣的话。
我是 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,其中包含一个工作演示,如果您有兴趣的话。