本文简单介绍如何通过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表示的原始消息,不需要加上双引号。
通过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'
其他rest API地址可以通查询kubernetes文档得到
API文档 https://kubernetes.io/docs/reference/using-api/api-concepts/
例如,如果我们需要查询指定pod的日志,可以看到对应的api是
额外部分
jq获取secret
jq获取从secret获取token
jq从secret获取ca证书