K8S Proxy

上一节讲到现在可以在vps上访问到hello-world了。

然而我想把访问操作放在我的电脑上。我没有想到NodePort这么容易就能做到了。修改一下service.yaml里面port的type,从ClusterIP改为NodePort就可以了。

到这里我已经很满足了,但是手痒痒想要看看dashboard的情况。首先嘛,得先把dashboard服务给启动起来对不对?不幸的是,在之前装microk8s的时候,我使用了这样一行命令添加了dns和dashboard这两个add-on

kubectl enable dns dashboard

结果就是,dashboard其实已经启动了,只是我一直使用的命令

kubectl get svc

只能显示namespace为default的service,就看不到dashboard也已经启动了。

如果想要查看所有的svc还是添加--all-namespaces选项。

ubuntu@VM-0-12-ubuntu:~$ sudo kubectl get svc --all-namespaces
NAMESPACE            NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
container-registry   registry                    NodePort    10.152.183.11    <none>        5000:32000/TCP           13d
default              hello-node                  NodePort    10.152.183.14    <none>        8080:31908/TCP           4d4h
default              kubernetes                  ClusterIP   10.152.183.1     <none>        443/TCP                  13d
kube-system          dashboard-metrics-scraper   ClusterIP   10.152.183.247   <none>        8000/TCP                 13d
kube-system          heapster                    ClusterIP   10.152.183.227   <none>        80/TCP                   13d
kube-system          kube-dns                    ClusterIP   10.152.183.10    <none>        53/UDP,53/TCP,9153/TCP   13d
kube-system          kubernetes-dashboard        NodePort    10.152.183.31    <none>        443:32570/TCP            13d
kube-system          monitoring-grafana          ClusterIP   10.152.183.21    <none>        80/TCP                   13d
kube-system          monitoring-influxdb         ClusterIP   10.152.183.102   <none>        8083/TCP,8086/TCP        13d

但是我发现一个bug,如果我想要删除非default命名空间下的svc,会返回没有这个svc,就很迷幻。估计是不希望用户随便删除系统的svc。所以如果想删除某个非default命名空间下的svc,请用这个命令。以dashboard为例:

kubectl delete svc -n kube-system kubernetes-dashboard

用NodePort暴露出来之后,发现并不能像hello-world那样,通过vas-ip:NodePort访问到dashboard。会返回错误。

This connection is Not Private

This website maybe impersionating ‘vps-ip’ to steal your personcal or financial information. You should go back to the previous page.

后面知道这是关于身份验证的问题。那我又搜索了一番,NodePort的方法行不通,试试github k8s官网给的proxy的方法

kubectl proxy --address=0.0.0.0 --disable-filter=true

使用proxy之后,会在localhost:8001端口监听dashboard请求。这个时候当前的bash就不能使用了:

ubuntu@VM-0-12-ubuntu:~$ sudo kubectl proxy --address=0.0.0.0 --disable-filter=true
W0421 16:42:30.534218   23241 proxy.go:167] Request filter disabled, your proxy is vulnerable to XSRF attacks, please be cautious
Starting to serve on [::]:8001

然后访问以下网址:

http://148.70.35.123:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#/login

就可以看到久违一抹dashboard蓝色。到这里我是很兴奋的。然而……这时候login dashboard需要身份验证。UI上也提示了两种验证方式,一种是local file,另一种是Token。我想Token方便一些吧,然后搜索了一下获取Token的方法:

sudo microk8s.kubectl -n kube-system get secret
NAME                                             TYPE                                  DATA   AGE
kubernetes-dashboard-certs                       Opaque                                0      13d
kubernetes-dashboard-csrf                        Opaque                                1      13d
kubernetes-dashboard-key-holder                  Opaque                                2      13d
kubernetes-dashboard-token-42mpd                 kubernetes.io/service-account-token   3      13d

Microk8s给出的参考,指向到GitHub k8s的官网对Access Control的介绍,用最下面的kubernetes-dashboard-token-42mpd的Token作为login的密钥。

查看Token的具体内容用命令

sudo microk8s.kubectl -n kube-system describe secret kubernetes-dashboard-token-42mpd

就可以看到Token的内容如下:

ubuntu@VM-0-12-ubuntu:~/zecoo$ sudo kubectl -n kube-system describe secret $token
Name:         default-token-nwqdh
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: 20eca024-76ea-4ca7-8fdb-c36594100de8

Type:  kubernetes.io/service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkdlQmtINEEwWmtSVXhsUDA0U000ckJ1alBzZndiNDl5TTNiRml3SWRxeHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkZWZhdWx0LXRva2VuLW53cWRoIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImRlZmF1bHQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyMGVjYTAyNC03NmVhLTRjYTctOGZkYi1jMzY1OTQxMDBkZTgiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06ZGVmYXVsdCJ9.rhSKv7FnCZMXOJrAJie6xNVnQHDxiCdEC1fVLcdEBfPALhvg7vhnNXuyWJjxE_GaLsK3KoUle5cJCXkpbvcAyOeG14b1pRw_V3LoQsdTwEOrpxZ2VIEI9AC09HL4pEX2b9XSERJMUd1Oua-CJu9rScy1yzKJvdp93MfFDQG0WB6RjuDR_o2imsgfWuERgWX1kkLef1hIIXPtLpA5YrFEhTl40NVS9LBaOlNez49hRq1cd2I6Elc9EY3VuQ5GlVgNAtLht_MAPrrpNuzkxpnLvFYJLCbcqYFpexLF0XarQT5JuCD9F8JNWZanZKPv_hd9uk4pfuZ9XVYU5W2yy7GMvg
ca.crt:     1103 bytes

然鹅,我在dashboard UI输入了这串Token,点击login没有任何反应。也不告诉我这串Token是不是出问题了,就是一点反应没有。vps终端倒是有点反应:

2020/04/21 19:03:42 http: proxy error: context canceled

搜索了一下午,果然用Yandex之后搜索效率高了好多。结果就是:目前为止没有方法可以远程访问k8s的dashboard:[][]讨论1讨论2讨论3

但是好像还有另一种方法:–enable-skip-login选项可以在dashboard UI中增加一个Skip按钮,跳过login环节。不过这个环节有可能遭到中间人MITM攻击。我担心把力的vps给搞崩了,先不折腾这个了。详情1详情2

参考

https://www.jianshu.com/p/6f42ac331d8a (RBAC介绍)

https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/1.7.x-and-above.md (k8s官方dashboard介绍)

https://microk8s.io/docs/addon-dashboard (microk8s的dashboard介绍)

https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/README.md#admin-privileges (microk8s指向的k8s access官网)