我正在尝试在 kubernetes 上使用
wildcard
。但我没有成功。
我的想法是配置通配符,以便我的应用程序使用动态子域。我在本地这样做,但是当我尝试部署时遇到了这个问题。我正在使用数字海洋集群。
我像这样配置了我的 k8s 文件。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: apps
name: menu-deployment
spec:
replicas: 1
selector:
matchLabels:
app: menu
template:
metadata:
labels:
app: menu
spec:
containers:
- name: menu
image: company/company-menu:$VERSION
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
env:
- name: VERSION
value: $VERSION
imagePullSecrets:
- name: hub
---
apiVersion: v1
kind: Service
metadata:
namespace: apps
name: menu-service
spec:
selector:
app: menu
ports:
- name: http
port: 80
targetPort: 80
type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: apps
name: menu-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
kubernetes.io/ingress.class: 'nginx'
ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- menu.mydomain.dev
- '*.menu.mydomain.dev'
secretName: menuwild-tls
rules:
- host: menu.mydomain.dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: menu-service
port:
number: 80
但我明白了
menuwild-tls False menuwild-tls 27m
我尝试了很多方法,但没有效果
问题是,您无法使用
HTTP-01
acme-challenge 为通配符 DNS 名称颁发证书。您需要证明“更强的挑战”。您需要 DNS-01
质询设置,这反过来会创建一些 DNS 记录来验证您对 DNS 名称的权限。为此,证书管理器需要您的 DNS 服务器访问权限才能执行一些 API 调用。您需要从数字海洋获取访问令牌,并使用数据密钥 digitalocean-dns
创建一个名为
access-token
的秘密,并在 Issuer
配置中引用它,如下所示。也请查看 docs。 发行人
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: letsencrypt-digital-ocean-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-cloudlfare-prod
solvers:
- dns01:
digitalocean:
tokenSecretRef:
name: digitalocean-dns
key: access-token
入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/issuer: letsencrypt-digital-ocean-prod
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
name: test-ing
namespace: default
spec:
ingressClassName: nginx
rules:
- host: '*.menu.mydomain.dev'
http:
paths:
- backend:
service:
name: test
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- '*.menu.mydomain.dev'
secretName: wild-menu-tls
调试时,检查 cert-manager pod 的日志:
k logs -f cert-manager-3f43v34f34-fg3 -n cert-manager
如果您检查
Certificate
状态,它们不会因错误而更新。
注意: 您还需要两个DNS
A
记录作为负载均衡器 IP,名称为 menu
和 *.menu
。我已经在真实环境中验证了这一点。如果您需要进一步指导,请告诉我。