访问集群上运行的服务

本页面介绍了如何连接到 Kubernetes 集群中运行的服务。

开始之前

你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。

要检查版本,请输入 kubectl version

访问集群中运行的服务

在 Kubernetes 中,节点Pod服务 都有各自的 IP。在许多情况下,集群上的节点 IP、Pod IP 和某些服务 IP 是不可路由的,因此无法从集群外部的机器(例如您的桌面机器)访问它们。

连接方式

您有几种从集群外部连接到节点、Pod 和服务的选项:

  • 通过公共 IP 访问服务。
    • 使用类型为 NodePortLoadBalancer 的服务,使其在集群外部可访问。请参阅 服务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://: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 server 使用 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 应用可能无法工作,特别是那些通过客户端 JavaScript 构建 URL 的应用,它们可能无法感知代理路径前缀。

最后修改于 2024 年 1 月 21 日下午 3:58 (PST): 修复 access-cluster-services.md 列表缩进 (586fd88b02)