使用阿里云dns给traefik配置ssl证书

524 阅读2分钟

前言

如何配置k8s上的网关服务traefik 我在前面已经说过了,详见这篇,但是呢之前配的ssl证书有点问题(用的cloudflare),为了解决这个问题,我把自己的域名的dns解析服务商换成了阿里云,下面就是自己的经验了

配置 cert-manager

cert-manager是什么?

image.png

配置cert-manager

由于我这里有很多子域名,我配了很多CNAME记录,这里呢我就选择了 acme的认证方式为 dns认证

使用阿里云dns

如果域名的管理权不在阿里云,记得从别的域名管理商那把dns解析地址给换成阿里云的地址 image.png

配置RAM 权限 获取 id 跟 secret

这个就是开启一下ram访问权限,配置一下用户

image.png

记得提取ram用户的 id跟secret 这个很重要!!!

配置cert-manager pod

这里可能会遇到镜像无法下载的问题,可以选择梯子 或者换一下镜像源

# 添加helm 库
helm repo add jetstack https://charts.jetstack.io --force-update
# 添加 cert-manager
helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.15.3 \
  --set crds.enabled=true

# 添加阿里云的webhook
helm upgrade --install alidns-webhook alidns-webhook \
    --repo https://wjiec.github.io/alidns-webhook \
    --namespace cert-manager --create-namespace \
    --set groupName=xxx.com  # 这里的groupName 下面要用

配置secret issuer 以及 Certificate

apiVersion: v1
kind: Secret
metadata:
  name: alidns-secret
  namespace: cert-manager
stringData:
  access-key-id: "你自己阿里云的id 上文提到的"
  access-key-secret: "你自己阿里云的secret 上文提到的"
---

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: xxx-acme
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: xxx # 填写邮箱名称 随便填
    privateKeySecretRef:
      name: xxx-acme # 用于存储 ACME 帐户私钥的密钥名称(可自定义名称)
    solvers:
      - dns01:
          webhook:
            groupName: xxx.com # 要和安装的时候配置的groupName一致
            solverName: alidns
            config:
              region: "cn-hangzhou" # 不用修改
              accessKeyIdRef:
                name: alidns-secret
                key: access-key-id
              accessKeySecretRef:
                name: alidns-secret
                key: access-key-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: xxx-com
  namespace: traefik
spec:
  secretName: xxx-com-tls #生成证书文件的名称
  dnsNames: # 需要签发证书的域名
  - "xxx.com" 
  - "*.xxx.com"
  issuerRef:
    name: xxx-acme # 上一步生成的ClusterIssuer的名称
    kind: ClusterIssuer
    

配置 traefik

详见这篇 这里面有traefik的配置文件,我们把生成的xxx-com-tls 配到配置文件的tls部分就行

使用https

因为traefik已经配好了tls,所以我们在我们配置的 ingressRoute 里面把 endpoint 换成 websecure就行

例子如下

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: wordpress-com
  namespace: xxx
spec:
  entryPoints:
    - websecure 
  routes:
  - match: Host(`xxx.com`)
    kind: Rule
    services:
    - name: wordpress
      port: 80

wordpress服务是我网站的首页,这里大家换成自己的服务就行 子域名也是一样的

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: harbor-web-xxx-com-tls
  namespace: harbor  
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`harbor.xxx.com`)
    kind: Rule
    services:
    - name: harbor
      port: 80