將微服務部署在k8s中,使用k8s的服務發現調用另外一個服務的接口。報錯如下:Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. endpoints \"service-bookstar\" is forbidden: User \"system:serviceaccount:ns-booker:default\"
cannot get resource \"endpoints\" in API group \"\" in the namespace \"ns-booker\".", "path": "xxxxxx"
意思是serviceaccount 中 ns-booker:default 沒有權限“get” "endpoints"。權限是“get”對象是“endpoints”。
所以解決辦法是:需要給ns-booker:default賦權get去訪問endpoints。
知識點:k8s RBAC
解決步驟:
1、新建一個clusterrole:endpoints-cluster-role.yaml 如下:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: ns-booker
name: endpoints-reader
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "watch", "list"]
kubectl create -f endpoints-cluster-role.yaml
注意namespce和resources的類型,完整的api-resource使用 kubectl api-resources 查詢
2、添加serviceacount的binding
kubectl create clusterrolebinding endpoints-reader-mydefault \
--clusterrole=endpoints-reader \
--serviceaccount=ns-booker:default
然後就可以順利訪問了。
網上也有使用如下方式解決的,該解決方式是提升權限到cluster-admin,不建議使用。爲了安全應該是需要什麼權限就給什麼權限,不能無限制的提升權限。
kubectl create clusterrolebinding permissive-binding \
--clusterrole=cluster-admin \
--user=admin \
--user=kubelet \
--group=system:serviceaccounts