首页 > 解决方案 > Let's Encrypt 的主机名相同但路径不同

问题描述

我已经在集群中使用 cert-manager 配置了 Let's Encrypt,它适用于我的大多数用例。但是,我有一个应用程序在同一主机名上多次安装但路径不同。

我的入口定义如下

{{- if .Values.ingress.enabled -}}
{{- $fullName := include "whoami-go.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- $tls := hasKey .Values.ingress "certIssuer" -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: {{ $fullName }}
  labels:
    {{- include "whoami-go.labels" . | nindent 4 }}
  annotations:
  {{- if $tls }}
    cert-manager.io/cluster-issuer: {{ .Values.ingress.certIssuer | quote }}
    ingress.kubernetes.io/ssl-redirect: "true"
  {{- end }}
spec:
  {{- if $tls }}
  tls:
    - secretName: {{ $fullName }}-tls
      hosts:
        - {{ .Values.ingress.hostname | quote }}
  {{- end }}
  rules:
    - host: {{ .Values.ingress.hostname | quote }}
      http:
        paths:
          - path: {{ .Values.ingress.path }}
            pathType: Prefix
            backend:
              service:
                name: {{ $fullName }}
                port:
                  number: {{ $svcPort }}
{{- end }}

它是用如下值实例化的

ingress:
  enabled: true
  hostname: whoami-go.c.dhis2.org
  path: /something
  certIssuer: letsencrypt-prod

path每次安装都会更改哪里。

问题...

E0520 03:13:49.242770 1 sync.go:210] cert-manager/controller/orders "msg"="failed to create Order resource due to bad request, marking Order as failed" "error"="429 urn:ietf:params:acme:error:rateLimited: Error creating new order :: too many certificates already issued for exact set of domains: whoami-go.c.dhis2.org: see https://letsencrypt.org/docs/rate-limits/" "resource_kind"="Order" "resource_name"="finland-whoami-go-tls-tzvk6-4169341110" "resource_namespace"="whoami" "resource_version"="v1"

由于只更新了路径,我希望 cert-manager 会重用证书,但显然情况并非如此。我可以以某种方式将我的应用程序配置为在同一图表的多个安装中使用相同的证书作为相同的主机名吗?

标签: kuberneteskubernetes-ingresslets-encrypt

解决方案


错误含义

urn:ietf:params:acme:error:rateLimited: Error creating new order :: too many certificates already issued for exact set of domains: whoami-go.c.dhis2.org:

我们只能在一周内向 let's encrypt 请求一定数量的 SSL/TLS 证书。

阅读更多:https ://letsencrypt.org/docs/rate-limits/

因此,它显示了速率限制的错误。我们可以为重复证书申请每周 5 个证书。

您正在使用certIssuer:letsencrypt-prod或集群颁发者,它将把秘密存储到Kubernetes 秘密中。

在创建具有不同路径的入口时,只需根据需要更改秘密或将秘密添加到入口,您的入口将使用 HTTPS。

同时只保留一个与集群颁发者或颁发者的入口,因此如果证书被探索,它可以自动更新为秘密,并且该秘密将被其他入口使用。

我的简单入口将他的SSL/TLS证书存储为秘密。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: sls-dev
    nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "1800"
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: "15m"
  name: sls-function-ingress
spec:
  rules:
  - host: app.dev.example.io
    http:
      paths:
      - path: /api/v1/
        backend:
          serviceName: test-service
          servicePort: 80
  tls:
  - hosts:
    - app.dev.example.io
    secretName: sls-secret

您可以保留cert-manager.io/cluster-issuer: sls-dev一个入口,而其他唯一需要附加的秘密。


推荐阅读