kubernetes - 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 会重用证书,但显然情况并非如此。我可以以某种方式将我的应用程序配置为在同一图表的多个安装中使用相同的证书作为相同的主机名吗?
解决方案
错误含义
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
一个入口,而其他唯一需要附加的秘密。
推荐阅读
- reactjs - 如何在谷歌地图反应中显示共享链接
- flutter - Flutter viewInsets.bottom 不是键盘高度
- flutter - 无论如何在颤动中改变textlengthlimit指标的属性?
- javascript - 子组件表单提交后反应不更新父组件上的数据
- reactjs - 在 Django 和 Reactjs 中发布 http://localhost:16/auth/registration/ 400(错误请求)
- plotly-dash - 按钮创建并点击后如何让回调函数运行?
- mysql - 将数据库拆分为多租户数据库
- reactjs - 在 react webpack 打包中添加自定义字体
- java - 明确设置 SecurityContextHolder.getContext().setAuthentication(authenticationToken) 有什么需要?
- c++ - 如何解决大 n 的斐波那契数的数据溢出问题?