kubernets下使用cert-manage签发免费证书

Install cert-manager

  1. 安装helm
  2. 创建cert-manager命名空间
kubectl create namespace cert-manager
  1. 添加Jetstack helm仓库
helm repo add jetstack https://charts.jetstack.io
  1. Update heml repo
helm repo update
  1. Install cert-manager
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --version v1.10.0 \
  --set installCRDs=true

使用阿里webhook签发泛域名证书

  1. install alidns-webhook
# Install alidns-webhook to cert-manager namespace. 
kubectl apply -f https://raw.githubusercontent.com/pragkent/alidns-webhook/master/deploy/bundle.yaml
  1. 创建RAM用户。
    1. 使用阿里云账号登录RAM控制台。
      在访问控制控制台左侧导航栏,选择身份管理 > 用户。
      在用户页面,单击创建用户
      在创建用户页面输入登录名称和显示名称,选中OpenAPI调用访问,然后单击确定。
      记录RAM用户的AccessKey ID和AccessKey Secret。
    2. 授予RAM用户AliyunDNSFullAccess策略
      在用户页面单击上文创建的RAM用户右侧操作列下的添加权限。
      在添加权限面板系统策略下输入AliyunDNSFullAccess,单击AliyunDNSFullAccess,单击确定。
    3. 授予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
  1. 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编码。

  2. 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
  1. 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
  1. Verify certificate
$ kubectl get certificate -n namespace

READY 为 False:则表示签发失败,可以通过 describe 命令查看 event 来排查失败原因。
READY 为 True:则表示签发成功,证书将保存在所指定的 Secret 中。例如,default/test-mydomain-com-tls。

  1. 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

Reference

  1. 使用cert-manager管理网关的证书
  2. 使用cert-manager签发免费证书
  3. 使用 cert-manager 签发免费证书
  4. kubernetes使用cert-manager自动签发letsencrypt证书
Avatar photo

About Blackford

这是个最好的时代,这是个最坏的时代,这是个充满希望的春天,这是个令人绝望的冬天,我们前面什么都有,我们前面什么都没有。梦想,让我们一次次的走远,又一次次的回头,一个关于人生的梦想还在不断奔跑,带着喜悦和疼痛,不过一切才刚刚开始,并且直到今天也远远没有结束
This entry was posted in 架构运维. Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用*标注