通过serviceAccount的secret访问kubernetes API Server

本文简单介绍如何通过serviceAccount访问kubernetes API server,不会详细介绍serviceAccount、role、 roleBinding、clusterRole以及clusterRoleBinding。

简单描述:serviceAccount与role通过roleBinding或者clusterRoleBinding关联后就获得访问指定资源的权限,就如同我们应用程序中将权限添加一个组(role), 然后让用户(serviceAccount)属于(roleBinding)某个组(role)。

前提

我已经创建了一个yqaccount的serviceAccount,并且将他和cluster-admin role关联了。
创建serviceAccount以及关联的命令如下:

kubectl create serviceaccount yqaccount  # 创建yqaccount serviceAccount

kubectl create clusterrolebinding cluster-admin-yqaccount  --clusterrole=cluster-admin --serviceaccount=default:yqaccount   # 将yqaccount serviceAccount与cluster-admin 进行绑定

备注,我都是在default namespace中操作的,所以不用特别指定namespace

设置环境变量

通过设置环境变量生成方位API server需要的token和整数

export SERVICE_ACCOUNT=yqaccount
export SECRET=$(kubectl get serviceaccount ${SERVICE_ACCOUNT} -o json | jq -Mr '.secrets[].name | select(contains("token"))')
export TOKEN=$(kubectl get secret ${SECRET} -o json | jq -Mr '.data.token' | base64 -d)
kubectl get secret ${SECRET} -o json | jq -Mr '.data["ca.crt"]' | base64 -d > /tmp/ca.crt
export APISERVER=https://$(kubectl -n default get endpoints kubernetes --no-headers | awk '{ print $2 }')

关于jq的用法请参考:https://stedolan.github.io/jq/manual/
这里简单解释一下-Mr, 其中-M表示不带颜色的输出(jq处理的json默认是带颜色输出的), -r表示的原始消息,不需要加上双引号。

nodeEnv1.png

通过curl访问restAPI

列出当前default namespace下的pod, 然后通过jq将其中pod的name打印出来

curl -s $APISERVER/api/v1/namespaces/default/pods/ --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt | jq -rM '.items[].metadata.name'
apiPod-kubectlPod1.png

其他rest API地址可以通查询kubernetes文档得到
API文档 https://kubernetes.io/docs/reference/using-api/api-concepts/

例如,如果我们需要查询指定pod的日志,可以看到对应的api是

额外部分

jq获取secret


jq-token.png

jq获取从secret获取token


jq-secret1.png

jq从secret获取ca证书


jqdoublequot2.png

你可能感兴趣的:(通过serviceAccount的secret访问kubernetes API Server)