Kubernetes dashboard提供外部访问的方式有多种(端口映射、代理、NodePort、LoadBalancer、Ingress)。尽管Dashboard的流量很小,没有必要通过 Ingress 来提供访问,但Dashboard服务是一个很好的现成的服务,可以用来练习Ingress的使用和配置。
本文内容包括:安装Ingress、配置加密参数、安装Dashboard的Ingress路由等几个步骤。
1、安装 Kubernetes Dashboard
Kubernetes Dashboard是Kubernetes的可视化管理Web界面,安装参考:
- 官方文档(英),
- 安装实践(中),
这里我们将其通过Ingress设置,管理者可以通过Https进行访问,而且不需要端口映射,更符合通常的Web服务访问模式。
2、安装 Ingress controller
Ingress已是Kubernetes内置的网络入口服务,但其实现引擎需要单独安装。
- Kubernetes官方的Ingress文档,
- 安装基于Nginx的Ingress Controller实现,
- 注意:把
values.yaml里面的hostnetwork改为true,因为ingress要使用主机网络。
- 注意:把
3、创建和安装加密访问凭证
通过https进行访问必需要使用证书和密钥,在Kubernetes中可以通过配置一个加密凭证(TLS secret)来提供。
3.1 创建 tls secret
这里只是拿来自己使用,创建一个自己签名的证书。如果是公共服务,建议去数字证书颁发机构去申请一个正式的数字证书(需要一些服务费用);或者使用Let's encrypt去申请一个免费的(后面有介绍);如果使用Cloudflare可以自动生成证书和https转接服务,但是需要将域名迁移过去,高级功能是收费的。
#https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/examples/tls/README.mdopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./tls.key -out ./tls.crt -subj "/CN=192.168.199.230"
将会产生两个文件tls.key和tls.crt,你可以改成自己的文件名或放在特定的目录下(如果你是为公共服务器创建的,请保证这个不会被别人访问到)。后面的192.168.199.230是我的服务器IP地址,你可以改成自己的。
3.2 安装 tls secret
下一步,将这两个文件的信息创建为一个Kubernetes的secret访问凭证,我将名称指定为 k8s-dashboard-secret ,这在后面的Ingress配置时将会用到。如果你修改了这个名字,注意后面的Ingress配置yaml文件也需要同步修改。
kubectl -n kube-system create secret tls k8s-dashboard-secret --key ./tls.key --cert ./tls.crt
- 注意:
- 上面命令的参数 -n 指定凭证安装的命名空间。
- 为了安全考虑,Ingress所有的资源(凭证、路由、服务)必须在同一个命名空间。
4、配置Ingress 路由
首先创建一个Ingress路由配置文件,然后设置到Kubernetes集群中。
4.1 创建Ingress 路由配置文件
将下面的内容保存为文件dashboard-ingress.yaml。里面的 /dashboard 设定为访问Kubernetes dashboard服务,/web 只是为了测试和占位,如果没有安装nginx,将会返回找不到服务的消息。
apiVersion: extensions/v1beta1kind: Ingressmetadata: name: k8s-dashboard namespace: kube-system annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/secure-backends: "true"spec: tls: - secretName: k8s-dashboard-secret rules: - http: paths: - path: /dashboard backend: serviceName: kubernetes-dashboard servicePort: 443 - path: /web backend: serviceName: my-nginx servicePort: 80
- 注意
- 上面的annotations部分是必须的,以提供https和https service的支持。不过,不同的Ingress Controller可能的实现(或版本)有所不同,需要安装相应的实现(版本)进行设置。
- 参见,#issue:https://github.com/kubernetes/ingress-nginx/issues/2460
4.2 配置 Ingress 路由
现在使用kubectl apply命令将Ingress路由设置进去。如果修改了,可以再次运行这个命令,以应用更改,可以立即生效。
kubectl apply -n kube-system -f dashboard-ingress.yaml
- 注意:
- 上面命令的参数 -n 指定凭证安装的命名空间。
- 为了安全考虑,Ingress所有的资源(凭证、路由、服务)必须在同一个命名空间。
5、登录使用
5.1 建立授权账号及Token
建立Dashboard访问的授权账号,将下面的内容保存为文件,如dashboard-rbac.yaml。
apiVersion: v1kind: ServiceAccountmetadata: name: dashboard namespace: kube-system---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name: dashboardsubjects: - kind: ServiceAccount name: dashboard namespace: kube-systemroleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io
然后执行安装(所建立的账号为dashboard):
kubectl create -f dashboard-rbac.yaml
5.2 使用Token
使用下面的方法来获取dashboard登录的token。首页选择Token方法,然后填进去。
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dashboard-token | awk '{print $1}')
现在,输入 https://192.168.199.230/dashboard 就可以访问Dashboard界面了。注意这里的URL地址是跟端口映射、代理等方式不一样的,更符合一般的网页服务的习惯。
5.3 Dashboard界面
Kubernetes Dashboard的界面如下,跟其它访问方式是一样样的:
- 最后,因为是自签名证书,很多浏览器不让访问,可以使用FireFox,选择添加安全例外(Exceptions)即可。
如果更深入的使用HTTPS,我们需要了解和解决几个下面的问题:
- 解决Ubuntu 18.04的DNS问题,
- 启用Https支持,
- 加密证书的自动化,
因为Kubernetes的版本在快速演进,可能这里的方法已不再适用。如果你遇到问题,欢迎在下面留言。