TechTalk

microk8s Dashboard遇坑记

字数统计: 1.3k阅读时长: 5 min
2020/02/10

前言

在mac上通过multipass安装好Ubuntu后,开始microk8s之旅。按照microk8s的教程,可以先启动dashboard玩玩,索性就按照官方的教程走了。本文记录的是在安装 dashboard过程中遇到的一些坑。

服务无法启动

按照官方给的教程,开启dashboard,以为这样就可以了。

1
ubuntu@microk8s-vm2:~$ microk8s.enable dashboard

然后查看仪表盘的pod。
1
2
3
4
5
6
7
ubuntu@microk8s-vm2:~$ microk8s.kubectl get pods --all-namespaces 
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7b67f9f8c-nqj2x 0/1 ContainerCreating 0 4m41s
kube-system dashboard-metrics-scraper-687667bb6c-pdfbq 0/1 ContainerCreating 0 58s
kube-system heapster-v1.5.2-5c58f64f8b-6bdjs 0/4 ContainerCreating 0 57s
kube-system kubernetes-dashboard-5c848cc544-26gt8 0/1 ContainerCreating 0 58s
kube-system monitoring-influxdb-grafana-v4-6d599df6bf-j4bq7 0/2 ContainerCreating 0 58s

发现pod的状态并不是期望的running状态而是ContainerCreating容器创建阶段。
查看kubernetes-dashboard pod的状态。
1
2
3
4
5
6
7
8
microk8s.kubectl describe pod/kubernetes-dashboard-5c848cc544-26gt8 --namespace kube-system
...

Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 95s default-scheduler Successfully assigned kube-system/kubernetes-dashboard-5c848cc544-26gt8 to microk8s-vm2
Warning FailedCreatePodSandBox 21s (x2 over 64s) kubelet, microk8s-vm2 Failed to create pod sandbox: rpc error: code = Unknown desc = failed to get sandbox image "k8s.gcr.io/pause:3.1": failed to pull image "k8s.gcr.io/pause:3.1": failed to resolve image "k8s.gcr.io/pause:3.1": no available registry endpoint: failed to do request: Head https://k8s.gcr.io/v2/pause/manifests/3.1: dial tcp 64.233.189.82:443: i/o timeout

从Events中的Message可以看出容器是要由于镜像无法下载下来导致的。从网上搜索一下,发现由于k8s.gcr.io域名无法访问,导致容器创建不出来。
通过一番折腾,发现hub.docker.com已经克隆了k8s.gcr.io相关的容器,提供给大家使用,因此,只要用docker把镜像下载下来然后重新命名就好了。
通过这个gist来下载并重命名容器。
然后重新disable/enable仪表盘后发现仍然没有好用。
然后在网上再一次搜索后,microk8s的页面介绍并没有注册的docker image是不会被k8s使用的,需要export and import才行。

The image we created is known to Docker. However, Kubernetes is not aware of the newly built image. This is because your local Docker daemon is not part of the MicroK8s Kubernetes cluster. We can export the built image from the local Docker daemon and “inject” it into the MicroK8s image cache like this:

1
2
docker save mynginx > myimage.tar
microk8s.ctr image import myimage.tar

因此,在通过一番脚本操作后,将docker image导出到本地,然后在导入到k8s环境中,相关操作在这个gist中描述。
再次查看dashboard的pod状态,运行起来的pod的状态是这样的:
1
2
3
4
5
6
7
#microk8s.kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7b67f9f8c-bw2h8 1/1 Running 0 22h
kube-system dashboard-metrics-scraper-687667bb6c-vhzp4 1/1 Running 0 3h33m
kube-system heapster-v1.5.2-5c58f64f8b-xz55d 2/4 ImagePullBackOff 0 3h33m
kube-system kubernetes-dashboard-5c848cc544-bpf2g 1/1 Running 0 3h33m
kube-system monitoring-influxdb-grafana-v4-6d599df6bf-6jpq8 0/2 ImagePullBackOff 0 3h33m

接下来即将跳入第二个坑。

访问地址问题

然后在通过官方给的教程,通过port-forward来启动端口转发功能

1
# microk8s.kubectl port-forward -n kube-system service/kubernetes-dashboard 10443:443 --address 0.0.0.0

通过浏览器访问ubuntu的dashboard url:

192.168.64.7:10443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
浏览器显示为>

1
client sent an http request to an https server

这是什么鬼,通过一番折腾后发现来proxy命令。
1
# microk8s.kubectl proxy --address 0.0.0.0

这次终于能够在浏览器上看到久违的dashboard的鉴权界面
k8s-dashboard
然而这不是故事的结束。

访问地址限制

当我兴高采烈的拿到token信息,输入到web上的时候。

1
2
token=$(microk8s.kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s.kubectl -n kube-system describe secret $token

然而并没有发生什么。页面没有提示错误,也没有跳转到仪表盘中。
让然停留在输入token的页面,就像没有输入一样。
我以为浏览器或者网络还有什么问题没有解决,因此我检查了该页面的控制台以及网络传输中是否有错误信息存在,结果一切都很安静,并没有报错,也没有异常存在,因此我再次陷入来久久的沉思😔。
再一次折腾谷歌,没有多一会在dashboard的issue list中找到了曙光。https://github.com/kubernetes/dashboard/issues/2735

NOTE: Dashboard should not be exposed publicly using kubectl proxy command as it only allows HTTP connection. For domains other than localhost and 127.0.0.1 it will not be possible to sign in. Nothing will happen after clicking Sign in button on login page.

也就是说dashboard的访问只能给127.0.0.0.1这个地址。其他地址无效。
这个帖子的下面提到来解决版本,那就是伟大的ssl端口转发功能。

1
ssh -L 127.0.0.1:8001:192.168.64.7:8001 ubuntu@192.168.64.7

再次访问dashboard url,bull-eyes!!! 正中靶心,🍺🎉🎉
1
localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

k8s-dashboard

总结

折腾microk8s需要耐心也考验对问题的剖析以及推断的能力,遇到事情不放弃,从各种蛛丝马迹中找到可以突破的点。
同时吐槽一下microk8s的项目,项目很优秀,但是文档并没有太多的具有排障能力,嗯,也有可能我太弱鸡了。

CATALOG
  1. 1. 前言
  2. 2. 服务无法启动
  3. 3. 访问地址问题
  4. 4. 访问地址限制
  5. 5. 总结