尝试访问作为 HTTPS 入口部署在 GKE 中的应用程序时出现密码不匹配错误

Cipher mismatch error while trying to access an app deployed in GKE as HTTPS Ingress

我正在尝试在 8080 端口上部署一个 springboot 应用程序 运行。我的目标是使用 google managed-certificates 为自定义子域设置 https 协议。 这是我的 yaml。

  1. deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  namespace: my-namespace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-deployment
      namespace: my-namespace
  template:
    metadata:
      labels:
        app: my-deployment
        namespace: my-namespace
    spec:
      containers:
        - name: app
          image: gcr.io/PROJECT_ID/IMAGE:TAG
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
          resources:
            requests:
              memory: "256Mi"
              ephemeral-storage: "256Mi"
              cpu: "250m"
            limits:
              memory: "512Mi"
              ephemeral-storage: "512Mi"
              cpu: "250m"

2.service.yaml

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: my-namespace
  annotations:
    cloud.google.com/backend-config: '{"default": "my-http-health-check"}'
spec:
  selector:
    app: my-deployment
    namespace: my-namespace
  type: NodePort
  ports:
    - port: 80
      name: http
      targetPort: http
      protocol: TCP
  1. ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  namespace: my-name-space
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-ip
    networking.gke.io/managed-certificates: my-cert
    kubernetes.io/ingress.class: "gce"
  labels:
    app: my-ingress
spec:
  rules:
    - host: my-domain.com
      http:
        paths:
          - pathType: ImplementationSpecific
            backend:
              service:
                name: my-service
                port:
                  name: http

我遵循了各种文档,其中大部分可以帮助使 http 正常工作,但无法使 https 正常工作并以错误结束 ERR_SSL_VERSION_OR_CIPHER_MISMATCH。看起来“全局转发规则”存在问题。端口显示 443-443。在负载均衡器处终止 HTTPS 流量并使用 http 将其路由到后端应用程序的正确方法是什么?

根据提供的信息,我可以看到缺少“ManagedCertificate”对象,您需要创建一个结构如下的yaml文件:

apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: my-cert
spec:
  domains:
    - <your-domain-name1>
    - <your-domain-name2>

然后用命令应用它:kubectl apply -f file-name.yaml

配置 Google-managed 证书最多可能需要 60 分钟;您可以使用以下命令检查证书的状态:kubectl describe managedcertificate my-cert,等待状态为“Active”。

不过,您需要了解一些先决条件:

  • 您必须拥有该域名。域名不得超过 63 个字符。您可以使用 Google Domains 或其他注册商。
  • 集群必须启用 HttpLoadBalancing add-on。
  • 您的 "kubernetes.io/ingress.class" 必须是 "gce"
  • 您必须在同一应用程序中申请 IngressManagedCertificate 资源 项目和命名空间。
  • 创建 reserved (static) external IP address。保留静态 IP 地址保证它仍然是你的,即使你删除了 入口。如果您不保留 IP 地址,它可能会更改, 要求您重新配置域的 DNS 记录。

最后,您可以在 Creating an Ingress with a Google-managed certificate 上查看完整的 Google 指南。