据我了解,kube-proxy在每个Kubernetes节点上运行(它在Master和Worker节点上启动)
如果我理解正确,它也是访问API的“推荐”方式(请参阅:https://github.com/kubernetes/kubernetes/blob/release-1.0/docs/user-guide/accessing-the-cluster.md#accessing-the-api-from-a-pod)
所以,既然kube-proxy已经在每个节点上运行,那么“推荐”的方式是用一个新的kube-proxy容器启动每个pod,或者是否有可能以某种方式“链接”到正在运行的kube-代理容器?
最初我在GKE上使用带有$ KUBERNETES_SERVICE_HOST的URL和作为机密传递的凭据, 打电话
curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}
并解析结果,但在部署在CoreOS集群上的K8上,我似乎只能通过TLS和证书进行身份验证,而链接代理似乎是一种更好的方式。
所以,我正在寻找从pod连接到API的最有效/最简单的方法,以查找服务引用的另一个pod的IP。
有任何建议/意见吗?
答案 0 :(得分:5)
这里有几个选项,如您提供的文档链接中所述。
首选方法是使用Service Accounts访问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
您提供的链接中提到的另一个选项是运行一个运行" kubectl代理的侧车容器"与您的应用程序在同一个pod中。
澄清说明:" kube-proxy"和" kubectl代理"并不是指同一件事。 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将更改。)