我已经启动并运行了Kubernetes 1.10群集。使用以下命令,我在集群中创建一个运行bash的容器:
kubectl run tmp-shell --rm -i --tty --image centos -- /bin/bash
我在正在运行的容器中下载了正确版本的kubectl,使其可执行并尝试运行
./kubectl get pods
但收到以下错误:
Error from server (Forbidden): pods is forbidden:
User "system:serviceaccount:default:default" cannot
list pods in the namespace "default"
这是否意味着,kubectl检测到它在群集内运行并自动连接到该群集?如何允许serviceaccount列出pod?我的最终目标是在容器内运行helm
。根据我发现的文档,只要kubectl
工作正常,这应该可以正常工作。
答案 0 :(得分:7)
这是否意味着,kubectl检测到它在集群内部运行并自动连接到该集群?
是的,它使用KUBERNETES_SERVICE_PORT和KUBERNETES_SERVICE_HOST envvars来查找API服务器,并使用自动注入的/var/run/secrets/kubernetes.io/serviceaccount/token
文件中的凭据进行身份验证。
如何允许serviceaccount列出pod?
这取决于您使用的授权模式。如果您使用RBAC(这是典型的),则可以通过创建RoleBinding或ClusterRoleBinding对象来授予该服务帐户的权限。
有关详细信息,请参阅https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions。
我相信helm需要广泛的权限(基本上是群集上的超级用户)。第一步是确定运行的服务帐户helm(检查helm pod中的serviceAccountName
)。然后,要授予该服务帐户的超级用户权限,请运行:
kubectl create clusterrolebinding helm-superuser \
--clusterrole=cluster-admin \
--serviceaccount=$SERVICEACCOUNT_NAMESPACE:$SERVICEACCOUNT_NAME
答案 1 :(得分:0)
True kubectl 将尝试获取与主服务器进行身份验证所需的一切。
但是使用 ClusterRole 和“ cluster-admin ”,您将在该Pod的所有命名空间中赋予无限权限,听起来有些冒险。
对我来说,在Kubernetes容器中为 kubectl 客户端添加额外的 43MB 有点烦人,但替代方法是使用其中一个SDK来实现更多功能基本客户。 kubectl更容易进行身份验证,因为客户端将从/var/run/secrets/kubernetes.io/serviceaccount
获取令牌需求,如果需要,我们可以使用清单文件。我认为对于最常见的Kubernetes设置,您不应该添加任何其他环境变量或附加任何卷秘密,只要您具有正确的ServiceAccount,它就可以工作。
然后您可以测试是否正在使用类似的东西:
$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl get pods -n <YOUR_NAMESPACE>
NAME. READY STATUS RESTARTS AGE
pod1-0 1/1 Running 0 6d17h
pod2-0 1/1 Running 0 6d16h
pod3-0 1/1 Running 0 6d17h
pod3-2 1/1 Running 0 67s
或权限被拒绝
$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:spinupcontainers" cannot list resource "pods" in API group "" in the namespace "kube-system"
command terminated with exit code 1
经过测试:
$ kubectl exec -it <your-container-with-the-attached-privs> -- /kubectl versionClient Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:12:17Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
您可以在How to run kubectl commands inside a container?上查看我的答案,以获取 RoleBinding 和 RBAC 。