为了访问Kubernetes仪表板,您必须在本地计算机上运行kubectl代理,然后将Web浏览器指向该代理。同样,如果要提交Spark作业,请再次在本地计算机上运行kubectl代理,然后针对本地主机地址运行spark-submit。
我的问题是,为什么Kubernetes会有这种特殊的安排?仪表板服务正在Kubernetes集群上运行,那么为什么我不将Web浏览器直接指向集群呢?为什么要有代理?在某些情况下,代理的需求不便。例如,我要从Web服务器提交一个Spark作业。我无法做到这一点-我必须先运行代理,但这将我绑定到特定的集群。我可能有很多Kubernetes集群。
为什么Kubernetes设计为只能通过代理访问它?
答案 0 :(得分:3)
您可以通过多种方式访问集群中的应用程序:
hostIP:hostPort
暴露给外部网络,其中hostIP
是容器正在运行的Kubernetes节点的IP地址,而hostPort
是容器运行的端口。用户。30000-32767
范围内的用户端口指定。所有群集节点都侦听该端口,并将所有流量转发到相应的服务。NodeIP:Nodeport
。 因此,基本上:[[[ Kubernetes Service type:ClusterIP] + NodePort ] + LoadBalancer ]
现在,大约kubectl proxy
。它使用第一种方式连接到群集。基本上,它读取.kube / config中的群集配置,并从那里使用凭据通过群集API Server身份验证和授权阶段。然后,它创建了从本地计算机到API-Server接口的通信通道,因此,您可以使用本地端口将请求发送到Kubernetes集群API,而不必为每个请求指定凭据。
答案 1 :(得分:1)
为什么Kubernetes设计为只能通过代理访问它?
简单来说,出于安全性和便利性。
默认情况下,群集是隔离的,这样可以减轻管理员考虑暴露服务可能打开的所有可能的安全漏洞的负担。
代理在群集(API服务器)和客户端之间提供了安全的连接,这避免了您不得不更改所有应用程序以实现仅用于与群集通信的安全逻辑的方式,因此,您只需进行一次身份验证应用程序使用此安全连接,无需进行任何更改。
如您的示例中所述,您无需在集群上进行身份验证即可进行通信,kubectl为您完成了工作,并且每个API Server调用都将代表您设置安全性。
还可以在没有代理的情况下访问群集,问题是您需要手动配置它并向服务器验证应用程序,而失去了使用简单命令进行操作的便利性。