使用root账户执行kubectl create -f出现Forbidden错误的原因排查
根本原因
切换到root后,kubectl默认使用的配置文件和普通用户不一致。GCP默认的ubuntu用户,其kubectl配置指向Kubernetes集群的API Server(通常存放在~/.kube/config),拥有创建普通Pod的权限。而root用户如果没有继承这个配置,会默认使用kubelet的本地配置(比如/var/lib/kubelet/kubeconfig),这个配置的身份是节点的kubelet进程——master节点上的kubelet被RBAC规则限制,仅能创建mirror pod(用于同步节点静态Pod到集群的特殊Pod),直接创建普通Pod会被API Server拒绝,从而触发你看到的报错。
解决步骤
复制普通用户的kubeconfig到root目录
执行以下命令,将ubuntu用户的集群配置同步给root:cp /home/ubuntu/.kube/config /root/.kube/ chown root:root /root/.kube/config完成后root的kubectl会使用和普通用户相同的集群配置,拥有一致的操作权限。
临时指定kubeconfig路径(无需复制)
每次执行kubectl时,通过环境变量指定正确的配置文件路径:KUBECONFIG=/home/ubuntu/.kube/config kubectl create -f http-go-pod-v2.yaml验证配置有效性
切换到root后执行kubectl config view,确认输出的集群、用户信息和普通用户一致,再尝试创建Pod即可正常执行。
额外说明
mirror pod是Kubernetes用于同步节点静态Pod的特殊资源,仅kubelet有权限创建,且必须携带kubernetes.io/config.mirror注解。普通用户通过API Server创建的Pod不需要该注解,只要让root使用正确的集群kubeconfig,问题就能彻底解决。
内容的提问来源于stack exchange,提问作者Yungi Hong

