上篇咱们简单介绍了下traefik以及如何http访问, 可是在实际生产环境中不单单只是http的转发访问,还有https的转发访问,web
前面一篇:traefik基础部署记录,介绍了最简单的http访问traefik,访问过程参考见下:后端
client --- (via http) ---> traefik ---- (via http) ----> servicesapi
如今要实践的是更安全也更复杂的https访问traefik,有两种访问过程,参考见下:安全
后端service是普通http的
即client与traefik间采用https加密通讯,但traefik与svc间则是明文的http通讯bash
client --- (via https) ---> traefik ---- (via http) ----> servicesapp
后端service是https的
即client与traefik间采用https加密通讯,但traefik与svc也是采用https通讯ide
client --- (via https) ---> traefik ---- (via https) ----> services测试
下面咱们来看看如何实现(伪)https,也就是上面说的第二种访问流程。ui
首先建立证书,想开启https,证书是少不了的。能够本身手动建一个证书,或者利用已经有的证书。这里我本身建立了一个ssl证书,具体建立流程可参考网上。加密
[root@k8smaster ~]# cd /opt/k8s/ssl [root@k8smaster ssl]# ls ssl.crt ssl.csr ssl.key
上面这个/opt/k8s/ssl目录是我建立的,路径能够随便只要和config文件里面的路径一致就行下面会说到。下面开始配置证书
[root@k8smaster ssl]# kubectl create secret generic traefik-cert --from-file=ssl.crt --from-file=ssl.key -n kube-system secret "traefik-cert" created
建立一个configmap,保存traefix的配置。这里的traefix中配置了把全部http请求所有rewrite为https的规则,并配置相应的证书位置,同时我这里也建立了一个目录/opt/k8s/conf/。
[root@k8smaster conf]# cat traefik.toml defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "/opt/k8s/ssl/ssl.crt" keyFile = "/opt/k8s/ssl/ssl.key" [root@k8smaster config]# kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system configmap "traefik-conf" created
因为以前配置的是http如今要换成https因此须要更新下Traefik,这里主要是更新下关联建立的secret和configMap,并挂载相对应的主机目录。
安全起见操做以前先备份下(职场好习惯)
[root@k8smaster k8s]# cp traefik-deployment.yaml traefik-deployment.yaml.bk [root@k8smaster k8s]# cat traefik-deployment.yaml --- apiVersion: v1 kind: ServiceAccount metadata: name: traefik-ingress-controller namespace: kube-system --- kind: DaemonSet apiVersion: extensions/v1beta1 metadata: name: traefik-ingress-controller namespace: kube-system labels: k8s-app: traefik-ingress-lb spec: selector: matchLabels: k8s-app: traefik-ingress-lb template: metadata: labels: k8s-app: traefik-ingress-lb name: traefik-ingress-lb spec: serviceAccountName: traefik-ingress-controller terminationGracePeriodSeconds: 60 hostNetwork: true volumes: - name: ssl secret: secretName: traefik-cert - name: config configMap: name: traefik-conf containers: - image: traefik name: traefik-ingress-lb volumeMounts: - mountPath: "/opt/k8s/ssl/" name: "ssl" - mountPath: "/opt/k8s/conf/" name: "config" ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: admin containerPort: 8080 args: - --configFile=/opt/k8s/conf/traefik.toml - --api - --kubernetes - --logLevel=INFO --- kind: Service apiVersion: v1 metadata: name: traefik-ingress-service namespace: kube-system spec: selector: k8s-app: traefik-ingress-lb ports: - protocol: TCP port: 80 name: web - protocol: TCP port: 443 name: https - protocol: TCP port: 8080 name: admin type: NodePort [root@k8smaster k8s]# [root@k8smaster k8s]# kubectl apply -f traefik-deployment.yaml serviceaccount "traefik-ingress-controller" created daemonset.extensions "traefik-ingress-controller" created service "traefik-ingress-service" created
主要变化呢是更新了几个方面:
kind: DaemonSet 官方默认是使用Deployment
hostNetwork: true 开启Node Port端口转发
volumeMounts: 新增volumes挂载点
ports: 新增https443
args: 新增configfile
以及Service层的443 ports
最后咱们来测试下是否成功,这里咱们能够登录traefik-ui界面,能够看到本来http的访问,traefik会直接给咱们重定向至https。
关于第三种https转发https实现方式这里就再也不赘述了后续若是有须要能够在探讨,若是须要的话能够看下am的博客也就是本文参考的资料,写的很详细。
本文博客参考资料: