如何从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