【问题标题】:What is the purpose of kubectl proxy?kubectl 代理的目的是什么?
【发布时间】:2019-05-07 08:36:33
【问题描述】:

为了访问 Kubernetes 仪表板,您必须在本地机器上运行 kubectl proxy,然后将您的 Web 浏览器指向代理。同样,如果您想提交 Spark 作业,请再次在本地计算机上运行 kubectl proxy,然后针对 localhost 地址运行 spark-submit。

我的问题是,为什么 Kubernetes 会有这种奇特的安排? Dashboard 服务在 Kubernetes 集群上运行,为什么我不直接将 Web 浏览器指向集群呢?为什么要有代理?在某些情况下,对代理的需要是不方便的。例如,我想从我的 Web 服务器提交一个 Spark 作业。我不能这样做——我必须先运行一个代理,但这会将我与一个特定的集群联系起来。我可能有很多 Kubernetes 集群。

为什么 Kubernetes 被设计成只能通过代理访问它?

【问题讨论】:

  • K8s 服务默认只能在集群内访问。您的开发机器不是集群的一部分,因此您必须通过 kubectl 代理您的调用。您可以通过在服务定义中使用 type: nodePort 或在支持 LB(Azure、AWS、GKE 等)的环境中使用 type: LoadBalancer 向外部世界公开服务。见K8s servicesUsing a Service to Expose Your App

标签: kubernetes


【解决方案1】:

您可以通过不同的方式访问集群中的应用程序:

  1. 使用apiserver as a proxy,但需要通过认证和授权阶段。
  2. 使用hostNetwork。当 Pod 配置了 hostNetwork: true 时,运行在这样的 Pod 中的应用程序可以直接看到启动 Pod 的主机的网络接口。
  3. 使用hostPort。容器端口将在hostIP:hostPort对外网络暴露,其中hostIP是运行容器的Kubernetes节点的IP地址,hostPort是用户请求的端口。
  4. 通过使用类型为:ClusterIP 的服务。只有集群中的 pod 和集群节点可以访问 ClusterIP 服务。
  5. 通过使用类型为:NodePort 的服务。除了 ClusterIP 之外,该服务是随机的或由30000-32767 范围内的用户端口指定。所有集群节点都侦听该端口并将所有流量转发到相应的服务。
  6. 通过使用类型为:LoadBalancer 的服务。它仅适用于受支持的云提供商和 Metallb 用于 On Premise 集群。除了打开 NodePort,Kubernetes 还创建了云负载均衡器,为该服务将流量转发到 NodeIP:Nodeport

所以,基本上:[[[ Kubernetes Service type:ClusterIP] + NodePort ] + LoadBalancer ]

  1. 通过使用入口(入口控制器+入口对象)。 Ingress-controller 由 Nodeport 或 LoadBalancer 服务公开,并作为集群服务的 L7 反向代理/LB 工作。它可以访问 ClusterIP 服务,因此,如果您使用 Ingress,则无需公开服务。您可以将其用于 SSL 终止和基于 URL 路径转发流量。最受欢迎的入口控制器是:

现在,关于kubectl proxy。它使用第一种方式连接到集群。基本上,它读取 .kube/config 中的集群配置,并使用那里的凭据通过集群 API Server 身份验证和授权阶段。然后它创建从本地机器到 API-Server 接口的通信通道,因此,您可以使用本地端口向 Kubernetes 集群 API 发送请求,而无需为每个请求指定凭据。

【讨论】:

    【解决方案2】:

    为什么 Kubernetes 被设计成只能通过代理访问它?

    简单来说,为了安全方便

    默认情况下,集群是隔离的,这样做可以减轻管理员考虑暴露服务可能打开的所有可能安全漏洞的负担。

    代理在集群(API 服务器)和客户端之间提供了一个安全连接,这避免了您必须更改所有应用程序来实现安全逻辑只是为了与集群通信,这样,您验证一次,并且每次应用程序无需任何更改即可使用此安全连接。

    如您的示例中所述,您无需在集群上进行身份验证即可进行通信,kubectl 为您完成了这项工作,并且每个 API Server 调用都将代表您设置安全性。

    集群也可以不使用代理访问,问题是你需要手动配置它并通过服务器验证应用程序,失去了使用简单命令的便利。

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 2017-05-19
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      相关资源
      最近更新 更多