Kubernetes:link 及以下 kube-proxy
Kubernetes: link a pod to kube-proxy
据我了解,kube-proxy 在每个 Kubernetes 节点上运行(它在 Master 和 Worker 节点上启动)
如果我没理解错的话,也是'recommended'访问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 已经 运行 在每个节点上,'recommended' 是用新的 kube-proxy 容器启动每个 pod 的方法,还是可以 'link' 以某种方式连接到 运行 kube-proxy 容器?
最初我在 GKE 上使用 URL 和 $KUBERNETES_SERVICE_HOST 并且凭据作为秘密传递,
打电话
curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}
并解析结果,但在部署在 CoreOS 集群上的 K8s 上,我似乎只能通过 TLS 和证书进行身份验证,链接代理似乎是更好的方法。
因此,我正在寻找从一个 pod 连接到 API 以查找服务引用的另一个 pod 的 IP 的最有效/最简单的方法。
任何suggestion/input?
这里有几个选项,如您提供的文档 link 中所述。
首选方法是使用 Service Accounts 访问 API:
简短的描述是您的服务将读取安装到 pod 中的 service-account 秘密(令牌/CA-cert),然后将令牌注入 http header 和使用 CA-cert 验证 apiserver 证书。这在一定程度上简化了服务帐户的描述,但上面的 link 可以提供更多详细信息。
在 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
您提供的 link 中提到的另一个选项是 运行 一个 side-car 容器 运行在与你的申请。
澄清说明:"kube-proxy" 和 "kubectl proxy" 指的不是同一件事。 kube-proxy 负责路由 "service" 请求,kubectl 代理是一个 cli 命令,它打开一个本地代理到 Kubernetes API.
当 运行ning kubectl proxy
时在幕后发生的事情是 kubectl 命令已经知道如何使用 service-account 数据,所以它将提取 token/CA-cert 并为您建立到 API 服务器的连接,然后在 pod 中本地公开一个接口(您可以在没有任何 auth/TLS 的情况下使用)。
这可能是一种更简单的方法,因为它可能不需要更改现有应用程序,只需将其指向同一 pod 中的本地 kubectl 代理容器 运行ning。
另一个 side-note:我不确定你的确切 use-case,但通常最好使用服务 IP / 服务 DNS 名称并允许 Kubernetes 处理服务发现,而不是提取 Pod IP 本身(如果 Pod 被调度到不同的机器,Pod IP 将会改变)。
据我了解,kube-proxy 在每个 Kubernetes 节点上运行(它在 Master 和 Worker 节点上启动)
如果我没理解错的话,也是'recommended'访问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 已经 运行 在每个节点上,'recommended' 是用新的 kube-proxy 容器启动每个 pod 的方法,还是可以 'link' 以某种方式连接到 运行 kube-proxy 容器?
最初我在 GKE 上使用 URL 和 $KUBERNETES_SERVICE_HOST 并且凭据作为秘密传递, 打电话
curl https://$USER:$PASSWORD@${KUBERNETES_SERVICE_HOST}/api/v1/namespaces/${NAMESPACE}/endpoints/${SELECTOR}
并解析结果,但在部署在 CoreOS 集群上的 K8s 上,我似乎只能通过 TLS 和证书进行身份验证,链接代理似乎是更好的方法。
因此,我正在寻找从一个 pod 连接到 API 以查找服务引用的另一个 pod 的 IP 的最有效/最简单的方法。
任何suggestion/input?
这里有几个选项,如您提供的文档 link 中所述。
首选方法是使用 Service Accounts 访问 API:
简短的描述是您的服务将读取安装到 pod 中的 service-account 秘密(令牌/CA-cert),然后将令牌注入 http header 和使用 CA-cert 验证 apiserver 证书。这在一定程度上简化了服务帐户的描述,但上面的 link 可以提供更多详细信息。
在 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
您提供的 link 中提到的另一个选项是 运行 一个 side-car 容器 运行在与你的申请。
澄清说明:"kube-proxy" 和 "kubectl proxy" 指的不是同一件事。 kube-proxy 负责路由 "service" 请求,kubectl 代理是一个 cli 命令,它打开一个本地代理到 Kubernetes API.
当 运行ning kubectl proxy
时在幕后发生的事情是 kubectl 命令已经知道如何使用 service-account 数据,所以它将提取 token/CA-cert 并为您建立到 API 服务器的连接,然后在 pod 中本地公开一个接口(您可以在没有任何 auth/TLS 的情况下使用)。
这可能是一种更简单的方法,因为它可能不需要更改现有应用程序,只需将其指向同一 pod 中的本地 kubectl 代理容器 运行ning。
另一个 side-note:我不确定你的确切 use-case,但通常最好使用服务 IP / 服务 DNS 名称并允许 Kubernetes 处理服务发现,而不是提取 Pod IP 本身(如果 Pod 被调度到不同的机器,Pod IP 将会改变)。