据我了解,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 已经在每个节点上运行,“推荐”的方式是在每个 pod 中启动一个新的 kube-proxy 容器,还是可以以某种方式“链接”到正在运行的 kube-proxy 容器?
最初我在 GKE 上使用带有 $KUBERNETES_SERVICE_HOST 的 URL 和作为 Secret 传递的凭据,
打电话
curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}
并解析结果,但在部署在 CoreOS 集群上的 K8s 上,我似乎只能通过 TLS 和证书进行身份验证,而链接代理似乎是一种更好的方法。
因此,我正在寻找从 pod 连接到 API 以查找 Service 引用的另一个 pod 的 IP 的最有效/最简单的方法。
有什么建议/意见吗?
最佳答案
如您提供的文档链接中所述,这里有几个选项。
首选方法是使用 Service Accounts访问 API:
简短的描述是您的服务将读取挂载到 pod 中的服务帐户 secret ( token /CA-cert),然后将 token 注入(inject) http header 并使用 CA-cert 验证 apiserver 证书。这在某种程度上简化了服务帐户的描述,但上面的链接可以提供更多详细信息。
在 pod 中使用 curl 和服务帐户数据的示例:
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
您提供的链接中提到的另一个选项是在与您的应用程序相同的 pod 中运行运行“kubectl 代理”的边车容器。
澄清说明:“kube-proxy”和“kubectl proxy”指的不是同一个东西。 kube-proxy 负责路由“服务”请求,kubectl proxy 是一个 cli cmd,它为 Kubernetes API 打开一个本地代理。
运行
kubectl proxy
时幕后发生了什么是 kubectl 命令已经知道如何使用 service-account 数据,所以它会提取 token/CA-cert 并为您建立与 API 服务器的连接,然后在 pod 中本地公开一个接口(interface)(您可以使用没有任何身份验证/TLS)。这可能是一种更简单的方法,因为它可能不需要对现有应用程序进行任何更改,只需将其指向在同一 pod 中运行的本地 kubectl 代理容器。
另一个旁注:我不确定您的确切用例,但通常最好使用服务 IP/服务 DNS 名称并允许 Kubernetes 处理服务发现,而不是提取 pod IP 本身(如果 pod 被安排到不同的机器上,pod IP 将会改变)。
关于Kubernetes:将 pod 链接到 kube-proxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859242/