我可以在 Google Kubernetes 引擎中将 Google 托管证书与 NGINX INGRESS 控制器一起使用吗?

Ram*_*Ram 8 google-kubernetes-engine cert-manager nginx-ingress

我的 GKE 中有一个 NGINX Ingress。我想让我的 URL 安全。但不幸的是我无法通过证书管理器实现这一点。我看到一个创建托管证书的选项。但我不确定是否有注释允许我在 NGINX Ingress 中使用 google 管理的证书。控制器。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-https
  namespace: non-default
  annotations:
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.class: "nginx"
    networking.gke.io/managed-certificates: "managed-certificate"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    cert-manager.io/issuer: "letsencrypt-production"
spec:
  tls:
    - hosts:
        - example.com
      secretName: selfsigned-cert-tls
  rules:
    - host: example.com
      http:
        paths:
          - path: "/"
            backend:
              serviceName: hello-service
              servicePort: hello-port
          - path: "/kube"
            backend:
              serviceName: hello-kubernetes
              servicePort: 80
Run Code Online (Sandbox Code Playgroud)

当我使用 cert-manager 创建证书时,证书状态显示“Kubernetes Ingress Controller Fake Certificate”

Bry*_*sen 6

使用 cert-manager 更容易,但如果由于某种原因无法使用 cert-manager,您可以尝试此解决方案。它设置了 GCE 入口和 nginx 入口。GCE 入口是公共的,终止 SSL 但转发到私有 nginx 入口进行路由。

helm3 install -f nginx-values.yaml ingress-nginx ingress-nginx/ingress-nginx
Run Code Online (Sandbox Code Playgroud)
#nginx-values.yaml

controller:
  service:
    type: NodePort
    annotations:
      cloud.google.com/backend-config: '{"default": "backendconfig"}'
  admissionWebhooks:
    enabled: false
defaultBackend:
  enabled: true
Run Code Online (Sandbox Code Playgroud)

然后创建一个 BackendConfig 和一个 Ingress 来设置一个与 nginx NodePort 服务通信的 LoadBalancer。

apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: backendconfig
spec:
  timeoutSec: 300
  healthCheck:
    requestPath: /healthz
Run Code Online (Sandbox Code Playgroud)
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    networking.gke.io/managed-certificates: foo,bar
spec:
  backend:
    serviceName: ingress-nginx-controller
    servicePort: 80
Run Code Online (Sandbox Code Playgroud)

然后您可以为 foo 和 bar 创建一个 ManagedCertificate 和一个 Ingress,它们将共享同一个 LoadBalancer。

apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: foo
spec:
  domains:
    - foo.example.com
Run Code Online (Sandbox Code Playgroud)
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: foo
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: foo.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: foo
          servicePort: 5000
Run Code Online (Sandbox Code Playgroud)

请记住,每次创建新的 ManagedCertificate / Ingress 对时,您都必须使用注释中的证书名称修改 gce 入口清单networking.gke.io/managed-certificates