Kubernetes dashboard 通过 Ingress 提供HTTPS访问
发布日期:2021-09-11 09:57:58 浏览次数:9 分类:技术文章

本文共 3592 字,大约阅读时间需要 11 分钟。

hot3.png

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的界面如下,跟其它访问方式是一样样的:

14ff56132dc9ab3add711f28141db858b09.jpg

  • 最后,因为是自签名证书,很多浏览器不让访问,可以使用FireFox,选择添加安全例外(Exceptions)即可。

如果更深入的使用HTTPS,我们需要了解和解决几个下面的问题:

  • 解决Ubuntu 18.04的DNS问题,
  • 启用Https支持, 
  • 加密证书的自动化,

因为Kubernetes的版本在快速演进,可能这里的方法已不再适用。如果你遇到问题,欢迎在下面留言。

 

转载于:https://my.oschina.net/u/2306127/blog/1930169

转载地址:https://blog.csdn.net/weixin_34409703/article/details/92211093 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:让WordPress Blog“智能”的9种方法
下一篇:分享一个“一键安装LNMP脚本”

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月02日 19时10分25秒