Install cert-manager
- 安装helm
- 创建cert-manager命名空间
kubectl create namespace cert-manager
- 添加Jetstack helm仓库
helm repo add jetstack https://charts.jetstack.io
- Update heml repo
helm repo update
- Install cert-manager
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--version v1.10.0 \
--set installCRDs=true
使用阿里webhook签发泛域名证书
- install alidns-webhook
# Install alidns-webhook to cert-manager namespace.
kubectl apply -f https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml
- 创建RAM用户。
- 使用阿里云账号登录RAM控制台。
在访问控制控制台左侧导航栏,选择身份管理 > 用户。
在用户页面,单击创建用户
在创建用户页面输入登录名称和显示名称,选中OpenAPI调用访问,然后单击确定。
记录RAM用户的AccessKey ID和AccessKey Secret。 - 授予RAM用户AliyunDNSFullAccess策略
在用户页面单击上文创建的RAM用户右侧操作列下的添加权限。
在添加权限面板系统策略下输入AliyunDNSFullAccess,单击AliyunDNSFullAccess,单击确定。 - 授予RAM用户自定义策略。
在访问控制控制台左侧导航栏,选择权限管理 > 权限策略。
在权限策略页面单击创建权限策略。
在创建权限策略页面单击脚本编辑页签,然后输入以下内容,单击下一步。
- 使用阿里云账号登录RAM控制台。
{
"Version": "1",
"Statement": [
{
"Action": "*",
"Resource": "acs:alidns:*:*:domain/#domain-name",
"Effect": "Allow"
},
{
"Action": [
"alidns:DescribeSiteMonitorIspInfos",
"alidns:DescribeSiteMonitorIspCityInfos",
"alidns:DescribeSupportLines",
"alidns:DescribeDomains",
"alidns:DescribeDomainNs",
"alidns:DescribeDomainGroups"
],
"Resource": "acs:alidns:*:*:*",
"Effect": "Allow"
}
]
}
输入权限策略的名称,单击确定
4. 在Base64执行以下命令,为步骤1中的AccessKey ID和AccessKey Secret进行Base64编码。
echo -n <AccessKey ID> | base64
echo -n <AccessKey Secret> | base64
- Create secret contains alidns credentials
apiVersion: v1 kind: Secret metadata: name: alidns-secret namespace: cert-manager data: access-key: ****base64 secret-key: ****base64
注意这里需要对AccessKey ID和AccessKey Secret进行Base64编码。
-
Create ClusterIssuer
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# Change to your letsencrypt email
email: 11@qq.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-staging-account-key
solvers:
- dns01:
webhook:
groupName: acme.yourcompany.com
solverName: alidns
config:
region: ""
accessKeySecretRef:
name: alidns-secret
key: access-key
secretKeySecretRef:
name: alidns-secret
key: secret-key
- Issue a certificate
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: abc-lts
spec:
secretName: letsencrypt-staging
dnsNames:
- "*.abc.com"
issuerRef:
name: letsencrypt-staging
kind: ClusterIssuer
- Verify certificate
$ kubectl get certificate -n namespace
READY 为 False:则表示签发失败,可以通过 describe 命令查看 event 来排查失败原因。
READY 为 True:则表示签发成功,证书将保存在所指定的 Secret 中。例如,default/test-mydomain-com-tls。
- Create ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: abc
annotations:
# 务必添加以下两个注解, 指定 ingress 类型及使用哪个 cluster-issuer
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer:"letsencrypt-staging"
# 如果你使用 issuer, 使用以下注解
# cert-manager.io/issuer: "letsencrypt-staging"
spec:
tls:
- hosts:
- example.example.com # TLS 域名
secretName: example-tls # 用于存储证书的 Secret 对象名字
rules:
- host: example.example.com
http:
paths:
- path: /
backend:
serviceName: abc
servicePort: 80