mac docker桌面版k8s启动成功却无法访问

1. 问题复现

在mac使用docker桌面版搭建k8s 成功 但是 kubectl 控制k8s集群命令却无法使用

mac docker桌面版k8s启动成功却无法访问_第1张图片

报错信息如下
使用登录的用户访问

 ~  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 版本不匹配 或者版本相差过大

你可能感兴趣的:(kubenetes,docker,kubernetes,macos)