Kubernetes:将 pod 链接到 kube-proxy

标签 kubernetes coreos

据我了解,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/

相关文章:

docker - Docker删除Dangling Images命令在CoreOS systemd单位文件中不起作用

postgresql - 在 docker 环境中重启 postgres

kubernetes - 具有新 etcd 卷的新 master 不会加入集群

kubernetes - Kubernetes 中的网络

azure - AKS 资源的自定义命名约定

docker - 部署到多个OpenShift容器注册表

docker - dnsmasq 跨 docker 容器的奇怪行为

nginx - 如何在Kubernetes中为多个服务设置粘性 session ?

postgresql - 无法通过 Spring Boot 将 Docker Desktop Kubernetes (Windows) 服务连接到本地 Postgres 数据库

kubernetes - Kubernetes Java客户端-OpenId OAuth支持