Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes (K8S) 中Traefik自动申请证书

Kubernetes (K8S) 中Traefik自动申请证书

作者头像
王先森sec
发布于 2023-10-17 07:25:53
发布于 2023-10-17 07:25:53
1.9K00
代码可运行
举报
文章被收录于专栏:王先森王先森
运行总次数:0
代码可运行

Kubernetes (K8S) 中Traefik自动申请证书

王先森2023-08-292023-08-29

Traefik自动申请证书

Traefik实现自动申请HTTPS证书要使用Let’s Encrypt自动生成证书,需要使用ACME。需要在静态配置中定义 “证书解析器”,Traefik负责从ACME服务器中检索证书。

然后,每个 “路由器 “被配置为启用TLS,并通过tls.certresolver配置选项与一个证书解析器关联。

Traefik的ACME验证方式主要有以下三种:

  • tlsChallenge
  • httpChallenge
  • dnsChallenge

如果使用tlsChallenge,则要求Let’s Encrypt到 Traefik 443 端口必须是可达的。如果使用httpChallenge,则要求Let’s Encrypt到 Traefik 80端口必须是可达的。如果使用dnsChallenge,则需要对应的providers。

部署cert-manager

借助 Kubernetes,我们获得了一个强大且可扩展的平台来解决许多复杂的场景。cert-manager是一个功能强大的解决方案,可以帮助我们自动化和管理与 TLS 证书相关的几乎所有内容。它提供了一套针对各种场景的自定义资源定义(CRD),并与原生IngressGateway资源很好地集成。

cert-manager 在 Kubernetes 机密中存储和缓存证书和私钥,使它们高度可用,可供入口控制器(如 Traefik Proxy)或应用程序进一步使用。

注意:默认情况下,cert-manager 不会自动清除机密,从而允许它重新附加到已颁发的证书并避免颁发新证书。当您需要创建和删除大量资源并且不希望受到速率限制时,这变得非常方便。

cert-manager 可以与各种来源交互来颁发证书,包括 Let's EncryptHashiCorpVault 以及私有 PKI。对于AWS 私有证书颁发机构、Google Cloud 证书颁发机构服务或Cloudflare Origin CA 等不受支持的情况,外部颁发者允许您扩展证书管理器功能。

先决条件

要学习本教程,您需要具备以下条件:

  • Kubernetes 集群 >= v1.20
  • Let’s Encrypt 的公共托管 DNS 域 — 出于本文的目的,我将使用 腾讯云
  • Traefik 2.10,您可以通过这篇文章安装部署 Kubernetes部署升级Traefik2.6

您可以使用以下命令安装 cert-manager 1.12:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.3/cert-manager.yaml

提供 Web 端口的服务。在本教程中,我将使用 whoami 作为示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat > whoami.yml <<EOF 
apiVersion: v1
kind: Service
metadata:
  name: whoami
spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: whoami
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: containous/whoami
          ports:
            - name: web
              containerPort: 80
EOF

Traefik 代理与 cert-manager 和 Let’s Encrypt

让我们探索如何结合 Kubernetes 入口控制器(如 Traefik Proxy 和 cert-manager)来保护 Web 应用程序的安全。Let’s Encrypt 提供多种质询类型来验证域名的控制权。根据您的要求,您可以选择HTTP-01您的服务何时可供公共访问或DNS-01专用端点。

使用 Let Encrypt 时请注意速率限制。为了避免出现令人不快的意外,建议使用 Let’s Encrypt暂存环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#测试(staging):https://acme-staging-v02.api.letsencrypt.org/directory
#生产(production):https://acme-v02.api.letsencrypt.org/directory

自动化 HTTPS

Let’s Encrypt 使用 ACME 协议来校验域名是否真的属于你,校验成功后就可以自动颁发免费证书,证书有效期只有 90 天,在到期前需要再校验一次来实现续期,而 cert-manager 是可以自动续期的,所以事实上并不用担心证书过期的问题。目前主要有 HTTP 和 DNS 两种校验方式。

HTTP-01 校验

HTTP-01 的校验是通过给你域名指向的 HTTP 服务增加一个临时 location,:在校验的时候 Let’s Encrypt 会发送http 请求到 http://<YOUR_DOMAIN>/.well-known/acme-challenge/<TOKEN>,其中 YOUR DOMAIN 就是被校验的域名,TOKEN 是 ert-manager 生成的一个路径,它通过修改 Ingress 规则来增加这个临时校验路径并指向提供TOKEN 的服务。Let’s Encrypt 会对比 TOKEN 是否符合预期,校验成功后就会颁发证书了,不过这种方法不支持泛域名证书。

使用 HTTP 校验这种方式,首先需要将域名解析配置好,也就是需要保证 ACME 服务端可以正常访闯到你的 HTTP服务。这里我们以上面的 whoami应用为例,我们已经将 whoami.boysec.cn 域名做好了正确的解析。

这里必须要绑定公网IP才可以。

方法一

由于 Let’s Encrypt 的生产环境有着严格的接口调用限制,所以一般我们需要先在 staging 环境测试通过后,再切换到生产环境。首先我们创建一个default范围测试环境和生产环境使用的 HTTP-1 校验方式的证书颁发机构:

测试环境生成环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat <<EOF >staging-http.yml 
apiVersion: cert-manager.io/v1
kind: Issuer  # 选择整个集群(ClusterIssuer)还是单个namespace
metadata:
 name: staging-http01
spec:
 acme:
   email: wangxiansen@boysec.cn  # 用于 ACME 注册的邮箱
   # ACME 服务端地址
   server: https://acme-staging-v02.api.letsencrypt.org/directory
   privateKeySecretRef: 
     # 用于存放 ACME 帐号 private key 的 secret
     name: boysec-staging-http01
   solvers:
     - http01:  # ACME HTTP-01 类型
         ingress:
           class: traefik # 指定ingress的名称
EOF
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat <<EOF >production-http.yml 
apiVersion: cert-manager.io/v1
kind: Issuer  # 选择整个集群(ClusterIssuer)还是单个namespace
metadata:
 name: production-http01
spec:
 acme:
   email: wangxiansen@boysec.cn  # 用于 ACME 注册的邮箱
   # ACME 服务端地址
   server: https://acme-v02.api.letsencrypt.org/directory
   privateKeySecretRef: 
     # 用于存放 ACME 帐号 private key 的 secret
     name: boysec-http01
   solvers:
     - http01:  # ACME HTTP-01 类型
         ingress:
           class: traefik # 指定ingress的名称
EOF

创建完成后可以看到两个 issuers 对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl get issuers

有了 Issuer/ClusterIssuer 证书颁发机构,接下来我们就可以生成免费证书了,cert-manager 给我们提供了 Certificate 这个用于生成证书的自定义资源对象,不过这个对象需要在一个具体的命名空间下使用,证书最终会在这个命名空间下以 Secret 的资源对象存储。我们这里是要结合 traefik 一起使用,实际上我们只需要修改 Ingress 对象,添加上 cert-manager 的相关注解即可,不需要手动创建 Certificate 对象了,修改上面的 whoami应用的 Ingress 资源对象,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat << EOF >ing.yml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: whoami
  annotations:
    cert-manager.io/issuer: "staging-http01"
spec:
  tls:
    - hosts:
        - whoami.boysec.cn
      secretName: whoami-tls
  rules:
    - host: whoami.boysec.cn
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  name: web
EOF

验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get issuer -o wide
NAME                READY   STATUS                                                 AGE
production-http01   True    The ACME account was registered with the ACME server   18m
staging-http01      True    The ACME account was registered with the ACME server   19m
$ kubectl get certificateRequest -o wide
NAME                            APPROVED   DENIED   READY   ISSUER            STATUS
tls-whoami-ingress-http-fdw2x   True                True    le-example-http   Certificate fetched from issuer successfully

$ kubectl get certificates
NAME                      READY   SECRET                    ISSUER            STATUS
tls-whoami-ingress-http   True    tls-whoami-ingress-http   le-example-http   Certificate is up to date and has not expired

方法二(推荐)

通过修改traefik ConfigMap文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
entryPoints:
      web:
        address: ":80"          ## 配置 80 端口,并设置入口名称为 web
      websecure:
        address: ":443"         # 配置443端口,并设置入口名称为 websecure
    certificatesResolvers:
      wangxiansen-test: # 可以换成你喜欢的名字
        acme:
          caServer: https://acme-staging-v02.api.letsencrypt.org/directory # ACME 服务端地址
          email: wangxiansen@boysec.cn # 届时你申请签发证书的邮箱
          storage: acme-staging-web.json           # 存储位置
          httpChallenge:
            entryPoint: web
      wangxiansen: # 可以换成你喜欢的名字
        acme:
          email: wangxiansen@boysec.cn # 届时你申请签发证书的邮箱
          storage: acme-web.json           # 存储位置
          httpChallenge:
            entryPoint: web

创建ingressroute

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoamiauto-tls-http
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`whoami.boysec.cn`)
    kind: Rule
    services:
      - name: whoami
        port: 80
  tls:
    certResolver: wangxiansen-test

打开浏览器就会发现申请测试的证书了,然后修改certResolverwangxiansen

DNS-01 校验

DNS-01 的校验是通过 DNS 提供商的 API 拿到你的 DNS 控制权限, 在 Let’s Encrypt 为 cert-manager 提供 TOKEN 后,cert-manager 将创建从该 TOKEN 和你的帐户密钥派生的 TXT 记录,并将该记录放在 _acme-challenge.。然后 Let’s Encrypt 将向 DNS 系统查询该记录,如果找到匹配项,就可以颁发证书,这种方法是支持泛域名证书的。

方法一

测试环境生成环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat <<EOF >staging-dns.yml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
 name: boysec-staging-dns
 namespace: whoami
spec:
 acme:
   email: user@example.com
   # We use the staging server here for testing to avoid hitting
   server: https://acme-staging-v02.api.letsencrypt.org/directory
   privateKeySecretRef:
     # if not existing, it will register a new account and stores it
     name: boysec-staging-key
   solvers:
     - dns01:
         cloudflare:
           apiTokenSecretRef:
             name: cloudflare-api-token-secret
             key: api-token

EOF
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat <<EOF >production-dns.yml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
 name: boysec-dns
 namespace: whoami
spec:
 acme:
   email: user@example.com
   # We use the staging server here for testing to avoid hitting
   server: https://acme-v02.api.letsencrypt.org/directory
   privateKeySecretRef:
     # if not existing, it will register a new account and stores it
     name: boysec-key
   solvers:
     - dns01:
         cloudflare:
           apiTokenSecretRef:
             name: cloudflare-api-token-secret
             key: api-token

EOF

方法二(推荐)

通过修改traefik ConfigMap文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
entryPoints:
      web:
        address: ":80"          ## 配置 80 端口,并设置入口名称为 web
      websecure:
        address: ":443"         # 配置443端口,并设置入口名称为 websecure
      certificatesResolvers:
        tencent-test: # 可以换成你喜欢的名字
          acme:
            email: wangxiansen@boysec.cn # 届时你申请签发证书的邮箱
            storage: acme-staging-dns.json 
            caServer: https://acme-staging-v02.api.letsencrypt.org/directory
            dnsChallenge:
              provider: tencentcloud # 腾讯云的编码
              delayBeforeCheck: 0
              resolvers:         
                - "119.29.29.29:53" # 腾讯云的 DNS 地址
        tencent: # 可以换成你喜欢的名字
          acme:
            email: wangxiansen@boysec.cn # 届时你申请签发证书的邮箱
            storage: acme-dns.json
            dnsChallenge:
              provider: tencentcloud # 腾讯云的编码
              delayBeforeCheck: 0
              resolvers:         
                - "119.29.29.29:53" # 腾讯云的 DNS 地址

然后创建密钥

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create secret generic tencent-token --from-literal=TENCENTCLOUD_SECRET_ID=AKIDoSadfsafdsfasdfsdfLBj23 --from-literal=TENCENTCLOUD_SECRET_KEY=lFTP4afafasdfsfdfsgasfgfMK1Ra7NM -n kube-system

$ kubectl edit -n kube-system pods traefik-v2-6996759d46-d9czt 
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 1
      containers:
        - name: traefik-v2
          image: traefik:v2.10
          args:
            - --configfile=/config/traefik.yaml
          envFrom:          # 添加环境变量
            - secretRef:
                name: tencent-token

创建ingressroute

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat << EOF > auto-tls-dns.yml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: whoami-auto-tls-dns
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(\`who.boysec.cn\`)
      kind: Rule
      services:
        - name: whoami
          port: 80
  tls:
    certResolver: tencent-test
    domains:
    - main: boysec.cn        
      sans:
      - '*.boysec.cn'        # 匹配所有boysec.cn下的二级域名
EOF

打开可以发现测试证书已下发,可以替换生成环境证书将certResolver替换为生产环境证书

再次访问就会发现证书是受信任的了

由于写文章测试过多被域名重复申请限制,所以先截图测试环境图,后期补上生成环境图

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
k8s中使用cert-manager玩转证书
前几天写过一篇k8s加入TLS安全访问,其中说到用cfssl之类的工具手动生成TLS证书,这样就可以轻松搞定站点的https访问了。理想是很美好,但实际操作时却很痛苦,主要有以下几点缺陷:
jeremyxu
2019/03/13
11.4K2
k8s中使用cert-manager玩转证书
Step by Step!教你如何在k3s集群上使用Traefik 2.x
Traefik是一个十分可靠的云原生动态反向代理。轻量级Kubernetes发行版K3s早在去年就已经内置Traefik,将其作为集群的默认反向代理和Ingress Controller。然而,在本文成文时K3s中的默认内置Traefik版本为v1.7.14。这一版本固然也能很好地运行,但还是少了一些有用的功能。我最想用的功能是为正在使用的Ingress Route自动生成Let’s Encrypt证书。而使用Traefik 2.x版本可以获得这一功能,甚至还有更多其他功能。那么,我们来看看如何使用K3s设置并使用新版本的Traefik。
k3s中文社区
2020/04/10
3.8K0
Step by Step!教你如何在k3s集群上使用Traefik 2.x
手把手教你使用 cert-manager 签发免费证书
roc,腾讯高级工程师,Kubernetes Contributor,热爱开源,专注云原生领域。目前主要负责腾讯云TKE 的售中、售后的技术支持,根据客户需求输出合理技术方案与最佳实践,为客户业务保驾护航。 概述 随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支。cert-manager 是 Kubernetes 上的全能证书管理工具,如果对安全级别和证书功能要求不高,可以利用
腾讯云原生
2020/10/27
3.6K0
Cert Manager 申请 SSL 证书流程及相关概念 - 一
2022.3.9 用 cert-manager 申请成功通配符证书 (*.ewhisper.cn), 2022.4.30 该证书距离过期还有 30 天,cert-manager 进行自动续期,但是却失败了。😱😱😱 然后过了几天,在 2022.5.8, 最终成功了。如下图: 续期成功的 ewhisper.cn 通配符证书 正好借着这个情况捋一下 cert-manager 的 SSL 证书申请流程以及过程中涉及到的相关概念。 中英文对照表 英文 英文 - K8S CRD 中文 备注 certificates
东风微鸣
2022/06/14
1.1K0
Cert Manager 申请 SSL 证书流程及相关概念 - 一
Cert Manager 申请SSL证书流程及相关概念-三
Issuers 和 ClusterIssuers 是 Kubernetes CRD,代表证书颁发机构(CA),能够通过兑现证书签名请求来生成签名证书。所有 cert-manager 证书都需要一个被引用的签发者,该签发者处于准备就绪的状态,可以尝试兑现请求。
东风微鸣
2022/06/14
1.2K0
Cert Manager 申请SSL证书流程及相关概念-三
k3s 使用 Letsencrypt 和 Traefik 完成 https 入口部署
完成了 k3s 集群的部署,下一步就是需要对外暴露服务,在当下这个网络安全日趋紧迫的时刻,加密传输已经成为 Web 服务的标配。
宋天伦
2023/10/20
6940
k3s 使用 Letsencrypt 和 Traefik 完成 https 入口部署
K3S 从放弃到入门(二)使用域名访问dashboard
书接上回,首先对上一篇文章做一个补充:主、从节点还需要打开TCP:10250端口。
2022/03/30
3.1K0
k8s安装自动证书签发cert-manager letsencrypt
创建 namespace kubectl create namespace cert-manager 安装 crds kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yaml 标记命名空间 cert-manager 为 disable-validation kubectl lab el namespace cert-manager
少羽大怪兽
2020/10/16
9310
【K8s】Kubernetes 证书管理工具 Cert-Manager
根据官方介绍,Cert-Manager 是一个开源的云原生证书管理(Cloud Native Certificate Management)工具,适用于 Kubernetes 和 OpenShift 的 X.509 证书管理。
行者Sun
2024/10/23
3560
【K8s】Kubernetes 证书管理工具 Cert-Manager
Cert Manager 申请SSL证书流程及相关概念-二
这张图显示了使用 ACME/Let's Encrypt Issuer 的名为cert-1的证书的生命周期:
东风微鸣
2022/06/14
1.1K0
Cert Manager 申请SSL证书流程及相关概念-二
Kubernetes之Ingress自动化https
在Kubernetes集群中使用 HTTPS 协议,需要一个证书管理器、一个证书自动签发服务,主要通过 Ingress 来发布 HTTPS 服务,因此需要Ingress Controller并进行配置,启用 HTTPS 及其路由。
仙人技术
2020/04/29
1.6K0
使用 Cert-Manager 实现 Ingress Https
什么是 HTTPS 超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息,HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP 协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
iMike
2019/07/29
1.6K0
基于AWS EKS的K8S实践 - 打通外网对集群内服务的调用
service 通常用作集群内服务之前的通信,ingress 通常用于暴露给集群外的服务使用。
shysh95
2023/08/23
8401
基于AWS EKS的K8S实践 - 打通外网对集群内服务的调用
自动签发https证书工具 cert manager
最近cert manager进行升级,不再支持0.11以下的版本了,所以进行升级。但是发现不能直接通过更改镜像版本来升级,在Apps里的版本也是旧版本,部署后发现不支持,于是自已动手,根据文档整理了一套部署cert manager的过程。
少羽大怪兽
2019/11/08
9880
27 Dec 2021 cert-manager签发证书
这里需要指定clusterissuer和生成证书的secret名字,创建certificate:
俊采
2023/10/17
2230
Kubernetes (K8S)中Traefik路由(ingressRoute)
kubernetes 中使用 Traefik ingress 的 ingressRoute 代理 http、https、tcp、udp。
王先森sec
2023/10/17
2.8K0
Kubernetes (K8S)中Traefik路由(ingressRoute)
利用cert-manager让Ingress启用免费的HTTPS证书
cert-manager 是替代 kube-lego 的一个开源项目,用于在 Kubernetes 集群中自动提供 HTTPS 证书,支持 Let’s Encrypt, HashiCorp Vault 这些免费证书的签发。
imroc
2018/07/26
2.5K0
KubernetesIngress自动化https
随着 HTTPS 不断普及,大多数网站开始由 HTTP 升级到 HTTPS。使用 HTTPS 需要向权威机构申请证书,并且需要付出一定的成本,如果需求数量多,则开支也相对增加。cert-manager 是 Kubernetes 上的全能证书管理工具,支持利用 cert-manager 基于 ACME 协议与 Let’s Encrypt 签发免费证书并为证书自动续期,实现永久免费使用证书。
mikelLam
2022/10/31
8600
KubernetesIngress自动化https
TKE/EKS集群使用cert-manager申请免费的HTTPS证书
cert-manager是一个云原生证书管理开源工具,用于在Kubernetes集群中提供HTTPS证书并自动续期。以下示例介绍了如何使用cert-manager给nginx ingress申请免费证书并自动续期。
聂伟星
2023/12/16
4980
TKE之Traefik最佳实践
k8s的接入层有很多种,常见的7层负载均衡有nginx-ingress、traefik、kong等,还有每个云厂商为了对接自己的负载均衡产品所开发的控制器,tke集群现在默认是clb类型ingress,也支持组件安装nginx-ingress到集群内使用,其他类型的网关,需要自己在集群内部署才行,今天我们讲讲traefik在tke上的部署安装和一些使用实践。
聂伟星
2022/03/18
2.4K0
相关推荐
k8s中使用cert-manager玩转证书
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验