访问群集

本主题讨论了与集群交互的多种方式。

首次使用 kubectl 访问

首次访问 Kubernetes API 时,建议使用 Kubernetes CLI,即 kubectl

要访问集群,您需要知道集群的位置并拥有访问它的凭据。通常,当您完成 入门指南 时,这会自动设置,或者其他人设置了集群并为您提供了凭据和位置。

使用以下命令检查 kubectl 知道的集群位置和凭据

kubectl config view

许多 示例 提供了使用 kubectl 的入门介绍,完整的文档可以在 kubectl 参考 中找到。

直接访问 REST API

Kubectl 处理定位和向 API 服务器进行身份验证。如果您想使用像 curl 或 wget 这样的 HTTP 客户端或浏览器直接访问 REST API,则有几种方法可以定位和进行身份验证

  • 以代理模式运行 kubectl。
    • 推荐方法。
    • 使用存储的 API 服务器位置。
    • 使用自签名证书验证 API 服务器的身份。无法进行中间人攻击。
    • 向 API 服务器进行身份验证。
    • 将来可能会进行智能客户端负载均衡和故障转移。
  • 直接向 HTTP 客户端提供位置和凭据。
    • 备选方法。
    • 适用于某些类型的客户端代码,这些代码对使用代理感到困惑。
    • 需要将根证书导入您的浏览器以防止中间人攻击。

使用 kubectl proxy

以下命令以代理模式运行 kubectl。它处理定位 API 服务器和进行身份验证。按以下方式运行它

kubectl proxy --port=8080

有关更多详细信息,请参见 kubectl proxy

然后,您可以使用 curl、wget 或浏览器浏览 API,将 localhost 替换为 [::1] 以用于 IPv6,如下所示

curl http://localhost:8080/api/

输出类似于此

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

不使用 kubectl proxy

使用 kubectl applykubectl describe secret... 创建一个针对默认服务帐户的令牌,并使用 grep/cut 进行截取

首先,创建 Secret,请求针对默认 ServiceAccount 的令牌

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: default-token
  annotations:
    kubernetes.io/service-account.name: default
type: kubernetes.io/service-account-token
EOF

接下来,等待令牌控制器用令牌填充 Secret

while ! kubectl describe secret default-token | grep -E '^token' >/dev/null; do
  echo "waiting for token..." >&2
  sleep 1
done

捕获并使用生成的令牌

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret default-token | grep -E '^token' | cut -f2 -d':' | tr -d " ")

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

输出类似于此

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

使用 jsonpath

APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode)

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

输出类似于此

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

上面的示例使用了 --insecure 标志。这使其容易受到中间人攻击。当 kubectl 访问集群时,它使用存储的根证书和客户端证书来访问服务器。(这些证书安装在 ~/.kube 目录中)。由于集群证书通常是自签名的,因此可能需要特殊配置才能让您的 HTTP 客户端使用根证书。

在某些集群中,API 服务器不需要身份验证;它可能在 localhost 上运行,或者受防火墙保护。对此没有标准。 控制对 API 的访问 描述了集群管理员如何配置此功能。

对 API 的编程访问

Kubernetes 正式支持 GoPython 客户端库。

Go 客户端

  • 要获取库,请运行以下命令:go get k8s.io/client-go@kubernetes-<kubernetes-version-number>,请参见 INSTALL.md 以获取详细的安装说明。请参见 https://github.com/kubernetes/client-go 以查看支持哪些版本。
  • 在 client-go 客户端之上编写应用程序。请注意,client-go 定义了自己的 API 对象,因此如果需要,请从 client-go 而不是从主存储库导入 API 定义,例如,import "k8s.io/client-go/kubernetes" 是正确的。

Go 客户端可以使用与 kubectl CLI 相同的 kubeconfig 文件 来定位和向 API 服务器进行身份验证。请参见此 示例

如果应用程序作为 Pod 部署在集群中,请参阅 下一部分

Python 客户端

要使用 Python 客户端,请运行以下命令:pip install kubernetes。请参见 Python 客户端库页面 以获取更多安装选项。

Python 客户端可以使用与 kubectl CLI 相同的 kubeconfig 文件 来定位和向 API 服务器进行身份验证。请参见此 示例

其他语言

客户端库 可用于从其他语言访问 API。请参见其他库的文档以了解它们如何进行身份验证。

从 Pod 访问 API

从 Pod 访问 API 时,定位和向 API 服务器进行身份验证的方式略有不同。

有关更多详细信息,请检查 从 Pod 内部访问 API

访问在集群上运行的服务

上一节描述了如何连接到 Kubernetes API 服务器。有关连接到在 Kubernetes 集群上运行的其他服务的详细信息,请参见 访问集群服务

请求重定向

重定向功能已被弃用并删除。请改用代理(见下文)。

这么多代理

在使用 Kubernetes 时,您可能会遇到几种不同的代理

  1. The kubectl proxy

    • 运行在用户的桌面上或 Pod 中
    • 从 localhost 地址代理到 Kubernetes API 服务器
    • 客户端到代理使用 HTTP
    • 代理到 API 服务器使用 HTTPS
    • 定位 API 服务器
    • 添加身份验证头
  2. The apiserver proxy

    • 是内置在 API 服务器中的一个堡垒
    • 将集群外部的用户连接到集群 IP,否则这些 IP 可能无法访问
    • 在 API 服务器进程中运行
    • 客户端到代理使用 HTTPS(如果 API 服务器如此配置,则使用 http)
    • 代理到目标可能使用 HTTP 或 HTTPS,具体取决于代理使用可用信息的选择
    • 可用于访问节点、Pod 或服务
    • 在用于访问服务时进行负载均衡
  3. The kube proxy

    • 运行在每个节点上
    • 代理 UDP 和 TCP
    • 不理解 HTTP
    • 提供负载均衡
    • 仅用于访问服务
  4. API 服务器前方的代理/负载均衡器

    • 存在和实现因集群而异(例如 nginx)
    • 位于所有客户端和一个或多个 API 服务器之间
    • 如果有多个 API 服务器,则充当负载均衡器。
  5. 外部服务上的云负载均衡器

    • 由某些云提供商提供(例如 AWS ELB、Google Cloud Load Balancer)
    • 当 Kubernetes 服务类型为 LoadBalancer 时,会自动创建
    • 仅使用 UDP/TCP
    • 实现方式因云提供商而异。

Kubernetes 用户通常不需要担心除前两种类型之外的任何其他类型。集群管理员通常会确保后两种类型正确设置。

上次修改于 2024 年 1 月 1 日太平洋标准时间下午 9:15:修复了几个链接错误 (8b46ec4047)