Kubernetes:将pod连接到kube-proxy

MrE*_*MrE 3 coreos kubernetes

据我了解,kube-proxy在每个Kubernetes节点上运行(它在Master和Worker节点上启动)

如果我理解正确,它也是访问API的"推荐"方式(请参阅:https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/user-guide/accessing-the-cluster. md#access-the-api-from-a-pod)

那么,既然kube-proxy已经在每个节点上运行,那么"推荐"的方式是用一个新的kube-proxy容器启动每个pod,还是可以以某种方式"链接"到正在运行的kube-proxy容器?

最初我在$ GUB上使用带有$ KUBERNETES_SERVICE_HOST的URL和作为Secret传递的凭据,调用

curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}
Run Code Online (Sandbox Code Playgroud)

并解析结果,但在部署在CoreOS集群上的K8上,我似乎只能通过TLS和证书进行身份验证,而链接代理似乎是一种更好的方式.

所以,我正在寻找从pod连接到API以查找服务引用的另一个pod的IP的最有效/最简单的方法.

有什么建议/意见吗?

Aar*_*evy 7

这里有几个选项,如您提供的文档链接中所述.

首选方法是使用服务帐户访问API:

简短描述是您的服务将读取挂载到pod中的服务帐户机密(令牌/ CA-cert),然后将令牌注入http头并使用CA-cert验证apiserver证书.这有点简化了服务帐户的描述,但上面的链接可以提供更多细节.

在pod中使用curl和service-account数据的示例:

curl -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt https://kubernetes/api/v1/namespaces
Run Code Online (Sandbox Code Playgroud)

您提供的链接中提到的另一个选项是在与应用程序相同的窗格中运行运行"kubectl代理"的侧车容器.

澄清说明:"kube-proxy"和"kubectl proxy"并不是指同一件事.kube-proxy负责路由"服务"请求,kubectl代理是一个cli cmd,它打开Kubernetes API的本地代理.

运行时所发生的事情kubectl proxy是kubectl命令已经知道如何使用服务帐户数据,因此它将提取令牌/ CA证书并为您建立与API服务器的连接,然后在本地公开接口在pod中(您可以在没有任何auth/TLS的情况下使用).

这可能是一种更简单的方法,因为它可能不需要对现有应用程序进行任何更改,只需将其指向在同一pod中运行的本地kubectl代理容器即可.

另一个侧面说明:我不确定您的确切用例,但通常最好使用服务IP /服务DNS名称并允许Kubernetes处理服务发现,而不是提取pod IP本身(如果将pod安排到另一台计算机,则pod IP将更改.