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

标签 spring-boot google-kubernetes-engine kubernetes-ingress

我正在尝试部署在 8080 端口上运行的 springboot 应用程序。我的目标是使用 google 托管证书为自定义子域提供 https 协议(protocol)。 这是我的 yaml。

  1. 部署.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
  • 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 管理的证书最多可能需要 60 分钟;您可以使用以下命令检查证书的状态:kubectl describe Managedcertificate my-cert,等待状态变为“Active”。

    不过,您需要注意一些先决条件:

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

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

    关于spring-boot - 尝试访问作为 HTTPS Ingress 部署在 GKE 中的应用程序时出现密码不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71055858/

    相关文章:

    java - 如何用 Spring Boot 安全功能替换 Basic auth?

    java - Spring Boot @Value 没有被填充..为什么?

    java - 存储库相关方法仅返回空值

    docker - 如何启动一个简单的容器?

    google-compute-engine - Google 计算机引擎中/home/gke 中的未知用户

    nginx - 如何在裸机上使用 hostNetwork 安装 nginx-ingress?

    spring-boot - 使用 Mockito 模拟带有 @Transactional 方法的类

    kubernetes - k8s gce1.8.7 - 禁止使用 pod - 未知用户系统 :serviceaccount:default:default

    Jenkins:外部节点无法在 Kubernetes 上注册到 master

    kubernetes - nginx 入口重写目标重定向问题