0

是否可以使用 cert-manager 仅在一个命名空间中具有 ACME 服务器的集群中为有效负载生成证书?据我了解,cert-manager 尝试通过退出集群和进入集群来访问 dns 名称以进行 http chalange,但是如果我不想离开集群怎么办?我不希望 cert-manager 创建 Ingress 资源。让整个挑战发生在集群内部。

我的情况:

  • 我的一个命名空间中有 ACME 服务器(step-ca)
  • 我需要在另一个命名空间中为我的 POD 创建证书,例如通用名称“${app}.${namespace}”

备注:在我的情况下,由于板上的 istio,问题更加复杂。对于入口流量,cert-manager 可以与内部 ACME 服务器正常工作,但对于出口流量,我需要通过 stunnel(在每个 POD 中)才能到达外面的 Squid,我需要这些证书用于 stunnel。

4

1 回答 1

0

我想出的唯一方法:

每个应用程序都有自己的 Issuer

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: k8s-acme-local
  namespace: ${APP_NS}
spec:
  acme:
    email: some@email
    privateKeySecretRef:
      name: k8s-acme-local
    server: https://${ACME_SVC}.${ACME_NS}/acme/acme/directory
    solvers:
    - http01:
        ingress: 
          podTemplate:
            metadata:
              labels:
                app: ${APP}
          ingressTemplate: {}
          serviceType: ClusterIP

在创建证书资源之前,我创建了服务来接管流量${APP}.{APP_NS}

apiVersion: v1
kind: Service
metadata:
  name: ${APP}
  namespace: ${APP_NS}
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8089
  selector:
    app: ${APP}
  sessionAffinity: None
  type: ClusterIP

然后是证书资源:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: ${APP}
  namespace: ${APP_NS}
spec:
  secretName: ${APP}
  issuerRef:
    name: k8s-acme-local
    kind: Issuer
    group: cert-manager.io
  commonName: ${APP}.${APP_NS}
  dnsNames: 
  - ${APP}.${APP_NS}

现在 Acme 服务器将对我的服务进行挑战,而不是通过保持未使用的 Ingress(和 cer-manager 服务)。我不喜欢它,但它有效。这种方法有一个严重的缺点。集群中的每个人都可以这样做并模拟任何现有或不存在的应用程序。我期待您的意见和建议。

于 2021-09-25T06:09:44.407 回答