非root用户执行K3s集群的kubectl命令
在部署 K3s 轻量级 Kubernetes 集群后,默认生成的集群配置文件(kubeconfig)通常位于 /etc/rancher/k3s/k3s.yaml
,且其所有者和权限设定通常只允许 root 用户访问。为了遵循安全最佳实践并在日常管理中使用普通用户执行 kubectl
命令与集群进行交互,我们需要进行一些配置。本文将详细介绍如何让非 root 用户安全、便捷地使用 kubectl
管理 K3s 集群。
背景与目的
K3s 默认安装时,会在服务器上生成一个 kubeconfig 文件,这个文件包含了连接和认证到集群所需的所有信息(API Server 地址、证书、密钥等)。出于安全考虑,这个文件 /etc/rancher/k3s/k3s.yaml
通常被设置为只有 root 用户可读。
直接使用 root 用户执行 kubectl
命令是不推荐的,这会带来不必要的权限风险。我们的目标是配置一个普通用户,让他能够读取这个 kubeconfig 文件,并让 kubectl
命令知道去哪里找到它,从而以该普通用户的身份安全地管理 K3s 集群。
操作步骤详解
下面介绍如何配置普通用户来执行 K3s 集群的 kubectl
命令。假设你的 K3s 集群已经由 root 用户安装并正常运行,并且你已经有一个用于管理的普通用户账号(例如:youruser
)。
1. 确认 K3s Kubeconfig 文件位置及权限
首先,以 root 用户或通过 sudo
确认 K3s 的 kubeconfig 文件是否存在以及其当前的权限设置。
1 | # 确保你有sudo权限或切换到root用户 |
典型输出可能类似这样:
1 | -rw------- 1 root root 6789 Jan 15 10:00 /etc/rancher/k3s/k3s.yaml |
这表明文件 /etc/rancher/k3s/k3s.yaml
属于 root
用户和 root
组,并且只有 root
用户拥有读写权限 (-rw-------
)。
2. 为普通用户创建 .kube
目录
kubectl
默认会在用户主目录下的 .kube
目录中查找名为 config
的 kubeconfig 文件 (~/.kube/config
)。我们需要确保目标普通用户有这个目录。
切换到你的普通用户(或者使用 sudo -u youruser
来执行命令):
1 | # 切换到目标普通用户,例如: |
mkdir -p
会创建目录以及任何必需的父目录,-p
选项可以防止目录已存在时报错。
3. 复制 K3s Kubeconfig 到用户主目录并修改权限
这是关键步骤。我们将/etc/rancher/k3s/k3s.yaml
文件复制到普通用户的 ~/.kube/config
位置。由于源文件需要 root 权限读取,复制操作需要使用 sudo
。复制完成后,文件的新副本将属于普通用户自己。
1 | # 以sudo权限执行复制命令 |
解释:
sudo cp ... ~/.kube/config
: 使用sudo
将 root 拥有的文件复制到主目录下。复制后的文件所有者将是执行sudo cp
的用户(通常如果你没切换用户,还是 root),所以需要下一步的chown
。sudo chown $(id -u):$(id -g) ~/.kube/config
: 将复制后的文件所有者更改为当前用户(普通用户)。$(id -u)
和$(id -g)
会分别获取当前用户的用户ID和组ID。chmod 600 ~/.kube/config
: 设置文件权限为600
,意味着只有文件所有者有读写权限,其他任何用户都没有权限。这是 kubeconfig 文件的标准安全权限设置。
4. 配置 kubectl
使用复制的 kubeconfig 文件
kubectl
找到 kubeconfig 文件的方法有几种:
- 默认位置: 如果你将文件复制到了
~/.kube/config
,kubectl
会自动检测到并使用它,无需额外配置。这是最推荐和最简洁的方式。 KUBECONFIG
环境变量: 你也可以设置KUBECONFIG
环境变量来指定 kubeconfig 文件的路径。这在使用多个 kubeconfig 文件或文件不在默认位置时非常有用。
如果你已经将文件复制到 ~/.kube/config
,通常这一步可以跳过。但如果出于某种原因文件在其他位置,或者你想明确指定,可以在用户 shell 配置文件(如 ~/.bashrc
, ~/.zshrc
等)中添加以下行:
1 | # 编辑你的shell配置文件,比如 .bashrc |
提示: 如果你的shell不是 Bash,请修改对应的配置文件,如
.zshrc
或.profile
。
5. 验证配置是否成功
现在,以普通用户的身份执行 kubectl
命令来验证是否可以正常与 K3s 集群通信。
1 | # 确保当前用户是非root用户 |
如果命令执行成功,显示集群节点信息或集群Endpoint信息,说明非 root 用户已经可以正常使用 kubectl
管理 K3s 集群了。
常见问题排查与建议
kubectl
命令未找到: 确保kubectl
命令已经安装并且在你的用户 PATH 环境变量中。K3s 通常会自动安装一个kubectl
二进制文件到/usr/local/bin/kubectl
。验证下这个路径是否在你的用户 PATH 里,或者直接使用完整路径执行/usr/local/bin/kubectl ...
。Unable to connect to the server: dial tcp ... connect: connection refused
: 这通常意味着kubectl
找到了配置文件,但无法连接到 K3s API Server Endpoint。检查:- K3s 服务是否正在运行 (
sudo systemctl status k3s
)。 - 防火墙是否阻止了到 API Server 端口 (默认 6443) 的连接。
/etc/rancher/k3s/k3s.yaml
中的server
地址是否可达。
- K3s 服务是否正在运行 (
error: error loading config file "~/.kube/config": open /home/youruser/.kube/config: permission denied
: 这种错误表明kubectl
尝试读取~/.kube/config
文件时遇到权限问题。请回到步骤 3,确保~/.kube/config
文件所有者是当前用户,并且权限设置允许用户读取 (如chmod 600
或chmod 644
)。ls -l ~/.kube/config
显示文件属于 root: 回到步骤 3,确认sudo chown $(id -u):$(id -g) ~/.kube/config
命令是否正确执行,将文件所有权赋给了当前用户。- 复制的 kubeconfig 文件内容过期或不正确: 如果 K3s 集群配置发生变化(例如证书轮换),你可能需要重新同步或更新
~/.kube/config
文件。最简单的方法是再次执行步骤 3 的复制命令。
总结
通过将 K3s 生成的 kubeconfig 文件安全地复制到普通用户主目录下的标准位置 (~/.kube/config
),并确保文件的所有权和权限正确设置,我们可以让非 root 用户无须特殊权限即可执行 kubectl
命令,从而实现集群的安全管理。这是一个在生产环境中管理 K3s 或其他 Kubernetes 发行版时非常重要的最佳实践。
希望这篇教程对你有所帮助!欢迎在评论区分享你的经验或遇到的问题。
非root用户执行K3s集群的kubectl命令