一:配置过程


生成自签名证书

 [root@k8s-bin-master01 traefik]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=who.qikqiak.com"
 [root@k8s-bin-master01 traefik]# ls tls*
 tls.crt  tls.key

通过 Secret 对象来引用证书文件(注意证书文件名称必须是 tls.crt 和 tls.key)

[root@k8s-bin-master01 traefik]#kubectl create secret tls https --cert=tls.crt --key=tls.key -n kube-system

以traefik的dashboard为例,将这个对象的Ingress route配置为https

[root@k8s-bin-master01 traefik]#cat https.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: https
    namespace: kube-system
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`www.traefiktest.com`)
    kind: Rule
    services:
    - name: traefik
      port: 80
  tls:
    secretName: https

创建规则,并测试
[root@k8s-bin-master01 traefik]# kubectl apply -f https.yaml

k8s1.17.5+traefik2.2.0版本 https配置及常见误区解答_第1张图片

二:误区解答


问:为什么和网上的文档的配置方式不一样
答:网上目前的大部分配置traefik的https的文档都是基于traefik v1版本的,v2版本的由于和v1版本不兼容,且配置文件,引用证书的方式都发生了变化,所以不再适用那种将证书在traefik.toml中引用的方式,也不再需要将证书挂载在traefik的容器中


问:为什么有些文档里用的是ingress,有些文档里用的是Ingress route
答:在v1版本中,默认使用的都是ingress,在v2版本中,引入了Ingress route的概念,他们实际的作用都是一样的,写发上略有不同,实际上,ingress并不是traefik或者nginx定义的一个概念,是k8s定义的,但是traefik也用的是ingress这个概念,所以可以看到网上的大部分文档,在v1版本的时候使用ingress指定规则的话,需要在metadata字段指定注释即表明此ingress使用的是traefik控制器,在v2版本中,也可以使用ingress,但是需要在配置文件中的provider字段添加kubernetesIngress: "",如下

[root@k8s-bin-master01 traefik]# cat confmap.yaml 
kind: ConfigMap
apiVersion: v1
metadata:
  name: traefik-config
  namespace: kube-system
data:
  traefik.yaml: |-
    serversTransport:
      insecureSkipVerify: true
    api:
      insecure: true
      dashboard: true
      debug: true
    metrics:
      prometheus: ""
    entryPoints:
      web:        
        address: ":80"
      websecure:
        address: ":443"
    providers:
      kubernetesCRD: ""
      kubernetesIngress: ""  ##添加这个
    log:
      filePath: ""
      level: error
      format: json
    accessLog:
      filePath: ""
      format: json
      bufferingSize: 0
      filters:
        retryAttempts: true
        minDuration: 20
      fields:
        defaultMode: keep
        names:
          ClientUsername: drop
        headers:
          defaultMode: keep
          names:
            User-Agent: redact
            Authorization: drop
            Content-Type: keep

同样一个规则用ingress和Ingress route的写法区别如下

[root@k8s-bin-master01 traefik]# cat ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-ingress
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.frontend.rule.type: PathPrefixStrip  
spec:
  rules:
  - host: traefiktest.chinaedu.net
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik
          servicePort: 8080

[root@k8s-bin-master01 traefik]# cat ingre***oute.yaml 
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: https
  namespace: kube-system
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`traefiktest.chinaedu.net`)
      kind: Rule
      services:
        - name: traefik
          port: 8080

总结的话
就是traefik v1版本用的是ingress,v2版本ingress和Ingress route都能用,他们实际都是k8s的ingress规则的体现,官方也做过说明,参考Ingress route介绍,以及ingress介绍
我个人比较推荐Ingress route的用法,因为不需要加注释,https的证书引用也更加方便


问:ingress里的service是哪个service,怎么写
答:还是以下面这个对象为例,可以看到,这个service写的是traefik,实际上也就是traefik的pod的部署yaml里的service的名字,端口实际上就是你想让此条ingress规则代理的域名被转发到service所对应的pod的哪个端口上,这也就解释了为什么即使是https的时候这个地方写的仍然是8080端口,因为此规则的entryPoints字段的websecure才是流量入口,而8080是实际访问的地址

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: https
  namespace: kube-system
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`traefiktest.chinaedu.net`)
      kind: Rule
      services:
        - name: traefik
          port: 8080
  tls:
    secretName: https