创建部署问题时,请参考下面模板,你提供的信息越多,越容易及时获得解答。如果未按模板创建问题,管理员有权关闭问题。
确保帖子格式清晰易读,用 markdown code block 语法格式化代码块。
你只花一分钟创建的问题,不能指望别人花上半个小时给你解答。

操作系统信息
例如:虚拟机/物理机,Centos7.5/Ubuntu18.04,4C/8G

Kubernetes版本信息
kubectl version 命令执行结果贴在下方

容器运行时
docker version / crictl version / nerdctl version 结果贴在下方

KubeSphere版本信息
例如:v2.1.1/v3.0.0。离线安装还是在线安装。在已有K8s上安装还是使用kk安装。

问题是什么
# sudo -E /bin/bash -c “export ETCDCTL_API=2;export ETCDCTL_CERT_FILE=‘/etc/ssl/etcd/ssl/admin-node1.pem’;export ETCDCTL_KEY_FILE=‘/etc/ssl/etcd/ssl/admin-node1-key.pem’;export ETCDCTL_CA_FILE=‘/etc/ssl/etcd/ssl/ca.pem’;/usr/local/bin/etcdctl –endpoints=https://172.16.73.33:2379 cluster-health | grep -q ‘cluster is healthy’”

Error: client: etcd cluster is unavailable or misconfigured; error #0: Forbidden

/bin/bash -c “export ETCDCTL_API=2;export ETCDCTL_CERT_FILE=‘/etc/ssl/etcd/ssl/admin-node1.pem’;export ETCDCTL_KEY_FILE=‘/etc/ssl/etcd/ssl/admin-node1-key.pem’;export ETCDCTL_CA_FILE=‘/etc/ssl/etcd/ssl/ca.pem’;/usr/local/bin/etcdctl –endpoints=https://172.16.73.33:2379 cluster-health | grep -q ‘cluster is healthy’”这样执行正常

sudo /bin/bash -c “export ETCDCTL_API=2;export ETCDCTL_CERT_FILE=‘/etc/ssl/etcd/ssl/admin-node1.pem’;export ETCDCTL_KEY_FILE=‘/etc/ssl/etcd/ssl/admin-node1-key.pem’;export ETCDCTL_CA_FILE=‘/etc/ssl/etcd/ssl/ca.pem’;/usr/local/bin/etcdctl –endpoints=https://172.16.73.33:2379 cluster-health | grep -q ‘cluster is healthy’”这样就不能执行了

怎么回事呢

    gaochaofeng

    既然直接运行不带 sudo 的命令能够正常工作,那么问题可能出在 sudo 的使用上。当使用 sudo 时,环境变量通常不会被保留,除非你在 sudo 命令中显式地指定了它们。

    以下是一些可能的解决方案:

    1. 使用 -E 选项保留环境变量
      虽然你已经使用了 -E 选项,但请确保 sudo 配置文件(通常是 /etc/sudoers)中没有 env_resetenv_check 之类的选项,它们可能会覆盖 -E

    2. 在 sudoers 文件中配置
      你可以在 /etc/sudoers 文件中为特定用户或命令配置环境变量保留。例如,你可以添加一行来允许特定用户保留所有环境变量:

      $$
      bash复制代码Defaults:your_username env_keep += “ETCDCTL_API ETCDCTL_CERT_FILE ETCDCTL_KEY_FILE ETCDCTL_CA_FILE”
      $$

      替换 your_username 为你的用户名。

    3. 直接在 sudo 命令中设置环境变量
      另一种方法是在 sudo 命令中直接设置环境变量,而不是使用 -E 选项。这可以通过 sudo -E bash -c '...' 的方式实现,但你已经这样做了,所以问题可能不在于此。然而,你可以尝试将环境变量直接设置在 bash -c 的引号内,例如:

      $$
      bash复制代码sudo bash -c ‘export ETCDCTL_API=2; export ETCDCTL_CERT_FILE=“/etc/ssl/etcd/ssl/admin-node1.pem”; export ETCDCTL_KEY_FILE=“/etc/ssl/etcd/ssl/admin-node1-key.pem”; export ETCDCTL_CA_FILE=“/etc/ssl/etcd/ssl/ca.pem”; /usr/local/bin/etcdctl –endpoints=https://172.16.73.33:2379 cluster-health | grep -q “cluster is healthy”’
      $$

    4. 检查 sudo 缓存
      在某些情况下,sudo 可能由于缓存问题而不起作用。尝试使用 sudo -k 来重置时间戳,并再次运行命令。

    5. 确保 sudoers 配置正确
      使用 sudo -l 查看当前用户的 sudo 权限,确保没有禁止你运行这个特定的命令。

    6. 使用绝对路径
      sudo 命令中,尽量使用命令的绝对路径,以确保没有 PATH 环境变量导致的问题。

    7. 检查 SELinux/AppArmor
      如果你的系统使用了 SELinux 或 AppArmor 这样的安全模块,确保它们没有阻止 sudo 命令的执行。

    8. 检查 etcdctl 和 etcd 版本
      确保你使用的 etcdctl 版本与 etcd 集群的版本兼容。

    即可解决了