GKE:从集群外部安全访问服务

时间:2015-10-04 00:06:36

标签: kubernetes google-kubernetes-engine

有没有办法以安全的方式从外部访问群集中的“内部”服务(那些未暴露在外部的服务)。

目标很简单:我需要调试这些服务的客户端并需要访问它们,但不希望将它们暴露在外面。

在常规单个主机上,我通常会使用SSH隧道连接到主机并将端口映射到localhost;我尝试使用SSHD容器,但这并没有让我走得太远:服务不直接在那个容器上,所以我不知道如何到达网络上的下一跳,因为服务是动态管理IP。

理想情况下,VPN会更方便,但GKE似乎不支持VPN用于公路战士的情况。

这个用例有什么解决方案吗?

感谢您的意见。

编辑:

我在这里看到: https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/accessing-the-cluster.md#ways-to-connect

现在支持的唯一连接方式是HTTP / HTTPS,这意味着我可以代理HTTP呼叫,但不能代理任何端口

3 个答案:

答案 0 :(得分:4)

您可以通过在开发计算机上运行kubectl proxy和使用主服务器中内置的代理功能(这需要很多代理,但请耐心等待)来实现此目的。

首先,运行kubectl proxy。请注意本地绑定的端口(默认情况下应为8001)。这将导致kubectl创建一个到您的主实例的隧道,您可以在本地命中而无需通过任何身份验证(从技术上讲,您可以执行以下所有步骤而不首先直接命中主节点,但这对于调试来说更简单)。

接下来,将客户端(网络浏览器,卷曲等)指向http://localhost:8001/api/v1/proxy/namespaces/<ns>/services/<svc>/,将<ns>替换为配置服务的命名空间,将<svc>替换为您的服务名称。您还可以将特定请求路径附加到URL的末尾,因此,如果服务后面的pod正在托管名为data.json的文件,您可以将其附加到请求路径的末尾。

这就是update-demo教程的工作方式,所以如果你遇到困难,我建议你走过那个例子,仔细看看javascript做了什么(它不是&#39;}太复杂了)。

答案 1 :(得分:2)

在尝试了上述文档中解释的许多方法之后,对我有用的东西是:

1)创建SSHD守护程序容器以SSH到群集 2)使用type: NodePort

创建ssh服务

3)获取端口号 kubectl describe service sshd

4)使用ssh端口转发来获取服务:

ssh -L <local-port>:<my-k8s-service-name>:<my-k8s-service-port> -p <sshd-port> user@sshd-container

例如

ssh -L 2181:zookeeper:2181 -p 12345 root@sshd-container

然后我在localhost:2181上有我的zookeeper服务 要获得更多端口映射,请使用备用端口。

答案 2 :(得分:2)

您也可以尝试使用kubectl port-forward

http://kubernetes.io/docs/user-guide/connecting-to-applications-port-forward/

http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/

示例:

kubectl port-forward POD_NAME LOCAL_PORT:REMOTE_PORT

kubectl port-forward redis-master 6379:6379