文章楔子
对于k8s集群中的http/https服务,一种常见的设计是集群内部走http协议,然后在ingress controller处统一管理TLS证书,并负责接受外部的https请求,以及将内部的http响应统一转换为https发回客户端,这样既能降低集群内部通信的复杂度,又能保证集群服务的安全性。
然而对于诸如kubernetes/dashoboard一类的服务,使用其默认的部署配置启动的服务提供的是https协议的服务,从集群外部访问该服务时,通常只能使用类似如下的链接间接的访问。
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/.
本文旨在指导读者将集群内部的HTTPS服务通过traefik暴露到集群外部,直接通过ingress访问。
开启https后端ingress
前置条件
- kubernetes集群
- traefik 1.6.5
可以参考这份yaml文件安装traefik,需要注意两点:
- 该文件中的image被我修改成了k8s.gcr.io/traefik:1.6.5,指向我使用的私有仓库。如果读者想从公网拉取该镜像请将镜像名修改为traefik:1.6.5
- 该文件并不涉及外部https相关代码,对外只开启了http,如果需要https的话请先在kube-system命名空间创建一个名为ssl的secret,里面存放TLS证书,然后使用这份yaml文件部署traefik
配置Traefik
如果使用了我的部署文件,Traefik是直接配置好的,如果是读者先前自己安装好的traefik,请将下面的代码保存为文件,或编辑自己的traefik配置,在适当的位置加入insecureSkipVerify = true。然后将配置应用到集群,并重启所有traefik容器。
kind: ConfigMap apiVersion: v1 metadata: name: traefik-conf namespace: kube-system data: traefik.toml: | insecureSkipVerify = true defaultEntryPoints = ["http"] [entryPoints] [entryPoints.http] address = ":80"
insecureSkipVerify = true,该项配置指定了traefik在访问https后端的时候可以忽略TLS证书验证错误,从而使得https的后端,如kubernetes dashboard,可以像http后端一样直接通过traefik透出
测试效果
这里以透出https的kubernetes dashboard为例,执行下面的yaml文件,为dashboard创建ingress
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard --- kind: Ingress apiVersion: extensions/v1beta1 metadata: name: dashboard namespace: kube-system annotations: kubernetes.io/ingress.class: traefik spec: rules: - host: dashboard.multi.io http: paths: - backend: serviceName: kubernetes-dashboard servicePort: 443 path: /
随后配置/etc/hosts文件,并访问该链接
$ cat /etc/hosts 10.130.29.80 dashboard.multi.io
通过域名访问dashboard后使用token登陆不了
我也是