如何从pod容器中访问Kubernetes api?

我曾经可以curl

https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1beta3/namespaces/default/ 

作为我的基本url,但在kubernetes 0.18.0它给了我“未经授权的”。 奇怪的是,如果我使用API​​机器的外部IP地址( http://172.17.8.101:8080/api/v1beta3/namespaces/default/ ),它工作得很好。

在官方文档中我发现这个:

https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#accessing-the-api-from-a-pod

显然,我错过了一个我以前版本的Kubernetes中不需要的安全令牌。 从那以后,我devise了我认为比运行代理或在我的容器上安装golang更简单的解决scheme。 看到这个例子从api获取当前容器的信息:

 KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token) curl -sSk -H "Authorization: Bearer $KUBE_TOKEN" \ https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME 

我还使用包括一个简单的二进制,jq( http://stedolan.github.io/jq/download/ )来parsingJSON在bash脚本中使用。

每个吊舱都有一个自动应用的服务帐户,允许它访问apiserver。 该服务帐户提供不记名令牌forms的客户端凭证以及用于签署由apiserver呈现的证书的authentication中心证书。 有了这两个信息,你可以创build一个安全的,authentication的apisever连接,而不使用curl -k (又名curl --insecure ):

 curl -v --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes/ 

从pod内部,可以通过“ https://kubernetes.default ”直接访问kubernetes api服务器。 默认情况下,它使用“默认服务帐户”来访问api服务器。

所以,我们还需要通过“ca cert”和“default service account token”来validationapi服务器。

证书文件存储在pod中的以下位置:/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

和默认服务帐户令牌:/var/run/secrets/kubernetes.io/serviceaccount/token

您可以使用nodejs kubbernetes godaddy客户端 。

 let getRequestInfo = () => { return { url: "https://kubernetes.default", ca: fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/ca.crt').toString(), auth: { bearer: fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/token').toString(), }, timeout: 1500 }; } let initK8objs = () =>{ k8obj = getRequestInfo(); k8score = new Api.Core(k8obj), k8s = new Api.Api(k8obj); } 

使用Python kubernetes客户端..

 from kubernetes import client, config config.load_incluster_config() v1_core = client.CoreV1Api() 
 curl -v -cacert <path to>/ca.crt --cert <path to>/kubernetes-node.crt --key <path to>/kubernetes-node.key https://<ip:port> 

我的k8s版本是1.2.0,而在其他版本中,它应该也能工作^^

任何使用Google Container Engine(由Kubernetes提供支持)的用户:

使用此kubernetes客户端Java的集群内的简单调用https://kubernetes工作。

wget版本:

 KUBE_TOKEN=$(</var/run/secrets/kubernetes.io/serviceaccount/token) wget -vO- --ca-certificate /var/run/secrets/kubernetes.io/serviceaccount/ca.crt --header "Authorization: Bearer $KUBE_TOKEN" https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_PORT_443_TCP_PORT/api/v1/namespaces/default/pods/$HOSTNAME