【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 零信任隧道,这个以后再说吧。

相关推荐
小歆8843 分钟前
100%全国产化时钟服务器、全国产化校时服务器、全国产化授时服务器
运维·服务器
翻滚吧键盘33 分钟前
debian中apt的配置与解析
运维·debian
workingman_li1 小时前
centos虚拟机异常关闭,导致数据出现问题
linux·运维·centos
Jackson~Y2 小时前
Linux(LAMP)
linux·运维·服务器
不知 不知2 小时前
最新-CentOS 7安装1 Panel Linux 服务器运维管理面板
linux·运维·服务器·centos
sunnyday04263 小时前
feign调用跳过HTTPS的SSL证书校验配置详解
java·网络·https·ssl
m0_748239473 小时前
springBoot发布https服务及调用
spring boot·后端·https
元气满满的热码式3 小时前
K8S中Service详解(三)
云原生·容器·kubernetes
晚秋贰拾伍4 小时前
设计模式的艺术-职责链模式
运维·设计模式·运维开发·责任链模式·开闭原则·单一职责原则
花糖纸木4 小时前
【Linux】深刻理解动静态库
linux·运维·服务器