与 Let's Encrypt 相同的主机名但不同的路径

时间:2021-05-20 05:11:55

标签: kubernetes kubernetes-ingress lets-encrypt

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

我的入口定义如下

library(rvest)

lapply(URLs, function(x) {
  x %>% 
    read_html() %>% 
    html_nodes("picture source") %>%
    html_attr("data-srcset") %>% 
    strsplit(',') %>%
    .[[1]] %>%
    na.omit %>%
    trimws %>%
    .[1] -> img
  if(!is.na(img))  download.file(img, paste0('photo', Sys.time(), '.jpeg'))
})

并使用如下值实例化

{{- 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

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

1 个答案:

答案 0 :(得分:1)

错误含义

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 保留到一个入口,而其他入口只需要秘密