从本地计算机访问Kubernetes API

从本地计算机访问Kubernetes API,kubernetes,google-cloud-platform,google-kubernetes-engine,kubectl,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,Kubectl,我希望从本地机器访问Kubernetes API。我正在尝试使用kubernetes Rest API获取POD列表 GET https://kubernetes.default/api/v1/namespaces/default/pods Authorization: Bearer my_access_token 我在谷歌云上创建了一个kubernetes集群和一些豆荚 在我本地的Windows机器上,我已经安装了gcloud sdk和kubectl组件。 我使用以下方式连接到群集: gcl

我希望从本地机器访问Kubernetes API。我正在尝试使用kubernetes Rest API获取POD列表

GET https://kubernetes.default/api/v1/namespaces/default/pods
Authorization: Bearer my_access_token
我在谷歌云上创建了一个kubernetes集群和一些豆荚

在我本地的Windows机器上,我已经安装了gcloud sdk和kubectl组件。 我使用以下方式连接到群集:

gcloud container clusters get-credentials my-cluster --region us-central1 --project my-project
我可以使用
kubectl get pods

尽管如此,我还是希望使用kubernetes Rest API获取pods列表

GET https://kubernetes.default/api/v1/namespaces/default/pods
Authorization: Bearer my_access_token
但是我认为这个请求没有通过

在《邮递员》中,我得到一个错误:

错误:无法建立隧道套接字,原因=套接字挂起

或者在Python中使用请求库(从我的本地机器),我得到了错误

HTTPSConnectionPool(host='kubernetes.default',port=443):url:/api/v1/namespaces/default/pods超过了最大重试次数(由NewConnectionError引起)(':无法建立新连接:[WinError 10060]连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机没有响应。)


这里缺少什么?

使用下面的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"
    }
  ]
}

使用以下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"
    }
  ]
}

端点
https://kubernetes.default
仅当您希望从集群内部(即从另一个pod)访问Kubernetes REST API时才起作用。要从Kubernetes群集外部(即从本地计算机)访问Kubernetes REST API,您需要使用外部可访问的API服务器IP或主机,即kubeconfig文件中的主机

对于从kubernetes外壳外部(即从您的本地机器)访问它,有三种方法引用文档

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

    kubectl代理--端口=8080&

    curlhttp://localhost:8080/api/v1/namespaces/default/pods

  • 通过将身份验证令牌直接传递给API服务器,可以避免使用kubectl代理,如下所示:

  • 检查所有可能的群集,因为.KUBECONFIG可能有多个上下文:

    kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{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
    See以获取更多安装选项

    Python客户端可以使用与
    kubectl
    CLI相同的
    kubeconfig
    文件来定位和验证API服务器。请参见此示例:

    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("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
    

    您也可以不使用kubeconfig文件而按现在的方式执行,但这需要更多的工作,您需要使用kubeconfig文件中的kubernetes API服务器IP或主机名。

    端点
    https://kubernetes.default
    仅当您希望从集群内部(即从另一个pod)访问Kubernetes REST API时才起作用。要从Kubernetes群集外部(即从本地计算机)访问Kubernetes REST API,您需要使用外部可访问的API服务器IP或主机,即kubeconfig文件中的主机

    对于从kubernetes外壳外部(即从您的本地机器)访问它,有三种方法引用文档

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

    kubectl代理--端口=8080&

    curlhttp://localhost:8080/api/v1/namespaces/default/pods

  • 通过将身份验证令牌直接传递给API服务器,可以避免使用kubectl代理,如下所示:

  • 检查所有可能的群集,因为.KUBECONFIG可能有多个上下文:

    kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{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
    See以获取更多安装选项

    Python客户端可以使用与
    kubectl
    CLI相同的
    kubeconfig
    文件来定位和验证API服务器。请参见此示例:

    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("%s\t%s\t%s" % (i.status.pod_ip, i.metadata.namespace, i.metadata.name))
    

    您也可以不使用kubeconfig文件而按现在的方式进行操作,但这需要更多的工作,您需要使用kubeconfig文件中的kubernetes API服务器IP或主机名。

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

    您的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中运行,则可能必须禁用证书验证