1. K3s 普通用户 kubectl 报权限错误,到底卡在哪
刚装完 K3s 的人,十有八九会撞上同一个场景:k3s server跑起来了,sudo k3s kubectl get nodes也能看到节点,可一旦切回普通用户敲kubectl get nodes,立刻甩你一脸permission denied或者The connection to the server localhost:8080 was refused。这不是集群坏了,而是 K3s 生成的 kubeconfig 文件/etc/rancher/k3s/k3s.yaml默认权限是600,属主是 root,普通用户根本读不到。
更隐蔽的坑在远程访问。你把 kubeconfig 拷到本地开发机,kubectl却一直连127.0.0.1:6443,因为文件里的server字段写死的是回环地址。K3s 安装时并不知道你打算从哪台机器连过来,所以它只保证本机 root 能用。于是很多人开始翻文档、改权限、改 IP,改完一个又冒一个,来回折腾。
这篇就按排障视角走一遍:用 TaoToken 接入的 Codex 在本地帮你对照k3s.yaml,把权限、拷贝命令、server 地址三件事一次理清。注意,Codex 在这里只做“读文件、给命令、核对路径”的活,它不会去连你的 K3s 集群,集群操作始终在你自己的终端里执行。适合刚接触 K3s、被 kubeconfig 权限卡住的运维和开发同学。
2. 前置:给 Codex 配好 TaoToken 的 Key 和 Base URL
TaoToken 在这个流程里的角色很单纯:给 Codex 提供调用大模型所需的 API Key 和 Base URL。你不需要它去碰集群,也不需要它做任何转发,它只负责让 Codex 能正常对话、能读你贴进去的配置片段。
先打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建一个 Key。创建入口在控制台的 API Keys 页面,建议单独建一个给 Codex 用的 Key,方便后面按项目区分额度。拿到形如sk-开头的字符串后先存好,页面刷新就不再完整显示。
接着把 Codex 的 Base URL 指向https://taotoken.net/api。不同客户端的配置字段名不太一样,但核心就两项:base_url和api_key。如果你用的是命令行版 Codex,通常写在~/.codex/config.toml或环境变量里;如果是编辑器插件,就在设置面板里找 OpenAI Compatible / Custom Endpoint 这类选项。
| 配置项 | 填写值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不要带结尾斜杠 |
| API Key | 控制台创建的sk-... | 单独建 Key 便于管理 |
| Model | 按控制台可用列表选 | 排障场景普通模型即可 |
配好后先在 Codex 里发一句“你好”确认能通。这一步通了,后面让它读 kubeconfig 片段才有意义。如果这里就报 401,先回控制台核对 Key 是否复制完整,别急着去查 K3s。
3. 可复制配置:让 Codex 对照 k3s.yaml 逐项核对
真正开始排障时,不要一上来就让 Codex “帮我修好 K3s”。正确姿势是把k3s.yaml的内容贴给它,让它逐字段解释并给出对应命令。你可以先在服务器上执行下面这条,把文件内容打印出来:
sudo cat /etc/rancher/k3s/k3s.yaml输出大概长这样,重点看server和文件权限:
apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0tLS1CRUdJTi... server: https://127.0.0.1:6443 name: default contexts: - context: cluster: default user: default name: default current-context: default kind: Config preferences: {} users: - name: default user: client-certificate-data: LS0tLS1CRUdJTi... client-key-data: LS0tLS1CRUdJTi...把这段贴给 Codex,并附上你的报错原文,比如error: You must be logged in to the server (Unauthorized)或permission denied。然后给它一个明确指令:只解释权限、拷贝命令、server 地址三处,不要建议连接集群。它通常会告诉你:文件属主 root、权限 600,普通用户读不了;server是127.0.0.1,远程机器连不上。
接下来按它给的顺序在终端执行。第一步拷贝并改属主:
mkdir -p ~/.kube sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config sudo chown $(id -u):$(id -g) ~/.kube/config chmod 600 ~/.kube/config第二步,如果你只在服务器本机用,到这就够了,kubectl get nodes应该能出结果。如果要远程访问,需要改server地址。这里有个细节:直接改~/.kube/config里的 IP 就行,但更规范的做法是复制一份再改,避免污染本机配置。
cp ~/.kube/config ~/.kube/config-remote sed -i 's/127.0.0.1/你的节点IP/g' ~/.kube/config-remote把你的节点IP换成 Server 节点的内网或公网地址。改完把config-remote拷到本地开发机的~/.kube/config,再设好KUBECONFIG环境变量指向它。Codex 在这一步能帮你核对:IP 有没有写错、端口是不是 6443、certificate-authority-data有没有被截断。
注意:
certificate-authority-data和client-certificate-data都是 base64 长串,复制时极易漏字符。让 Codex 帮你数一下长度、对比首尾,比肉眼靠谱。
4. 验证请求:kubectl get nodes 跑通与远程访问确认
配置改完必须验证,否则你不知道是权限问题还是网络问题。先在服务器本机、用普通用户执行:
kubectl get nodes正常输出类似:
NAME STATUS ROLES AGE VERSION k3s-svr Ready control-plane,master 10m v1.28.4+k3s1如果这里还报permission denied,说明~/.kube/config的属主或权限没改对,回去检查ls -l ~/.kube/config,应该是你的用户名、-rw-------。如果报connection refused,说明server地址或端口不对,或者 K3s 服务没起来,用sudo systemctl status k3s看一眼。
本机通了之后,到远程开发机上执行同样的kubectl get nodes。这一步能出节点列表,说明 server 地址改对了、6443 端口可达、证书也匹配。如果卡在Unable to connect to the server,先在开发机上telnet 节点IP 6443或nc -zv 节点IP 6443测端口通不通。端口不通多半是防火墙或安全组没放行 6443。
还有一个容易忽略的点:K3s 的 API Server 证书默认只签了127.0.0.1和节点主机名。你用 IP 远程连,可能报x509: certificate is valid for ...。解决办法是在安装 K3s 时加--tls-san 你的节点IP,已经装好的可以改/etc/systemd/system/k3s.service里的启动参数再重启。Codex 能帮你确认报错里证书覆盖了哪些地址,但改参数、重启服务还是你自己来。
5. 本篇常见错排查
排障过程中高频出现的几个错,按顺序对一遍基本能定位。
第一个是The connection to the server localhost:8080 was refused。这通常意味着kubectl根本没读到 kubeconfig,它在用默认的localhost:8080。检查KUBECONFIG环境变量是否指向了正确文件,或者~/.kube/config是否存在。K3s 自带的k3s kubectl会默认读/etc/rancher/k3s/k3s.yaml,所以sudo k3s kubectl能用而kubectl不能用,就是这个原因。
第二个是error: You must be logged in to the server (Unauthorized)。这多半是client-certificate-data或client-key-data在复制、sed 替换过程中被破坏。重新从/etc/rancher/k3s/k3s.yaml拷一份,只改server字段,别动证书字段。
第三个是远程连不上但端口通。除了上面说的--tls-san,还要确认你改的是clusters[].cluster.server,而不是contexts里的名字。有人把name: default也改了,结果上下文对不上。
第四个是~/.kube/config权限过宽被 kubectl 拒绝。kubectl 对 kubeconfig 权限有要求,chmod 600是必须的,644在某些版本会直接报错。
提示:每次改完配置,先
kubectl config view看当前生效的配置,再kubectl get nodes。两步分开,能快速区分是配置没生效还是连接失败。
如果以上都试过还不行,把kubectl get nodes -v=6的详细日志贴给 Codex,让它帮你读请求到底发去了哪个地址、用了哪份证书。记住,Codex 只做日志解读和命令建议,实际执行和集群状态判断始终在你手里。
6. 后续怎么用:把排障经验固化下来
kubeconfig 权限这类问题,第一次踩坑花半小时,第二次就该五分钟解决。建议你把这次核对过的命令存成一个脚本,比如fix-k3s-kubeconfig.sh,里面就三件事:拷贝、改属主、按需替换 server 地址。下次换机器直接跑,不用再翻聊天记录。
Codex 这边,如果你经常要读 K3s 的报错日志、对照 YAML 配置,可以考虑用 TaoToken 的 Coding Plan 把额度固定下来,长期做这类本地辅助更顺手。需要看模型当前支持哪些能力,可以去模型对话页面直接试;要管理多个项目的 Key,就在 API Keys 页面按项目分开建。接入文档里对 Base URL 和鉴权头写得比较细,遇到 401、404 先翻文档比瞎试快。
最后留一个我自己的习惯:每次改完 kubeconfig,先在本机kubectl get nodes,再在远程kubectl get nodes,两个都过才算完。别只测一边,远程访问的坑往往就藏在“本机好了”的错觉里。