访问集群

本文讨论与集群交互的多种方式。

首次使用 kubectl 访问

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

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

使用此命令检查 kubectl 知道的位置和凭据

kubectl config view

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

直接访问 REST API

Kubectl 负责查找 apiserver 并进行身份验证。如果你想使用 curl 或 wget 等 http 客户端,或使用浏览器直接访问 REST API,有几种方法可以查找和进行身份验证

  • 以代理模式运行 kubectl。
    • 推荐方法。
    • 使用存储的 apiserver 位置。
    • 使用自签名证书验证 apiserver 身份。不可能发生 MITM 攻击。
    • 向 apiserver 进行身份验证。
    • 未来,可能会进行智能的客户端负载均衡和故障转移。
  • 直接向 http 客户端提供位置和凭据。
    • 替代方法。
    • 适用于某些因使用代理而混淆的客户端代码类型。
    • 需要将根证书导入浏览器以防止 MITM 攻击。

使用 kubectl proxy

以下命令以反向代理模式运行 kubectl。它负责查找 apiserver 并进行身份验证。像这样运行它

kubectl proxy --port=8080

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

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

curl https://:8080/api/

输出类似于:

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

不使用 kubectl 代理

使用 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 标志。这使其容易受到 MITM 攻击。当 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 代理

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

    • 是内置在 apiserver 中的堡垒机
    • 将集群外部的用户连接到可能无法访问的集群 IP
    • 运行在 apiserver 进程中
    • 客户端到代理使用 HTTPS(如果 apiserver 配置为 http,则使用 http)
    • 代理到目标可以根据可用信息选择使用 HTTP 或 HTTPS
    • 可用于访问 Node、Pod 或 Service
    • 用于访问 Service 时进行负载均衡
  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:修复多处链接错误 (8b46ec4047)