运行 集群内的 kubectl
Run kubectl inside a cluster
我有一个 Kubernetes 1.10 集群,运行正在运行。使用以下命令,我在集群中创建了一个容器 运行ning bash:
kubectl run tmp-shell --rm -i --tty --image centos -- /bin/bash
我在 运行ning 容器中下载了正确版本的 kubectl,使其可执行并尝试 运行
./kubectl get pods
但出现以下错误:
Error from server (Forbidden): pods is forbidden:
User "system:serviceaccount:default:default" cannot
list pods in the namespace "default"
这是否意味着 kubectl 检测到它 运行ning 在一个集群中并且自动连接到那个集群?如何允许服务帐户列出 pods?我的最终目标将是 运行 helm
容器内。根据我发现的文档,一旦 kubectl
正常工作,这应该可以正常工作。
Does this mean, that kubectl detected it is running inside a cluster and is automatically connecting to that one?
是的,它使用 KUBERNETES_SERVICE_PORT 和 KUBERNETES_SERVICE_HOST 环境变量来定位 API 服务器,并使用自动注入的 /var/run/secrets/kubernetes.io/serviceaccount/token
文件中的凭据来验证自己。
How do I allow the serviceaccount to list the pods?
这取决于您使用的授权模式。如果您使用的是 RBAC(这是典型的),则可以通过创建 RoleBinding 或 ClusterRoleBinding 对象向该服务帐户授予权限。
有关详细信息,请参阅 https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions。
我认为 helm 需要广泛的权限(基本上是集群上的超级用户)。第一步是确定哪个服务帐户 helm 是 运行(检查 helm pods 中的 serviceAccountName
)。然后,要向该服务帐户授予超级用户权限,运行:
kubectl create clusterrolebinding helm-superuser \
--clusterrole=cluster-admin \
--serviceaccount=$SERVICEACCOUNT_NAMESPACE:$SERVICEACCOUNT_NAME
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"}
您可以在 查看我对 RoleBinding 和 RBAC.
的回答
我有一个 Kubernetes 1.10 集群,运行正在运行。使用以下命令,我在集群中创建了一个容器 运行ning bash:
kubectl run tmp-shell --rm -i --tty --image centos -- /bin/bash
我在 运行ning 容器中下载了正确版本的 kubectl,使其可执行并尝试 运行
./kubectl get pods
但出现以下错误:
Error from server (Forbidden): pods is forbidden:
User "system:serviceaccount:default:default" cannot
list pods in the namespace "default"
这是否意味着 kubectl 检测到它 运行ning 在一个集群中并且自动连接到那个集群?如何允许服务帐户列出 pods?我的最终目标将是 运行 helm
容器内。根据我发现的文档,一旦 kubectl
正常工作,这应该可以正常工作。
Does this mean, that kubectl detected it is running inside a cluster and is automatically connecting to that one?
是的,它使用 KUBERNETES_SERVICE_PORT 和 KUBERNETES_SERVICE_HOST 环境变量来定位 API 服务器,并使用自动注入的 /var/run/secrets/kubernetes.io/serviceaccount/token
文件中的凭据来验证自己。
How do I allow the serviceaccount to list the pods?
这取决于您使用的授权模式。如果您使用的是 RBAC(这是典型的),则可以通过创建 RoleBinding 或 ClusterRoleBinding 对象向该服务帐户授予权限。
有关详细信息,请参阅 https://kubernetes.io/docs/reference/access-authn-authz/rbac/#service-account-permissions。
我认为 helm 需要广泛的权限(基本上是集群上的超级用户)。第一步是确定哪个服务帐户 helm 是 运行(检查 helm pods 中的 serviceAccountName
)。然后,要向该服务帐户授予超级用户权限,运行:
kubectl create clusterrolebinding helm-superuser \
--clusterrole=cluster-admin \
--serviceaccount=$SERVICEACCOUNT_NAMESPACE:$SERVICEACCOUNT_NAME
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"}
您可以在