使 Kubernetes 服务可从外部访问

Make Kubernetes Service Accessible Externally

我们有一个私有的 kubernetes 集群 运行 在具有私有地址的裸机 CoreOS 集群上(使用 Flannel 进行网络覆盖)。

在此集群之上,我们 运行 一个 kubernetes ReplicationController 和 elasticsearch 服务。为了启用负载平衡,此服务定义了一个 ClusterIP - 这也是一个私有 IP 地址:10.99.44.10(但与节点 IP 地址的范围不同)。

我们面临的问题是我们希望能够从 集群外部连接到此 ClusterIP。据我们所知,这个私有 IP 无法从我们私有网络中的其他机器访问...

我们怎样才能做到这一点?


节点的IP地址是:

 node 1  - 192.168.77.102
 node 2  - 192.168.77.103

.

这是服务、RC 和 Pod 与 kubectl 一起显示的方式:

NAME            LABELS          SELECTOR              IP(S)           PORT(S)
elasticsearch   <none>          app=elasticsearch     10.99.44.10     9200/TCP


CONTROLLER     CONTAINER(S)    IMAGE(S)       SELECTOR            REPLICAS
elasticsearch  elasticsearch   elasticsearch  app=elasticsearch   1


NAME                       READY     STATUS    RESTARTS   AGE
elasticsearch-swpy1         1/1       Running   0          26m

您需要设置服务的type

http://docs.k8s.io/v1.0/user-guide/services.html#external-services

如果您使用的是裸机,则您没有集成 LoadBalancer。您可以使用 NodePort 在每个 VM 上获取一个端口,然后设置您用于负载平衡的任何内容以针对任何节点上的该端口。

您可以使用 nodeport,但也可以将 hostport 用于某些守护进程和部署以及 hostnetwork 以提供 pod 总节点网络访问权限

IIRC,如果你有足够新的 kubernetes,每个节点都可以将流量转发到内部网络,所以如果你在 clients/switch 中创建正确的路由,你可以通过传递那些 TCP/IP打包到一个节点。然后节点会收到包并SNAT+转发到clusterIP或podIP。

最后,准系统现在可以使用 MetalLB 用于 kubernetes 负载均衡器,主要是以更自动和冗余的方式使用最后一个功能