为 kubernetes 入口的通配符 dns 名称颁发证书时出错

问题描述 投票:0回答:1

我正在尝试在 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

我尝试了很多方法,但没有效果

kubernetes devops digital-ocean cert-manager
1个回答
1
投票

问题是,您无法使用

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
我已经在真实环境中验证了这一点。如果您需要进一步指导,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.