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

相关推荐
寻星探路1 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
王达舒19941 小时前
HTTP vs HTTPS: 终极解析,保护你的数据究竟有多重要?
网络协议·http·https
朱皮皮呀1 小时前
HTTPS的工作过程
网络协议·http·https
Binary-Jeff1 小时前
一文读懂 HTTPS 协议及其工作流程
网络协议·web安全·http·https
七夜zippoe4 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6486 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满6 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠6 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9036 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
陈桴浮海7 小时前
Kustomize实战:从0到1实现K8s多环境配置管理与资源部署
云原生·容器·kubernetes