宿主机如何通过kubectl访问Vagrant内部署的MicroK8s集群?
问题背景
在Vagrant环境中通过以下命令部署基于MicroK8s的Kubeflow集群:
sudo apt-get update sudo apt-get upgrade sudo snap install microk8s --classic --channel=1.21/stable sudo usermod -a -G microk8s $USER newgrp microk8s sudo chown -f -R $USER ~/.kube microk8s enable dns storage ingress metallb:10.64.140.43-10.64.140.49 microk8s config > ~/.kube/config sudo snap install juju --classic juju bootstrap microk8s mycontroler juju add-model kubeflow juju deploy kubeflow-lite --trust microk8s kubectl patch role -n kubeflow istio-ingressgateway-operator -p '{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"name":"istio-ingressgateway-operator"},"rules":[{"apiGroups":["*"],"resources":["*"],"verbs":["*"]}]}' juju config dex-auth public-url=http://10.64.140.43.nip.io juju config oidc-gatekeeper public-url=http://10.64.140.43.nip.io juju config dex-auth static-username=admin juju config dex-auth static-password=admin
已完成的前置操作:
- 将Vagrant虚拟机内的
~/.kube/config文件复制到宿主机 - 执行
ssh -D 9999 vagrant@10.64.140.43建立指向Vagrant环境的SOCKS代理
故障现象: - 宿主机访问
http://10.64.140.43.nip.io返回403错误 - 宿主机无法使用kubectl连接该K8s集群
解决步骤
修复宿主机kubectl连接问题
- 修正kubeconfig中的服务地址
MicroK8s默认生成的config中,apiserver地址默认写的是https://127.0.0.1:16443,该地址在宿主机上指向宿主机自身而非Vagrant虚拟机。打开宿主机上的~/.kube/config,找到对应cluster下的server字段,将IP替换为Vagrant虚拟机的可达IP10.64.140.43,即修改为https://10.64.140.43:16443。 - 配置kubectl走SOCKS代理
执行以下命令让当前终端的kubectl流量走已建立的SOCKS隧道:
如需永久生效,将上述环境变量写入本机shell配置文件(如export HTTPS_PROXY=socks5://127.0.0.1:9999~/.bashrc、~/.zshrc)即可。 - 跳过TLS证书校验(可选)
如果修改IP后报证书SAN不匹配错误,在宿主机kubeconfig对应cluster的配置段下添加insecure-skip-tls-verify: true即可临时跳过校验。
修复Kubeflow入口403问题
- 确认组件部署状态
先在Vagrant虚拟机内执行以下命令,确认kubeflow命名空间下所有Pod均为Running状态:
重点确认microk8s kubectl get pods -n kubeflowistio-ingressgateway、dex-auth、oidc-gatekeeper三类组件Pod正常运行,存在未启动的Pod时先等待部署完成,或查看对应Pod日志排查启动故障。 - 核对Ingress网关地址配置
执行以下命令查看istio网关的外部分配IP:
记录microk8s kubectl get svc -n kubeflow istio-ingressgatewayEXTERNAL-IP字段的值,确认该值与dex、oidc配置的public-url地址一致。如果分配的IP不是10.64.140.43,重新执行配置命令将public-url替换为对应IP的nip.io域名,例如分配IP为10.64.140.44时,执行:juju config dex-auth public-url=http://10.64.140.44.nip.io juju config oidc-gatekeeper public-url=http://10.64.140.44.nip.io - 修正浏览器代理配置
访问nip.io域名时,必须将浏览器代理配置为走127.0.0.1:9999的SOCKS5代理,同时关闭代理工具的"本地地址直连"规则,将*.nip.io从代理绕过列表中移除,避免请求直连公网而非Vagrant环境。 - 检查Istio授权策略
执行以下命令查看集群内的授权策略:
如果存在作用于istio-ingressgateway的deny类型策略,先删除策略后重试访问。microk8s kubectl get authorizationpolicy -A - 确认静态账号配置生效
如果403来自dex登录页面,重新执行静态账号配置命令,等待dex组件Pod重启完成后,使用admin/admin账号登录即可。
内容的提问来源于stack exchange,提问作者Tlaloc-ES
相关产品推荐
相关产品推荐

