访问集群

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

首次使用 kubectl 访问

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

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

使用以下命令检查 kubectl 了解的位置和凭据

kubectl config view

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

直接访问 REST API

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

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

使用 kubectl proxy

以下命令以代理模式运行 kubectl。它处理定位 apiserver 和进行身份验证。像这样运行它

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 客户端使用根证书。

在某些集群中,apiserver 不需要身份验证;它可能在 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 文件 来定位和向 apiserver 进行身份验证。请参阅此 示例

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

Python 客户端

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

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

其他语言

客户端库 可用于从其他语言访问 API。有关它们如何进行身份验证,请参阅其他库的文档。

从 Pod 访问 API

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

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

访问在集群上运行的服务

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

请求重定向

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

这么多代理

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

  1. kubectl proxy

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

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

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

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

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

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

上次修改时间:2024 年 1 月 1 日下午 9:15 PST:修复多个链接错误 (8b46ec4047)