从本地机器访问 Kubernetes API



我希望从本地机器访问 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 外部访问它,即从您的本地机器访问它,有三种方法可以参考此处

的文档
  1. 在代理模式下运行 kubectl(推荐(。建议使用此方法,因为它使用存储的 apiserver 位置并使用自签名证书验证 API 服务器的身份。使用此方法不可能进行中间人 (MITM( 攻击。

    kubectl proxy --port=8080 &

    curl http://localhost:8080/api/v1/namespaces/default/pods

  2. 通过将身份验证令牌直接传递给 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
  1. 使用客户端库

若要使用 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 中运行,则可能必须禁用证书验证。

相关内容

  • 没有找到相关文章

最新更新