• Traefik 2.0 实现自动化 HTTPS


    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247484457&idx=1&sn=35112e988639997f0f29726cba44e35d&chksm=fdb90b34cace8222b998014113537669313b55c3280f7f4396b3afc5d66e54a3573c03bad043&cur_album_id=1319287026209947648&scene=190#rd

    这篇文章讲述的是使用traefik配置服务访问使用https形式,使用免费的可自动续订的证书。当然参考这些内容,可以直接使用已有的证书来设置(参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/14986597.html)。
    另外就是使用中间件,访问http自动跳转到https.

    本文是使用http 这种验证方式进行的,还有一种是使用DNS 校验的方式,地址:https://www.cnblogs.com/sanduzxcvbnm/p/15749641.html

    这里就以 Traefik 的 WebUI 为例

    参考转载的文章内容经过实践操作
    k8s版本:1.20.12
    traefik版本:2.4.8
    我这里安装的traefik是使用kubeoperator安装k8s集群时选择的,已经安装有dashboard了,参考文章:https://www.cnblogs.com/sanduzxcvbnm/p/15741429.html

    要使用 Let's Encrypt 来进行自动化 HTTPS,就需要首先开启 ACME,开启 ACME 需要通过静态配置的方式,也就是说可以通过环境变量、启动参数等方式来提供,我们这里还是直接使用启动参数的形式来开启,在 Traefik 的部署文件中添加如下命令行参数:

    # 参考内容
    
    args:
    - --entrypoints.web.Address=:80
    - --entrypoints.websecure.Address=:443
    - --api.insecure=true  # 开启 webui 需要该参数
    - --providers.kubernetescrd
    - --api
    - --api.dashboard=true
    - --accesslog
    # 使用 tls 验证这种方式
    - --certificatesresolvers.default.acme.tlsChallenge=true
    # 邮箱配置
    - --certificatesResolvers.default.acme.email="ych_1024@163.com"
    # 保存 ACME 证书的位置
    - --certificatesResolvers.default.acme.storage="acme.json"
    # 下面是用于测试的ca服务,如果https证书生成成功了,则移除下面参数
    - --certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
    

    这里我们使用的是 tlsChallenge 这种 ACME 验证方式,需要注意的是当使用这种验证时,Let's Encrypt 到 Traefik 443 端口必须是可达的,除了这种验证方式外,还有 httpChallenge 和 dnsChallenge 两种验证方式,更常用的是 http 这种验证方式,关于这几种验证方式的使用可以查看文档:

    ,Let's Encrypt 到 Traefik 443 端口必须是可达的:我这是在公司内部,防火墙可以映射443端口到指定主机,但是443端口被运营商禁止的

    我这里安装的traefik是使用kubeoperator安装k8s集群时选择的,对照上面的文件,修改步骤有两种,第一种是修改对应的yaml文件,第二种是通过kubepi进行修改

    修改对应的yaml文件

    通过kubepi进行修改:略

    上面我们相当于指定了一个名为 default 的证书解析器,然后要注意的是,一定要将这里的 WebUI 的域名 www.daniel.com 解析到 Traefik 的所在节点,解析完成后,重新部署 Traefik:kubectl apply -f traefik.yaml

    部署完成后,我们需要让 WebUI 的域名去监听 443 端口,因为我们这里使用的是 tlsChallenge 这种验证方式,在上面的 IngressRoute.yaml 文件中新建一个对象,用来监听 443 端口,如下所示:

    # 参考文档内容
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-webui-tls
      namespace: kube-system
    spec:
      entryPoints:
      - websecure  # 注意这里是websecure这个entryPoint,监控443端口
      routes:
      - match: Host(`traefik.youdianzhishi.com`)
        kind: Rule
        services:
        - name: traefik
          port: 8080
      tls:
        certResolver: default  # 使用我们配置的 default 这个解析器
    
    # 根据实际情况使用的内容,参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/15741429.html
    
    # cat IngressRoute.yaml
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      namespace: kube-system
      name: traefik-dashboard-tls
      labels:
        app.kubernetes.io/name: traefik
        kubernetes.io/ingress.class: traefik
    spec:
      entryPoints:
        - websecure #  # 注意这里是websecure这个entryPoint,监控443端口
      routes:
      - match: Host(`www.daniel.com`) && PathPrefix(`/dashboard`) || PathPrefix(`/api`) # 新加上Host(`www.daniel.com`) &&
        kind: Rule
        services:
        - name: api@internal
          kind: TraefikService
      tls:
        certResolver: default # # 使用我们配置的 default 这个解析器
    

    然后更新对象:kubectl apply -f IngressRoute.yaml

    现在有两个 IngressRoute 对象,分别是traefik-dashboard和traefik-dashboard-tls

    这个时候如果一切正常的话我们已经可以通过 HTTPS 去访问我们的服务了:

    Traefik 会自动跟踪其生成的 ACME 证书的到期日期。如果证书过期之前还不到 30 天了,Traefik 会尝试进行自动续订。

    同样的,我们通过 HTTP 协议也是可以访问到的,但是如果需要将 HTTP 请求强制跳转到 HTTPS 的话,就需要借助 Traefik 2.0 的提供的中间件来完成了。

    同样,在上面的 IngressRoute.yaml 文件中添加一个 Middleware 的 CRD 对象,内容如下所示:

    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
      name: redirect-https
      namespace: kube-system
    spec:
      redirectScheme:
        scheme: https
    

    这里我们就声明了一个名为 redirectSchemea 的中间件,该中间件可以将我们的请求跳转到另外的 scheme 请求,然后将该中间件配置到 HTTP 请求的服务上面:

    # 参考内容
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      name: traefik-webui
      namespace: kube-system
    spec:
      entryPoints:
      - web
      routes:
      - match: Host(`traefik.youdianzhishi.com`)
        kind: Rule
        services:
        - name: traefik
          port: 8080
        middlewares:  # 使用上面新建的中间件
        - name: redirect-https
    
    # 实际使用的内容,参考网址:https://www.cnblogs.com/sanduzxcvbnm/p/15741429.html
    
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
      namespace: kube-system
      name: traefik-dashboard
      labels:
        app.kubernetes.io/name: traefik
        kubernetes.io/ingress.class: traefik
    spec:
      entryPoints:
        - web
      routes:
      - match: Host(`www.daniel.com`) && PathPrefix(`/dashboard`) || PathPrefix(`/api`)
        kind: Rule
        services:
        - name: api@internal
          kind: TraefikService
        middlewares:  # 使用上面新建的中间件
        - name: redirect-https
    

    然后更新对象:kubectl apply -f IngressRoute.yaml

    这样当我们通过 HTTP 去访问 WebUI 服务时,也会自动跳转到 HTTPS 上面去.

    本文中用到的资源清单文件可以从这里获取:https://github.com/cnych/kubeapp/tree/master/traefik2/https。

  • 相关阅读:
    第七周进度报告
    解析极限编程阅读笔记02
    解析极限编程阅读笔记01
    第六周进度报告
    合作开发项目-地铁线路查询
    构建之法阅读笔记03
    关于DeferredResult的思考
    java实现任务调度
    java里面如何提升编写速度
    收集整理mysql数据库设计规范与原则
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/15745316.html
Copyright © 2020-2023  润新知