【k8s运维笔记】使用 cert-manager 自动申请 cloudflare 免费证书

概述

先上一些废话说一说 HTTPS

HTTPS证书(Hyper Text Transfer Protocol Secure certificate)是一种用于加密和验证网站安全性的数字证书。它通过在网络通信中使用加密技术,确保用户在浏览网站时的数据传输是安全的。

再上一些废话说一说 ingress-nginx

Ingress-Nginx 是 Kubernetes 中的一个开源项目,它提供了一个基于 Nginx 的 Ingress 控制器实现。Ingress 是 Kubernetes 中一个用于管理和暴露 HTTP 和 HTTPS 路由的 API 资源,而 Ingress-Nginx 则是为这个功能提供了一种解决方案。

最后说说动机

搭建完一套 k8s 服务后,使用 ingress-nginx 发布web服务,希望能够用使用 cloudflare 免费证书实现 https 访问来提高B格,之前看过很多资料,在有了域名并在 cloudflare 托管为前提,除却 cert-manager 部署和 cloudflare 配置以外实际上真正要创建的东西也就3个。

  • Secret

用来存储 cloudflare 的令牌

  • Issuer / ClusterIssuer

用来管理和颁发证书的资源对象

  • Ingress:

设置 tls 自动获取证书

实际操作

安装 cert-manager

直接去先去cert-manager 官网复制安装脚本执行

bash 复制代码
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

配置 cloudflare 令牌

在 cloudflare 里增加令牌,并配置以下权限

markdown 复制代码
- Permissions
  - Zone - DNS - Edit
  - Zone - Zone - Read
- Zone Resources:
  - Include - All Zones

定义 Issuer / Cluster Issuer

此步骤根据情况,如果让命名空间范围内的资源使用证书就参考 Secret / Issuer, 如果让整个集群范围内的资源使用证书,就参考 Secret / ClusterIssuer

Secret / Issuer

bash 复制代码
cat <<EOF | kubectl apply -f - > /dev/null
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager
type: Opaque
stringData:
  api-token: '<REDACTED>' # 这里的值为[配置API Token]一节中创建的API Token值

---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: cloudflare-acme-issuer
  namespace: <你的命名空间> # 命名空间
spec:
  acme:
    email: '<REDACTED>'
    # 配置证书目录,演练环境使用Staging环境
    # server: https://acme-v02.api.letsencrypt.org/directory
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: acme-issuer-account-key
    solvers:
    - dns01:
        cloudflare:
          apiTokenSecretRef:
            name: cloudflare-api-token-secret # 引用当前文档中创建的Secret名称
            key: api-token
EOF

Secret / ClusterIssuer

bash 复制代码
cat <<EOF | kubectl apply -f - > /dev/null
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare-api-token-secret
  namespace: cert-manager # 这里配置为安装cert-manager资源的命名空间
type: Opaque
stringData:
  api-token: '<REDACTED>' # 这里的值为[配置API Token]一节中创建的API Token值

---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: cloudflare-acme-cluster-issuer
spec:
  acme:
    email: '<REDACTED>'
    # 配置证书目录,演练环境使用Staging环境,注意区分
    server: https://acme-v02.api.letsencrypt.org/directory
    # server: https://acme-staging-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: acme-issuer-account-key
    solvers:
    - dns01:
        cloudflare:
          apiTokenSecretRef:
            name: cloudflare-api-token-secret # 引用当前文档中创建的Secret名称
            key: api-token
EOF

配置 ingress

ingress 里加声明,如果之前的配置都加过了,在访问 ingress 里定义的host之后就能自动注册证书实现 https 访问。

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: cloudflare-acme-cluster-issuer 
    # 如果是命名空间范内的则写 Issuer
    # cert-manager.io/issuer: cloudflare-acme-issuer
spec:
  tls:
  - hosts:
    - '*.xxx.xxx' # 域名
    secretName: <name> # 自定义名称随便写,会自动生成 Certificate、CertificateRequest

最后

本方案是在家里搭建了一个服务,有一台VPS公网ip的情况下,使用了 frp 做了内网穿透并通过 cloudflare 托管了域名的情况下实现的 https 访问,如果只有域名没有VPS公网ip,也有方法通过 cloudflare 免费发布服务,用到了 cloudflare 零信任隧道,这个以后再说吧。

相关推荐
加油勇士25 分钟前
NGINX 参数配置与调优
运维·服务器·nginx
回忆是昨天里的海29 分钟前
k8s-部署spring cloud微服务
spring cloud·微服务·kubernetes
wenyi_leo32 分钟前
强大的claude code
linux·运维·服务器
宇钶宇夕34 分钟前
CoDeSys入门实战一起学习(二十六):功能块(FBD)运算块与EN/ENO指令精讲及计数控制案例
运维·学习·自动化·软件工程
知无不研34 分钟前
Linux下socket网络编程
linux·运维·网络·后端·socket编程
2401_8582861136 分钟前
OS55.【Linux】System V消息队列的简单了解
linux·运维·服务器
zdIdealism37 分钟前
cnPuTTY CAC 0.83 Update 1—PuTTY CAC 0.83中文版本简单说明~~
linux·运维·服务器·ssh·putty·putty-cac
landonVM44 分钟前
Linux VPS 怎么设置密钥登录
linux·运维·服务器
RisunJan1 小时前
Linux命令-ln(在文件或目录之间创建链接)
linux·运维·服务器
China_Yanhy1 小时前
我的区块链运维日记 · 第 13 日:跨链惊魂 —— Layer 2 的“快”与“慢”
运维·区块链