AKS 中的 Cert-Manager 和 Nginx 在同一个伞形舵图下无法颁发我的证书

Már*_*tek 6 ssl nginx kubernetes-helm azure-aks cert-manager

自从我开始学习和实验以来,我对 Kubernetes 的体验相对较少,大约一个月左右。我正在将我的设置从 azure 应用程序服务迁移到 AKS,并且在 nginx 入口控制器和证书管理器协同工作时遇到了一些问题。也许是 dns 记录更改的时间或我安装软件包的方法导致了我的问题

我的一般方法是,我有一个网络图表和一个应用程序图表,这意味着我必须安装网络图表的一个实例/版本,并且我可以安装应用程序图表的多个实例/版本(暂存、质量保证、生产环境)。

我的网络图表如下所示:

图表.yaml:

apiVersion: v2
name: networking
description: A Helm chart for Kubernetes
type: application
version: 0.0.1
appVersion: "1.1.0"
icon: <<I have iconurl here>>

dependencies:
  - name: nginx-ingress
    version: 0.14.0
    repository: https://helm.nginx.com/stable
    alias: nginx-ingress
  - name: cert-manager
    version: 1.8.2
    repository: https://charts.jetstack.io
Run Code Online (Sandbox Code Playgroud)

值.yaml:

replicaCount: 1

cert-manager:
  installCRDs: true

nginx-ingress:
  controller:
    service:
      annotations: 
        "service.beta.kubernetes.io/azure-load-balancer-health-probe-request-path": /healthz
Run Code Online (Sandbox Code Playgroud)

我此图表中没有模板

应用程序图表具有给定环境的发行者和入口资源,如下所示:

入口.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  {{ if eq .Values.environment "Release" }}
  namespace: release
  {{ else if eq .Values.environment "ReleaseQA" }}
  namespace: release-qa
  {{ else if eq .Values.environment "ReleaseProd" }}
  namespace: release-prod
  {{ else }}
  {{ required "value for .Values.environment is not as expected" .Values.environment }}
  {{ end }}
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    # ingress.kubernetes.io/ssl-redirect: "false" # I tried these various options
    cert-manager.io/issuer: letsencrypt-nginx
    # acme.cert-manager.io/http01-ingress-class: "nginx-cert-controller" # I tried these various options
spec:
  tls:
    {{ if eq .Values.environment "Release" }}
    - hosts:
        - core.staging.foo.com
      secretName: core-cert-nginx
    - hosts:
        - portal.staging.foo.com
      secretName: portal-cert-nginx
    - hosts:
#more tsl definitions here for other environments
#and the rules later in the file:
  ingressClassName: nginx
  rules:
    {{ if eq .Values.environment "Release" }}
    - host: core.staging.foo.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: core-service
                port: 
                  number: 80
    - host: portal.staging.foo.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: portal-service
                port: 
                  number: 80
Run Code Online (Sandbox Code Playgroud)

发行者.yaml

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-nginx
  {{ if eq .Values.environment "Release" }}
  namespace: release
  {{ else if eq .Values.environment "ReleaseQA" }}
  namespace: release-qa
  {{ else if eq .Values.environment "ReleaseProd" }}
  namespace: release-prod
  {{ else }}
  {{ required "value for .Values.environment is not as expected" .Values.environment }}
  {{ end }}
spec: 
  acme:
    email: <<my-valid-acme-email>>
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-nginx-private-key
    solvers:
      # Use the HTTP-01 challenge provider
      - http01:
          ingress:
            class: nginx
Run Code Online (Sandbox Code Playgroud)

所有内部服务和应用程序 Pod 也已创建且运行良好。

所以问题是为什么我的 http01 挑战总是失败?我还在集装箱码头中使用过,并描述了 kubectl 的挑战,但我得到了相同的结果,即无法达到 cert-manager 创建的挑战,换句话说,在配置之间切换时,我得到 302,404,502 代码或只是路由到我的应用程序。

我还遇到了一种奇怪的行为,我无法正确诊断,如果挑战在第一次尝试时没有失败,它就可以通过,并且我可以使用 cet-manager kubectl 扩展来更新它。在这里我应该提到,我正在使用外部域提供商,并且我必须以最短的停机时间重新路由流量,因此在完成挑战之前,在将域地址设置为新 IP 之前,它们可能会失败很多时间。

我可能应该提到我正在使用的 kubernetes 环境详细信息:

平台:Azure AKS

库伯内特版本:1.23.5

nginx-ingress 图表版本:0.14.0

证书管理器图表版本:1.8.2

Pod 中运行的应用程序有:

  • 2*静态反应网站
  • 4*.NET Core 后端 API 和其他类型的服务。

如果您需要令人上瘾的信息来帮助,请在评论/答案中告诉我。

Már*_*tek 0

我通过acme.cert-manager.io/http01-edit-in-place: "true"在入口处添加注释解决了这个问题。由于某种原因,两种不同的入口资源使我的入口控制器感到困惑。但从那时起,我转向了 dns01 挑战,因为它们提供了更好的多功能性。