【问题标题】:Kubernetes: link a pod to kube-proxyKubernetes:将 pod 链接到 kube-proxy
【发布时间】:2015-12-27 20:02:22
【问题描述】:

据我了解,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 和作为 Secret 传递的凭据, 调用

curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}

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

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

有什么建议/意见吗?

【问题讨论】:

    标签: kubernetes coreos


    【解决方案1】:

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

    首选方法是使用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
    

    您提供的链接中提到的另一个选项是在与您的应用程序相同的 pod 中运行运行“kubectl 代理”的边车容器。

    澄清说明:“kube-proxy”和“kubectl proxy”指的不是同一个东西。 kube-proxy 负责路由“服务”请求,kubectl proxy 是一个 cli cmd,它为 Kubernetes API 打开一个本地代理。

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

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

    另一个旁注:我不确定您的确切用例,但通常最好使用服务 IP/服务 DNS 名称并允许 Kubernetes 处理服务发现,而不是提取 pod IP本身(如果 pod 被调度到不同的机器,pod IP 将会改变)。

    【讨论】:

    • 谢谢 Aaron,我仍然对如何使用 kubectl 代理感到困惑:它可以在 localhost 上使用,但对我来说 kubectl 是一个命令行工具,我如何使用边车容器?这个“示例”github.com/kubernetes/kubernetes/tree/release-1.0/examples/… 解释了一点,我希望我做对了:带有“-p proxy 8001”参数的 kubectl 基本上充当通过连接的 pod 使用 wget 到 localhost 和 8001 端口,这实际上意味着 kubectl接收 HTTP 请求并将其转发到 api 服务器。对吗?
    • btw:我知道我可以使用服务名称并利用 DNS,但是像 HBase 这样的一些服务似乎通过主机名来引用节点。有一个关于 pod 的 DNS 的完整问题线程,它刚刚被推送,但同时我需要一个替代方案。
    • @MrE 这就是正在发生的事情。一个 pod 中的所有容器基本上将共享同一个网络。因此,在一个容器中,您通过长期存在的 cli 命令 (kubectl proxy) 运行代理,而在您的应用程序容器中,您通过 localhost 连接到该代理。
    • 谢谢@Aaron 我在这里发布了另一个问题:stackoverflow.com/questions/32928755/…,但我仍然无法让它工作。既然它是相关的,也许你可以帮忙:代理是否也允许我与服务交谈(即连接到服务本身,在它的端口上,而不仅仅是从 api-server 获取它的元数据?)例如我会喜欢连接到定义为 mongodb:27017 as a Service 但不暴露于外部的数据库。我可以以某种方式使用 kubectl 代理作为传递吗?
    猜你喜欢
    • 2017-11-02
    • 2021-05-07
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    相关资源
    最近更新 更多