1. 问题复现
在mac使用docker桌面版搭建k8s 成功 但是 kubectl 控制k8s集群命令却无法使用
报错信息如下
使用登录的用户访问
~ kubectl version
W0607 14:32:39.410809 54201 loader.go:221] Config not found: /etc/kubernetes/admin.conf
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
当使用root用户 在执行该命令时又报另一个错误
root@MacBook-Pro ~ # kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.0", GitCommit:"c2b5237ccd9c0f1d600d3072634ca66cefdf272f", GitTreeState:"clean", BuildDate:"2021-08-04T18:03:20Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
2. 定位
既然提示没有 /etc/kubernetes/admin.conf 那我们从用户目录下复制一个
集群搭建完成后 用户目录会有个.kube文件夹 里面包含个config文件
cp ~/.kube/config /etc/kubernetes/admin.conf
复制完在执行 kubectl version 发现显示正常了
~ kubectl version ok at docker-desktop kube at 16:30:27
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.9", GitCommit:"a1a87a0a2bcd605820920c6b0e618a8ab7d117d4", GitTreeState:"clean", BuildDate:"2023-04-12T12:16:51Z", GoVersion:"go1.19.8", Compiler:"gc", Platform:"darwin/amd64"}
Kustomize Version: v4.5.7
Server Version: version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.9", GitCommit:"a1a87a0a2bcd605820920c6b0e618a8ab7d117d4", GitTreeState:"clean", BuildDate:"2023-04-12T12:08:36Z", GoVersion:"go1.19.8", Compiler:"gc", Platform:"linux/amd64"}
此处有个警告 提示使用 kubectl version --output=json
再查看下pods
kubectl -n kube-system get node
NAME STATUS ROLES AGE VERSION
docker-desktop Ready control-plane 133m v1.25.9
显示也是成功的。
这个时候我们再来看下 kubeconfig的路径在环境变量里是在哪里
执行一下命令
echo $KUBECONFIG ok at 17:09:28
/etc/kubernetes/admin.conf
那这个问题就明确了 环境变量中配置的kubeconfig路径在/etc/kubernetes/admin.conf
目录下 而我们生成的配置在用户目录下的.kube的文件夹中 寻找不到配置 就报错了
具体的配置是在root用户下的bash_profile 文件中
root@MacBook-Pro leon # cd ~
root@MacBook-Pro ~ # vim .bash_profile
#jdk
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar
export KUBECONFIG=/etc/kubernetes/admin.conf
可以看到存在KUBECONFIG此配置
3. 解决方案
- 修改该配置的值
root@MacBook-Pro leon # cd ~
root@MacBook-Pro ~ # vim .bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar
#注意 /~/.kube/config 这个config是个文件 而不是一个目录 但配置到这里会被识别为一个目录 故需要复制一个
export KUBECONFIG=/~/.kube/config
故 需要复制一个
cp /~/.kube/config /~/.kube/admin.conf
最后完整的配置如下
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib/dt.jar
export KUBECONFIG=/~/.kube/admin.conf
- 在/etc/kubernetes/ 下 新建 admin.conf 配置 直接将用户下配置 复制到此目录
cp /~/.kube/config /etc/kubernetes/admin.conf
- 修改 /etc/profile 向其中增加配置 全局配置中
#复制用户目录下的配置到指定目录 例如/etc/kubernetes/admin.conf
cp /~/.kube/config /etc/kubernetes/admin.conf
vim /etc/profile
# /etc/kubernetes/admin.conf 修改为如上指定的目录
export KUBECONFIG=/etc/kubernetes/admin.conf
#vim 保存
#使配置生效
source /etc/profile
在开头的问题描述中 使用 root用户 执行 kubetctl version 命令 并没有提示配置文件不存在 直接报错 k8s未启动
在root 用户下 执行 echo $KUBECONFIG 命令输出为空
- 当使用了zsh 时也可以将此配置放到 /~/.zshrc 文件中 表示用户级别的配置 但是root用户看不到此配置
- 如果希望root 登录就看到此配置 可以将该配置放到 /var/root/.zshrc 配置中 表示zsh的root用户的配置
- 如果希望 全局配置 那么可以放到 /etc/zshrc 下进行配置
注意root 登录下的配置 /var/root/.zshrc 优先级 大于 /etc/zshrc (可自行测试)
4.方案延伸
以上是环境变量中kube配置 下 不存在的问题 以及一些解决办法
但是 k8s启动成功却无法访问 可能还有其他的原因
- k8s集群中的系统pods报错 入 apiserver / etcd 等 需要看具体日志具体排查
- k8s的client (kubectl)和 k8s server 版本不匹配 或者版本相差过大