访问集群上运行的服务
本页展示如何连接到在 Kubernetes 集群上运行的服务。
准备开始
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个不充当控制平面主机的节点的集群上运行本教程。如果还没有集群,可以使用 minikube 创建一个集群,或者可以使用以下 Kubernetes 游乐场之一
要检查版本,请输入kubectl version
。访问在集群上运行的服务
在 Kubernetes 中,节点、Pod 和 服务都有自己的 IP 地址。在许多情况下,集群上的节点 IP、Pod IP 和某些服务 IP 不可路由,因此无法从集群外部的计算机(例如你的桌面计算机)访问它们。
连接方式
你可以使用多种选项从集群外部连接到节点、Pod 和服务
- 通过公共 IP 访问服务。
- 使用类型为
NodePort
或LoadBalancer
的服务使服务在集群外部可访问。请参阅服务和 kubectl expose 文档。 - 根据你的集群环境,这可能只会将服务暴露给你的公司网络,或者将其暴露给互联网。请考虑被暴露的服务是否安全。它是否执行自己的身份验证?
- 将 Pod 置于服务之后。要从一组副本中访问一个特定的 Pod(例如用于调试),请在 Pod 上放置一个唯一的标签,并创建一个选择此标签的新服务。
- 在大多数情况下,应用程序开发人员无需通过其节点 IP 直接访问节点。
- 使用类型为
- 使用 Proxy Verb 访问服务、节点或 Pod。
- 在访问远程服务之前进行 apiserver 身份验证和授权。如果服务不够安全,无法暴露给互联网,或者要获取节点 IP 上的端口访问权限,或者进行调试,请使用此方法。
- 代理可能会给某些 Web 应用程序带来问题。
- 仅适用于 HTTP/HTTPS。
- 此处 描述。
- 从集群中的节点或 Pod 访问。
- 运行一个 Pod,然后使用 kubectl exec 连接到其中的 shell。从该 shell 连接到其他节点、Pod 和服务。
- 某些集群可能允许你 ssh 到集群中的节点。从那里你或许可以访问集群服务。这是一种非标准方法,它在某些集群上有效,但在其他集群上无效。浏览器和其他工具可能已安装,也可能未安装。集群 DNS 可能无法正常工作。
发现内置服务
通常,kube-system 会在集群上启动多个服务。使用 kubectl cluster-info
命令获取这些服务的列表
kubectl cluster-info
输出类似于此
Kubernetes master is running at https://192.0.2.1
elasticsearch-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
kibana-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kibana-logging/proxy
kube-dns is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kube-dns/proxy
grafana is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
heapster is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy
这显示了访问每个服务的代理谓词 URL。例如,此集群已启用集群级别的日志记录(使用 Elasticsearch),如果传递了合适的凭据,则可以通过 https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/
访问该日志记录,或者通过 kubectl 代理(例如:https://127.0.0.1:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/
)访问。
注意
有关如何传递凭据或使用 kubectl 代理的信息,请参阅 使用 Kubernetes API 访问集群。手动构造 apiserver 代理 URL
如上所述,你使用 kubectl cluster-info
命令来检索服务的代理 URL。要创建包含服务端点、后缀和参数的代理 URL,请附加到服务的代理 URL:http://
kubernetes_master_address
/api/v1/namespaces/
namespace_name
/services/
[https:]service_name[:port_name]
/proxy
如果你没有为你的端口指定名称,则不必在 URL 中指定 _port_name_。你还可以使用端口号代替 _port_name_,用于命名端口和未命名端口。
默认情况下,API 服务器使用 HTTP 代理到你的服务。要使用 HTTPS,请在服务名称前加上 https:
:http://<kubernetes_master_address>/api/v1/namespaces/<namespace_name>/services/<service_name>/proxy
URL 的 <service_name>
部分支持的格式为
<service_name>
- 使用 http 代理到默认端口或未命名端口<service_name>:<port_name>
- 使用 http 代理到指定的端口名称或端口号https:<service_name>:
- 使用 https 代理到默认端口或未命名端口(注意末尾的冒号)https:<service_name>:<port_name>
- 使用 https 代理到指定的端口名称或端口号
示例
要访问 Elasticsearch 服务端点
_search?q=user:kimchy
,你将使用http://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy
要访问 Elasticsearch 集群运行状况信息
_cluster/health?pretty=true
,你将使用https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true
运行状况信息类似于此
{ "cluster_name" : "kubernetes_logging", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 5, "active_shards" : 5, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 5 }
要访问 _https_ Elasticsearch 服务运行状况信息
_cluster/health?pretty=true
,你将使用https://192.0.2.1/api/v1/namespaces/kube-system/services/https:elasticsearch-logging:/proxy/_cluster/health?pretty=true
使用 Web 浏览器访问在集群上运行的服务
你或许可以将 apiserver 代理 URL 放入浏览器的地址栏中。但是
- Web 浏览器通常无法传递令牌,因此你可能需要使用基本(密码)身份验证。可以配置 Apiserver 以接受基本身份验证,但你的集群可能未配置为接受基本身份验证。
- 某些 Web 应用程序可能无法工作,尤其是那些以不感知代理路径前缀的方式构造 URL 的客户端 JavaScript 应用程序。