k8s服务调用报错MessageForbidden!Configured service account doesnt have access.

将微服务部署在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	

 

你可能感兴趣的:(k8s)