访问集群

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

首次使用 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,将 localhost 替换为 [::1](对于 IPv6),如下所示

curl https://127.0.0.1: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 标志。 这使其容易受到 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 proxy

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

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

    • 在每个节点上运行
    • 代理 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)