我希望从本地机器访问 Kubernetes API。我正在尝试使用 kubernetes Rest API 获取 pod 列表。
我在Google Cloud上创建了一个 kubernetes 集群和一些 pod。
在我的本地Windows机器上,我已经安装了gcloud sdk和kubectl组件。 我使用以下方法连接到我的集群:
gcloud container clusters get-credentials my-cluster --region us-central1 --project my-project
我可以使用kubectl get pods
获取 pod 列表
虽然,我想使用 kubernetes Rest API 获取 pods 列表。
GET https://kubernetes.default/api/v1/namespaces/default/pods
Authorization: Bearer my_access_token
但我认为请求没有通过。
在邮递员中,我收到错误:
Error: tunneling socket could not be established, cause=socket hang up
或者在 Python 中使用请求库(从我的本地机器(,我收到错误
HTTPSConnectionPool(host='kubernetes.default', port=443): Max retries exceeded with url: /api/v1/namespaces/default/pods (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000277DCD04D90>: Failed to establish a new connection: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))
我在这里错过了什么?
端点https://kubernetes.default
仅在你想从集群内部(即从另一个pod(访问Kubernetes REST API时才有效。要从 kubernetes 集群外部访问 Kubernetes REST API,即从您的本地机器,您需要使用 API 服务器 IP 或主机,它可以从外部访问,即 kubeconfig 文件中的那个。
要从 kubernetes cruster 外部访问它,即从您的本地机器访问它,有三种方法可以参考此处
的文档在代理模式下运行 kubectl(推荐(。建议使用此方法,因为它使用存储的 apiserver 位置并使用自签名证书验证 API 服务器的身份。使用此方法不可能进行中间人 (MITM( 攻击。
kubectl proxy --port=8080 &
curl http://localhost:8080/api/v1/namespaces/default/pods
通过将身份验证令牌直接传递给 API 服务器,可以避免使用 kubectl 代理,如下所示:
检查所有可能的群集,作为 .KUBECONFIG 可能有多个上下文:
kubectl config view -o jsonpath='{"Cluster nametServern"}{range .clusters[*]}{.name}{"t"}{.cluster.server}{"n"}{end}'
从上面的输出中选择要与之交互的群集名称:
export CLUSTER_NAME="some_server_name"
指向引用群集名称的 API 服务器
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name=="$CLUSTER_NAME")].cluster.server}")
获取令牌值
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes.io/service-account.name']=='default')].data.token}"|base64 --decode)
使用令牌探索 API
curl -X GET $APISERVER/api/v1/namespaces/default/pods --header "Authorization: Bearer $TOKEN" --insecure
- 使用客户端库
若要使用 Python 客户端,请运行以下命令:pip install kubernetes
有关更多安装选项,请参阅 Python 客户端库页面。
Python 客户端可以使用与 CLI 相同的kubeconfig
文件来查找 API 服务器并进行身份验证kubectl
。请参阅此示例:
from kubernetes import client, config
config.load_kube_config()
v1=client.CoreV1Api()
print("Listing pods with their IPs:")
ret = v1.list_pod_for_all_namespaces(watch=False)
for i in ret.items:
print("%st%st%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
你也可以在不使用 kubeconfig 文件的情况下按照你现在的方式去做,但它需要更多的工作,你需要使用 kubeconfig 文件中的 kubernetes API 服务器 IP 或主机名。
使用以下 kubectl 命令启动 Kubernetes API 服务器的代理:
kubectl proxy --port=8080
Get the API versions:
curl http://localhost:8080/api/
The output should look similar to this:
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.2.15:8443"
}
]
}
您的 api 服务器地址对于外部 REST 访问不正确。
像这样获取地址。
kubectl config view
在列表中找到您的集群名称并获取 APi。
这是在我的本地PC中工作的cURL(没有真正的IP或令牌(。
curl --location --request GET 'https://nnn.nnn.nnnn.nnn/api/v1/namespaces/develop/pods'
--header 'Authorization: bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
如果在 POSTMAN 中运行,则可能必须禁用证书验证。