Cert-manager自动管理K8S https证书 Cert-manager对接华为云HUAWEI DNS certmanager对接华为云 HUAWEI DNS
Cert-manager自动管理https证书
Cert-manager自动管理K8S https证书
Cert-manager对接华为云HUAWEI DNS
certmanager对接华为云 HUAWEI DNS
certmanager自动管理K8S https证书 华为云
参考链接
Certmanager简介
cert-manager
是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,默认情况下证书有效期是3个月,支持 Let’s Encrypt, HashiCorp Vault 这些免费证书的签发。在Kubernetes集群中,我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。
cert-manager提供了两种资源对象,clusterissuer 和 Certificate;
Clusterissuer
是证书颁发过程中指定颁发的机构和做域名验证的提供商,在颁发的过程中需要验证域名所属人,Clusterissuer提供两种方式的认证HTTP-01
和DNS-01
, HTTP01验证方式类似放一个txt认证文件到网站根目录下方式时文件里面的内容或者是特定的文件名称。DNS01就是创建txt类型的DNS解析记录。
Certificate
声明申请的证书里面包含要申请的域名,自动维护域名的过期时间,申请人注册到颁发机构的邮箱地址。Certificate成功申请到证书之后会根据资源定义的信息在指定的命名空间下创建用于网站指定的tls secret且状态为True
。
安装Cert-manager
K8s版本支持说明。
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml
安装ClusterIssuer
使用华为云web-hook。
在得到证书申请后ClusterIssuer
会根据配置中提供的认证信息在华为云DNS中添加DNS txt验证记录。在颁发机构认证完之后又会把txt记录删除。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: <email> # 需要有效邮箱地址用户颁发证书机构的注册。
preferredChain: ''
privateKeySecretRef:
name: letsencrypt-prod
server: https://acme-v02.api.letsencrypt.org/directory # 默认提供的api地址
solvers:
- dns01: # 域名认证方式dns01
webhook:
config:
appKey: <appKey> # iam用户AK
appSecret: <appSecret> # iam用户SK
region: <region> # 域名所在 region,比如华南广州cn-south-1。
zoneId: <zoneId> # 域名Id,需要调用华为云的API获得。
groupName: acme.innoai.tech
solverName: huawei-dns
华为云获取域名zoneId
的方式。
查询公网域名id (zoneId) API Explorer (huaweicloud.com)
在API Explorername
字段填你要查询的域名。
创建证书资源(Certificate)
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: cqailinjt-ty # cert的名称
namespace: default # 创建在哪个命名空间
spec:
dnsNames:
- '*.test.cqailin.com.cn' # 申请的证书域名
issuerRef:
group: cert-manager.io
kind: ClusterIssuer
name: letsencrypt-prod # 指定clusterissuer
secretName: cqailinjt-ty # 证书tls secret名称
renewBefore: 360h # 证书多久过期前,重新申请证书
usages:
- digital signature
- key encipherment
申请成功之后状态为True
证书详情
kubectl get cert cqailinjt-ty -o yaml
.......
spec:
dnsNames:
- '*.test.cqailin.com.cn' # 证书颁发的域名
issuerRef:
group: cert-manager.io
kind: ClusterIssuer
name: letsencrypt-prod
renewBefore: 360h0m0s # 证书更新时间
secretName: cqailinjt-ty # 创建的secret名称
usages:
- digital signature
- key encipherment
status:
conditions:
- lastTransitionTime: "2023-10-25T06:07:16Z"
message: Certificate is up to date and has not expired
observedGeneration: 1
reason: Ready
status: "True"
type: Ready
notAfter: "2024-01-23T05:07:13Z" # 过期时间
notBefore: "2023-10-25T05:07:14Z"
renewalTime: "2024-01-08T05:07:13Z" # 重新更新时间
revision: 1
使用证书
]# kubectl get ingress nginx -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress/hsts: "false"
nginx.ingress/hsts-max-age: "600"
nginx.ingress/ssl-redirect: "false"
labels:
app: nginx
name: nginx
namespace: default
spec:
ingressClassName: nginx
rules:
- host: bba.test.cqailin.com.cn
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- bba.test.cqailin.com.cn
secretName: cqailinjt-ty
华为云添加解析记录
*.test.cqailin.com.cn ->192.168.21.88 # A记录
在Ingress中直接声明tls
cat xyz.test.cqailin.com.cn.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod # 添加这个注释
cert-manager.io/renew-before: 168h # 证书过期前多久更新证书
nginx.ingress/hsts: "false"
nginx.ingress/hsts-max-age: "600"
nginx.ingress/ssl-redirect: "false"
labels:
app: nginx
name: nginx
spec:
ingressClassName: nginx
rules:
- host: xyz.test.cqailin.com.cn
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- "*.test.cqailin.com.cn" # 这种方式可以直接申请泛域名证书
secretName: cqailinjt-xyz
tls
使用下面的方式可以使用泛域名证书。
tls:
- hosts:
- "*.test.cqailin.com.cn" # 这种方式可以直接省请泛域名证书
secretName: cqailinjt-xyz
如果tls
中写的是单独的域名则颁发的是单域名证书。