1.参考文档
2.访问方式简易说明
参考文档
https://tonybai.com/2018/06/25/the-kubernetes-ingress-practice-for-https-service/
前面一篇:traefik基础部署记录,介绍了最简单的http访问traefik,访问过程参考见下:
client --- (via http) ---> traefik ---- (via http) ----> services
现在要实践的是更安全也更复杂的https访问traefik,有两种访问过程,参考见下:
后端service是普通http的
即client与traefik间采用https加密通信,但traefik与svc间则是明文的http通信
client --- (via https) ---> traefik ---- (via http) ----> services
后端service是https的
即client与traefik间采用https加密通信,但traefik与svc也是采用https通信
client --- (via https) ---> traefik ---- (via https) ----> services
3.部署前需要了解的https基础知识
参考文档:
http://blog.jobbole.com/110354/
能不能用一句话总结HTTPS?
答案是不能,因为HTTPS本身实在太复杂。但是我还是尝试使用一段话来总结HTTPS:
HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
为什么需要引入证书,上面那篇文章说得很棒。
进行ssl通讯,必须需要一个权威机构认证的证书(这个需要Money),我们是实验环境,自己建一个证书玩玩。除了证书,还需要web软件(这里是traefik)开启ssl支持并采用我们建立的证书。
4.配置证书
实验环境用现有的证书,用k8s集群的证书。
[[email protected] ~]# cd /etc/kubernetes/ssl/
[[email protected] ssl]# ls
admin.csr? ? ? apiserver-key.pem? ca.srl? ? ? ? ? ? ? ? ? ? ? kubernetes2-worker.csr? ? ? kubernetes3-worker-key.pem
admin-key.pem? apiserver.pem? ? ? kubernetes1-worker.csr? ? ? kubernetes2-worker-key.pem? kubernetes3-worker.pem
admin.pem? ? ? ca-key.pem? ? ? ?? kubernetes1-worker-key.pem? kubernetes2-worker.pem? ? ? openssl.cnf
apiserver.csr? ca.pem? ? ? ? ? ?? kubernetes1-worker.pem? ? ? kubernetes3-worker.csr? ? ? worker-openssl.cnf
[[email protected] ssl]#
注意操作目录,如果不是在此目录下操作,须指定绝对路径
[[email protected] ssl]# kubectl create secret generic traefik-cert --from-file=ca-key.pem --from-file=ca.pem -n kube-system
secret "traefik-cert" created
[[email protected] ssl]#
5.创建configmap,保存traefik的配置
这里的traefik中配置了把所有http请求全部rewrite为https的规则,并配置相应的证书位置:
[[email protected] config]# 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 = "/etc/kubernetes/ssl/ca.pem"
? ? ? keyFile = "/etc/kubernetes/ssl/ca-key.pem"
[[email protected] config]# kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system
configmap "traefik-conf" created
[[email protected] config]# kubectl get cm -n kube-system
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? DATA? ? ? AGE
extension-apiserver-authentication?? 6? ? ? ?? 70d
kube-flannel-cfg? ? ? ? ? ? ? ? ? ?? 2? ? ? ?? 70d
kube-proxy? ? ? ? ? ? ? ? ? ? ? ? ?? 2? ? ? ?? 70d
kubeadm-config? ? ? ? ? ? ? ? ? ? ?? 1? ? ? ?? 70d
kubernetes-dashboard-settings? ? ? ? 1? ? ? ?? 61d
mysql1.v1? ? ? ? ? ? ? ? ? ? ? ? ? ? 1? ? ? ?? 28d
traefik-conf? ? ? ? ? ? ? ? ? ? ? ?? 1? ? ? ?? 12s
[[email protected] config]#``
6.部署Traefik,这里主要是要关联创建的secret和configMap,并挂载相对应的主机目录。
备份下原有文件
[[email protected] k8s]# cp traefik-deployment.yaml traefik-deployment.yaml.bk
[[email protected] k8s]# ll
配置好的参考见下:
[[email protected] 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: "/etc/kubernetes/ssl"
? ? ? ? ? name: "ssl"
? ? ? ? - mountPath: "/config"
? ? ? ? ? name: "config"
? ? ? ? ports:
? ? ? ? - name: http
? ? ? ? ? containerPort: 80
? ? ? ? - name: https
? ? ? ? ? containerPort: 443
? ? ? ? - name: admin
? ? ? ? ? containerPort: 8080
? ? ? ? args:
? ? ? ? - --api
? ? ? ? - --kubernetes
? ? ? ? - --configfile=/config/traefik.toml
---
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
[[email protected] k8s]#
关于配置文件参数的一些解释和说明:
本操作记录是基于上一篇的操作环境,traefik-rbac.yaml这个是已经配置好了的。如果没有配置这个,请先配置。
kind: DaemonSet 官方默认是使用Deployment
hostNetwork: true 关于这个基础篇有解释
? ? ? args:
? ? ? ? - --api
? ? ? ? - --kubernetes
? ? ? ? - --configfile=/config/traefik.toml?
这个参数是用来干嘛的呢?
这是参数,这里是容器启动时执行ENTRYPOINT命令引用的参数
看看traefik镜像的history
[[email protected] k8s]# docker history --no-trunc=true docker.io/traefik
IMAGE? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? CREATED? ? ? ? ? ?? CREATED BY? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? SIZE? ? ? ? ? ? ? ? COMMENT
sha256:11569c00178041f0502a3251a2d33196c9a153c564814bc9f712c704a85200c2?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? LABEL org.label-schema.vendor=Containous org.label-schema.url=https://traefik.io org.label-schema.name=Traefik org.label-schema.description=A modern reverse-proxy org.label-schema.version=v1.6.5 org.label-schema.docker.schema-version=1.0?? 0 B? ? ? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? ENTRYPOINT ["/traefik"]? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0 B? ? ? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? EXPOSE 80/tcp? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 0 B? ? ? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop) COPY file:ba6114281de19b8e363e82ed5b30471e264464b79049c538a86b7eae309ab46e in /? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 52.2 MB? ? ? ? ? ??
<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 6 weeks ago? ? ? ?? /bin/sh -c #(nop) COPY file:d8282341d1fb7d2cc3d5d3523d0d4126066cc1ba8abe3f0047a459b3a63a5653 in /etc/ssl/certs/? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 275 kB? ? ? ? ? ? ?
[[email protected] k8s]#
其实就是执行<missing>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 3 weeks ago? ? ? ?? /bin/sh -c #(nop)? ENTRYPOINT ["/traefik"] ??
时的参数
执行部署
[[email protected] k8s]# kubectl apply -f traefik-deployment.yaml
serviceaccount "traefik-ingress-controller" created
daemonset.extensions "traefik-ingress-controller" created
service "traefik-ingress-service" created
[[email protected] k8s]# kubectl get po -n kube-system
NAME? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY? ?? STATUS? ? RESTARTS?? AGE
etcd-kubernetes1? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-apiserver-kubernetes1? ? ? ? ? ? ? 1/1? ? ?? Running?? 43? ? ? ?? 70d
kube-controller-manager-kubernetes1? ?? 1/1? ? ?? Running?? 42? ? ? ?? 70d
kube-dns-b4bd9576-db5hh? ? ? ? ? ? ? ?? 3/3? ? ?? Running?? 117? ? ? ? 70d
kube-flannel-ds-27wrd? ? ? ? ? ? ? ? ?? 1/1? ? ?? Running?? 73? ? ? ?? 70d
kube-flannel-ds-6lnj9? ? ? ? ? ? ? ? ?? 1/1? ? ?? Running?? 66? ? ? ?? 70d
kube-flannel-ds-xz87r? ? ? ? ? ? ? ? ?? 1/1? ? ?? Running?? 63? ? ? ?? 70d
kube-proxy-hhghb? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-proxy-hwvs9? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-proxy-jcxbz? ? ? ? ? ? ? ? ? ? ? ? 1/1? ? ?? Running?? 39? ? ? ?? 70d
kube-scheduler-kubernetes1? ? ? ? ? ? ? 1/1? ? ?? Running?? 40? ? ? ?? 70d
kubernetes-dashboard-7d5dcdb6d9-5zkkl?? 1/1? ? ?? Running?? 6? ? ? ? ? 6d
tiller-deploy-5c688d5f9b-kfqwx? ? ? ? ? 1/1? ? ?? Running?? 12? ? ? ?? 14d
traefik-ingress-controller-8jxsb? ? ? ? 1/1? ? ?? Running?? 0? ? ? ? ? 6s
traefik-ingress-controller-h5wrh? ? ? ? 1/1? ? ?? Running?? 0? ? ? ? ? 6s
可能出现的错误
[[email protected] k8s]# kubectl logs traefik-ingress-controller-gpgss -n kube-system
time="2018-08-01T03:06:30Z" level=error msg="Unable to add a certificate to the entryPoint \"https\" : unable to generate TLS certificate : tls: failed to find any PEM data in certificate input"
time="2018-08-01T03:06:30Z" level=error msg="Error creating TLS config: No certificates found for TLS entrypoint https"
time="2018-08-01T03:06:30Z" level=fatal msg="Error preparing server: No certificates found for TLS entrypoint https" ?
这是路径问题导致:
见下面的配置参数
traefik.toml文件的路径
[[entryPoints.https.tls.certificates]]
? ? ? certFile = "/etc/kubernetes/ssl/ca.pem"
? ? ? keyFile = "/etc/kubernetes/ssl/ca-key.pem"
##这个证书是存放在k8s node上的目录
?```
volumeMounts:
? ? ? ? - mountPath: "/etc/kubernetes/ssl"
? ? ? ? name: "ssl"
? ? ? ? - mountPath: "/config"
? ? ? ? ? name: "config"
##为什么这个目录要配置成和traefik.toml里的路径一样呢?思考下。注意这个挂载路径是会自动建立的
? ? ? ? args:
? ? ? ? - --api
? ? ? ? - --kubernetes
? ? ? ? - --configfile=/config/traefik.toml
##原因就是因为这个引用,如果上面mountPath配置的路径不正确,将找不到配置的证书。?configfile引用traefik.toml,traefik.toml引用的路径是前面node上的,在容器里如果不建立一样的路径,traefik.toml在容器里去哪读取证书呢?
traefik已经部署成功。
7.traefik飞起来1
看看前面提到的访问过程示图:
client --- (via https) ---> traefik ---- (via http) ---->? services
先测试这个
简单介绍,在k8s集群中部署了wordpress(这是基于http80端口的服务),现在通过traefik https跳转访问wordpress
svc,po情况
[[email protected] ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-svc ClusterIP 10.106.13.46 <none> 80/TCP 13d
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 72d
mysql ClusterIP 10.97.84.51 <none> 3306/TCP 2d
wordpress ClusterIP 10.111.234.225 <none> 8080/TCP 2d
[[email protected] ~]#
[[email protected] ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
httpd-749bf8c6f4-bfjfw 1/1 Running 0 2h
httpd-749bf8c6f4-ghpzl 1/1 Running 0 2h
httpd-749bf8c6f4-xvrn4 1/1 Running 0 2h
mysql-5bbbf49b4f-wjw47 1/1 Running 4 2d
nginx-deployment-6b5c99b6fd-pscr6 1/1 Running 0 2h
nginx-deployment-6b5c99b6fd-zr2p7 1/1 Running 0 2h
node-exporter-4gbh9 1/1 Running 24 35d
node-exporter-8h9vp 1/1 Running 25 35d
wordpress-pod-7dd7659959-hc7mr 1/1 Running 4 2d
[[email protected] ~]#
ingress文件
[[email protected] ~]# cat wp/wordpress.ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
? name: wordpress-ingress
? namespace: default
spec:
? rules:
? - host: wordpress.ingress
? ? http:
? ? ? paths:
? ? ? - path: /
? ? ? ? backend:
? ? ? ? ? serviceName: wordpress
? ? ? ? ? servicePort: 8080
[[email protected] ~]#
执行部署
[[email protected] wp]# kubectl apply -f wordpress.ingress.yaml
ingress.extensions "wordpress-ingress" created
[[email protected] ~]# kubectl get ing
NAME? ? ? ? ? ? ? ? HOSTS? ? ? ? ? ? ?? ADDRESS?? PORTS? ?? AGE
httpd-svc-ingress?? httpd-svc.ingress? ? ? ? ? ?? 80? ? ? ? 5d
wordpress-ingress?? wordpress.ingress? ? ? ? ? ?? 80? ? ? ? 4d
[[email protected] ~]#
在访问的主机解析好域名,访问正常
8.traefik飞起来2
原文地址:http://blog.51cto.com/goome/2153602