访问群集
本主题讨论了与集群交互的多种方式。
首次使用 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 apply
和 kubectl 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 正式支持 Go 和 Python 客户端库。
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 时,您可能会遇到几种不同的代理
The kubectl proxy
- 运行在用户的桌面上或 Pod 中
- 从 localhost 地址代理到 Kubernetes API 服务器
- 客户端到代理使用 HTTP
- 代理到 API 服务器使用 HTTPS
- 定位 API 服务器
- 添加身份验证头
The apiserver proxy
- 是内置在 API 服务器中的一个堡垒
- 将集群外部的用户连接到集群 IP,否则这些 IP 可能无法访问
- 在 API 服务器进程中运行
- 客户端到代理使用 HTTPS(如果 API 服务器如此配置,则使用 http)
- 代理到目标可能使用 HTTP 或 HTTPS,具体取决于代理使用可用信息的选择
- 可用于访问节点、Pod 或服务
- 在用于访问服务时进行负载均衡
The kube proxy
- 运行在每个节点上
- 代理 UDP 和 TCP
- 不理解 HTTP
- 提供负载均衡
- 仅用于访问服务
API 服务器前方的代理/负载均衡器
- 存在和实现因集群而异(例如 nginx)
- 位于所有客户端和一个或多个 API 服务器之间
- 如果有多个 API 服务器,则充当负载均衡器。
外部服务上的云负载均衡器
- 由某些云提供商提供(例如 AWS ELB、Google Cloud Load Balancer)
- 当 Kubernetes 服务类型为
LoadBalancer
时,会自动创建 - 仅使用 UDP/TCP
- 实现方式因云提供商而异。
Kubernetes 用户通常不需要担心除前两种类型之外的任何其他类型。集群管理员通常会确保后两种类型正确设置。