设为首页 收藏本站
查看: 1643|回复: 0

[经验分享] kubernetes traefik配置https实践操作记录

[复制链接]

尚未签到

发表于 2018-9-15 11:15:54 | 显示全部楼层 |阅读模式
  1.参考文档
  http://traefik.cn/
  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集群的证书。
  

[root@kubernetes1 ~]# cd /etc/kubernetes/ssl/  
[root@kubernetes1 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
  
[root@kubernetes1 ssl]#
  

  注意操作目录,如果不是在此目录下操作,须指定绝对路径
  

[root@kubernetes1 ssl]# kubectl create secret generic traefik-cert --from-file=ca-key.pem --from-file=ca.pem -n kube-system  
secret "traefik-cert" created
  
[root@kubernetes1 ssl]#
  

  5.创建configmap,保存traefik的配置
  这里的traefik中配置了把所有http请求全部rewrite为https的规则,并配置相应的证书位置:
  

[root@kubernetes1 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"
  

[root@kubernetes1 config]# kubectl create configmap traefik-conf --from-file=traefik.toml -n kube-system  
configmap "traefik-conf" created
  

[root@kubernetes1 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
  
[root@kubernetes1 config]#``
  

  6.部署Traefik,这里主要是要关联创建的secret和configMap,并挂载相对应的主机目录。
  备份下原有文件
  

[root@kubernetes1 k8s]# cp traefik-deployment.yaml traefik-deployment.yaml.bk  
[root@kubernetes1 k8s]# ll
  

  配置好的参考见下:
  

[root@kubernetes1 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
  
[root@kubernetes1 k8s]#
  

  关于配置文件参数的一些解释和说明:
  本操作记录是基于上一篇的操作环境,traefik-rbac.yaml这个是已经配置好了的。如果没有配置这个,请先配置。
  kind: DaemonSet   官方默认是使用Deployment
  hostNetwork: true    关于这个基础篇有解释
  args:
  - --api
  - --kubernetes
  - --configfile=/config/traefik.toml 
  这个参数是用来干嘛的呢?
  这是参数,这里是容器启动时执行ENTRYPOINT命令引用的参数
  看看traefik镜像的history
  

[root@kubernetes1 k8s]# docker history --no-trunc=true docker.io/traefik
  
IMAGE                                                                     CREATED             CREATED BY                                                                                                                                                                                                                                                        >  
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                
  
                                                                 3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["/traefik"]                                                                                                                                                                                                                         0 B                
  
                                                                 3 weeks ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                                                                                                                                                                                                                                   0 B                
  
                                                                 3 weeks ago         /bin/sh -c #(nop) COPY file:ba6114281de19b8e363e82ed5b30471e264464b79049c538a86b7eae309ab46e in /                                                                                                                                                                  52.2 MB            
  
                                                                 6 weeks ago         /bin/sh -c #(nop) COPY file:d8282341d1fb7d2cc3d5d3523d0d4126066cc1ba8abe3f0047a459b3a63a5653 in /etc/ssl/certs/                                                                                                                                                    275 kB             
  
[root@kubernetes1 k8s]#
  

  其实就是执行
  

`                                                                 3 weeks ago         /bin/sh -c #(nop)  ENTRYPOINT ["/traefik"]   `  

  时的参数
  执行部署
  

[root@kubernetes1 k8s]# kubectl apply -f traefik-deployment.yaml  
serviceaccount "traefik-ingress-controller" created
  
daemonset.extensions "traefik-ingress-controller" created
  
service "traefik-ingress-service" created
  

[root@kubernetes1 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
  

  可能出现的错误
  

[root@kubernetes1 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情况
  

[root@kubernetes1 ~]# kubectl get svc  
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
  
httpd-svc    ClusterIP   10.106.13.46             80/TCP     13d
  
kubernetes   ClusterIP   10.96.0.1                443/TCP    72d
  
mysql        ClusterIP   10.97.84.51              3306/TCP   2d
  
wordpress    ClusterIP   10.111.234.225           8080/TCP   2d
  
[root@kubernetes1 ~]#
  

[root@kubernetes1 ~]# 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
  
[root@kubernetes1 ~]#
  

  ingress文件
  

[root@kubernetes1 ~]# 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
  
[root@kubernetes1 ~]#
  

  执行部署
  

[root@kubernetes1 wp]# kubectl apply -f wordpress.ingress.yaml  
ingress.extensions "wordpress-ingress" created
  

  
[root@kubernetes1 ~]# kubectl get ing
  
NAME                HOSTS               ADDRESS   PORTS     AGE
  
httpd-svc-ingress   httpd-svc.ingress             80        5d
  
wordpress-ingress   wordpress.ingress             80        4d
  
[root@kubernetes1 ~]#
  

  在访问的主机解析好域名,访问正常
  8.traefik飞起来2
  用dashboard来测试,前面提到的第二中访问过程图,见下:
  client --- (via https) ---> traefik ---- (via https) ---->  services
  这种方式非常复杂,有以下两种情况。
  第一种:
  是ssl-termination的安全配置模型,即client与svc8的https通信分为“两段”,client与traefik建立https连接后,traefik将client提交的加密请求解密后,再向svc发起https请求,并重新加密请求数据。这种client端ssl的过程在反向代理或负载均衡器终结的https通信方式被称为“ssl-termination”。
  第二种:
  ssl-passthrough的安全配置模型,即traefik不会对client的https request进行解密,而是直接转发给svc服务,client端的ssl过程不会终结于traefik,而是在svc对应的pod中终结。这种https通信方式被称为”ssl-passthrough”。这种配置模型尤其适合service对client端进行client certificate验证的情况。
  这两种后面有时间准备测试看看。
  现在测试的是比较奇葩的一种。
  具体见下:
  看看dashboard的情况,保证运行正常。
  

[root@kubernetes1 ~]# kubectl get svc,po -n kube-system  
NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                     AGE
  
service/kube-dns                  ClusterIP   10.96.0.10              53/UDP,53/TCP                               72d
  
service/kubernetes-dashboard      ClusterIP   10.111.97.40            443/TCP
  
NAME                                        READY     STATUS    RESTARTS   AGE
  
.......
  
pod/kubernetes-dashboard-7d5dcdb6d9-5zkkl   1/1       Running   7          8d
  

  写一个dashboard ingress文件
  参考如下:
  

[root@kubernetes1 wp]# cat dashboard.ingress.yaml  
apiVersion: extensions/v1beta1
  
kind: Ingress
  
metadata:
  
  name: dashboard-ingress
  
  namespace: kube-system
  
spec:
  
  rules:
  
  - host: dashboard.ingress
  
    http:
  
      paths:
  
      - path: /
  
        backend:
  
          serviceName: kubernetes-dashboard
  
          servicePort: 443
  

  执行部署
  

[root@kubernetes1 wp]# kubectl apply -f dashboard.ingress.yaml  
ingress.extensions "dashboard-ingress" created
  
[root@kubernetes1 wp]#
  

  
[root@kubernetes1 wp]# kubectl get ing -n kube-system
  
NAME                HOSTS               ADDRESS   PORTS     AGE
  
dashboard-ingress   dashboard.ingress             80        2m
  
[root@kubernetes1 wp]#
  

  到这一步,可以访问域名看看
  访问不了,访问的页面报错:
  Internal Server Error
  pod报错日志:
  

2018/08/02 09:25:11 [2018-08-02T09:25:11Z] Outcoming response to 10.244.2.0:37132 with 200 status code  
2018/08/02 09:25:11 [2018-08-02T09:25:11Z] Incoming HTTP/2.0 GET /api/v1/login/modes request from 10.244.2.0:37132: {}
  
2018/08/02 09:25:11 [2018-08-02T09:25:11Z] Outcoming response to 10.244.2.0:37132 with 200 status code
  
2018/08/02 09:25:19 Metric client health check failed: the server could not find the requested resource (get services heapster). Retrying in 30 seconds.
  
2018/08/02 09:25:49 Metric client health check failed: the server could not find the requested resource (get services heapster). Retrying in 30 seconds.
  
2018/08/02 09:26:20 Metric client health check failed: the server could not find the requested resource (get services heapster). Retrying in 30 seconds.
  
2018/08/02 09:26:22 http: TLS handshake error from 10.244.2.0:37148: remote error: tls: bad certificate
  
2018/08/02 09:26:22 http: TLS handshake error from 10.244.2.0:37150: remote error: tls: bad certificate
  
2018/08/02 09:26:50 Metric client health check failed: the server could not find the requested resource (get services heapster). Retrying in 30 seconds.
  

  分析可知,因为dashboard本身就是https的结构,自带证书,无法通过自带证书的检查和认证。所以无法访问dashboard。
  解决方法:
  在traefik.toml中加入条参数:
  insecureSkipVerify = true  
  这条的意思是:禁止traefik对service后端证书检查
  修改后的配置文件见下:
  

[root@kubernetes1 k8s]# cat config/traefik.toml  
insecureSkipVerify = true                                               
  
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"
  
[root@kubernetes1 k8s]#
  

  修改好后,删除以前的configmap,重新生成configmap
  

[root@kubernetes1 k8s]# kubectl delete cm traefik-conf -n kube-system  
configmap "traefik-conf" deleted
  

[root@kubernetes1 k8s]# kubectl create configmap traefik-conf --from-file=config/traefik.toml -n kube-system  
configmap "traefik-conf" created
  
[root@kubernetes1 k8s]#
  

  重新执行部署traefik-deployment
  

[root@kubernetes1 k8s]# kubectl delete -f traefik-deployment.yaml  
serviceaccount "traefik-ingress-controller" deleted
  
daemonset.extensions "traefik-ingress-controller" deleted
  
service "traefik-ingress-service" deleted
  
[root@kubernetes1 k8s]# kubectl apply  -f traefik-deployment.yaml
  
serviceaccount "traefik-ingress-controller" created
  
daemonset.extensions "traefik-ingress-controller" created
  
service "traefik-ingress-service" created
  

  测试访问成功
DSC0000.jpg




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-583335-1-1.html 上篇帖子: centos7.2部署kubernets v1.10和采坑记录 下篇帖子: 使用ansible安装kubernetes 1.11.1-ZJ的记事本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表