目录
2.get token and sa from secret
# 创建一个服务账号,serviceaccount的shortname就是这个sa.
kubectl create sa ${my-account}
kubectl create rolebinding ${my-rolebinding} --clusterrole=${my-clusterrole} --serviceaccount=${my-account} --namespace=${my-namespace}
事实上,对k8s资源的控制,如限定访问哪些namespace等资源,都通过这个sa所绑定的角色关联,关于角色的绑定,这边不赘述(点击传送)。总之,我们需要准备好一个serviceaccount(下文都使用serviceaccount的shortname sa指代)。
在k8s中创建sa成功(一般需要在k8s集群中提前建立好)后,k8s会同步创建出对应的secret,secret存储了token和证书信息。
# 根据sa name找到对应的secret name
SECRET_NAME=$(kubectl get serviceaccount ${my-account} -n kube-system -o jsonpath='{.secrets[0].name}')
echo $SECRET_NAME
# 直接依据secret name 找到token和CA证书信息(后续创建user需要使用)
# 找到TOKEN
TOKEN=$(kubectl get secret ${SECRET_NAME} -n kube-system -o jsonpath='{.data.token}'|base64 -d)
echo $TOKEN
# 找到CA
CA_CRT=$(kubectl get secret ${SECRET_NAME} -n kube-system -o jsonpath='{.data.ca\.crt }'|base64 -d)
echo $CA_CRT
# create CA file
cat << EOF > k8s-ca.crt
${CA_CRT}
EOF
# config a new cluster
kubectl config set-cluster ${my-cluster} --server=${serverpath} --certificate-authority=./k8s-ca.crt --embed-certs=true
serverpath需要在k8s集群上查看,格式是http://k8s-cluster-host:port
# add user
kubectl config set-credentials ${my-user} --token ${TOKEN}
这里实际上是一个绑定了Token的证书,为了方便理解,我称之为user
# add context
kubectl config set-context ${my-context} --user ${my-user} --cluster ${my-cluster}
context的字面意思是上下文,实际上就是一个将用户(证书)和集群(新添加的你需要访问的)绑定的快捷连接
kubectl cluster-info --context ${my-context} && kubectl get ns --context ${my-context} && kubectl get pods --context ${my-context}
最后这一步是验证配置是否生效的操作,本质是一个查询操作。
当使用--context指定对应的context时,kubectl命令执行从context—>user—>token—>cluster的访问。其中token代表了sa,其中包含了可访问那些资源的权限。