概述
先上一些废话说一说 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 零信任隧道,这个以后再说吧。