Cert-manager 部署
1、创建 Namespace
kubectl create namespace cert-manager
2、安装 CustomResourceDefinitions (CRDs)
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.crds.yaml
3、部署 cert-manager
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.3/cert-manager.yaml
4、创建 ClusterIssuer
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com # 用于 Let's Encrypt 通知和问题证书时的联系邮箱
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: ingress # 指定使用的 Ingress 控制器类别,根据您的实际情况进行更改
metadata.name
:为 ClusterIssuer 指定一个名称,例如letsencrypt-prod
。spec.acme.server
:指定 Let's Encrypt ACME 服务器的 URL。通常情况下,您可以使用 Let's Encrypt 的生产服务器地址。spec.acme.email
:提供一个用于 Let's Encrypt 通知和问题证书时的联系邮箱。spec.acme.privateKeySecretRef.name
:指定存储 ACME 客户端私钥的 Kubernetes Secret 的名称。如果没有现有的 Secret,cert-manager
将自动生成并使用它。spec.acme.solvers
:定义用于验证证书颁发请求的解析器。在上面的示例中,使用 HTTP 验证解析器(http01),并指定了 Ingress 控制器的类别。您可以根据您的 Ingress 控制器类别和配置进行相应更改。
5、创建测试ingress 自动申请证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-ingress
namespace: test-ingress
annotations:
kubernetes.io/ingress.class: ingress
kubernetes.io/ingress.rule-mix: "true"
cert-manager.io/cluster-issuer: letsencrypt-prod # 指定关联的 ClusterIssuer
spec:
tls:
- hosts:
- test.abc.com # 指定需要证书的域名
secretName: test.abc.com.tls # 证书将被存储在此 Kubernetes Secret 中
rules:
- host: test.abc.comm # 指定规则的域名
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: serviceName # 指定后端服务的名称
port:
number: 8080 # 指定后端服务的端口
metadata.name
:为 Ingress 资源指定一个名称,例如example-ingress
。annotations.cert-manager.io/cluster-issuer
:在 Ingress 上使用注释指定要使用的 ClusterIssuer 的名称。这将告诉cert-manager
使用哪个颁发机构来签发证书。tls.hosts
:在tls
部分下,列出需要证书的域名。在上述示例中,example.com
是需要证书的域名。您可以指定多个域名,以逗号分隔。tls.secretName
:指定一个 Kubernetes Secret 的名称,用于存储颁发的证书。rules.host
:在rules
部分下,指定规则的域名,即您要为其创建 Ingress 规则的域名。rules.http.paths.backend.service.name
和rules.http.paths.backend.service.port.number
:指定后端服务的名称和端口,以将流量路由到后端服务。