我在Kubernetes上有了新的东西,并且我正在尝试改善我们在这里拥有的当前系统。
该应用程序是使用Spring Boot开发的,到目前为止,它一直使用HTTP(端口8080)进行加密。系统要求是为所有传输中的数据启用e2e加密。所以这就是问题所在。
当前,我们已使用Let's Encrypt在集群入口提供证书来启用TLS的GCE Ingress。一切正常。我们的Ingress具有一些路径规则,可将流量重定向到正确的微服务,并且那些微服务未在通信中使用TLS。
我设法创建了一个自签名证书,并将其嵌入到WAR中,并且可以在本地计算机上正常工作(禁用证书验证)。当我在GKE上部署它时,GCP运行状况检查和Kubernetes探针根本无法工作(我在应用程序日志中看不到任何通信尝试)。
当我尝试在GCP上配置“后端”和“运行状况检查”都更改为HTTPS时,它们没有显示任何错误,但是一段时间后,它们悄悄地切换回HTTP。
这是我的YAML文件:

  • admin-service.yaml

  • ---
    apiVersion: v1
    kind: Service
    metadata:
      name: admin-service
      namespace: default
    spec:
      type: NodePort
      selector:
        app: admin
      ports:
      - port: 443
        targetPort: 8443
        name: https
        protocol: TCP
    
  • admin-deployment.yaml

  • ---
    apiVersion: "apps/v1"
    kind: "Deployment"
    metadata:
      name: "admin"
      namespace: "default"
      labels:
        app: "admin"
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: "admin"
      template:
        metadata:
          labels:
            app: "admin"
        spec:
          containers:
          - name: "backend-admin"
            image: "gcr.io/my-project/backend-admin:X.Y.Z-SNAPSHOT"
            livenessProbe:
              httpGet:
                path: /actuator/health/liveness
                port: 8443
                scheme: HTTPS
              initialDelaySeconds: 8
              periodSeconds: 30
            readinessProbe:
              httpGet:
                path: /actuator/health/readiness
                port: 8443
                scheme: HTTPS
              initialDelaySeconds: 8
              periodSeconds: 30
            env:
            - name: "FIREBASE_PROJECT_ID"
              valueFrom:
                configMapKeyRef:
                  key: "FIREBASE_PROJECT_ID"
                  name: "service-config"
    ---
    apiVersion: "autoscaling/v2beta1"
    kind: "HorizontalPodAutoscaler"
    metadata:
      name: "admin-etu-vk1a"
      namespace: "default"
      labels:
        app: "admin"
    spec:
      scaleTargetRef:
        kind: "Deployment"
        name: "admin"
        apiVersion: "apps/v1"
      minReplicas: 1
      maxReplicas: 3
      metrics:
      - type: "Resource"
        resource:
          name: "cpu"
          targetAverageUtilization: 80
    
    
  • ingress.yaml

  • ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: my-ingress
      annotations:
        kubernetes.io/ingress.global-static-ip-name: my-ingress-addr
        kubernetes.io/ingress.class: "gce"
        kubernetes.io/tls-acme: "true"
        cert-manager.io/cluster-issuer: "letsencrypt-prod"
        acme.cert-manager.io/http01-edit-in-place: "true"
        kubernetes.io/ingress.allow-http: "false"
    spec:
      tls:
      - hosts:
        - my-domain.com
        secretName: mydomain-com-tls
      rules:
        - host: my-domain.com
          http:
            paths:
            - path: /admin/v1/*
              backend:
                serviceName: admin-service
                servicePort: 443
    status:
      loadBalancer:
        ingress:
        - ip: XXX.YYY.WWW.ZZZ
    
    阅读this document from GCP我知道Loadbalancer与自签名证书兼容。
    谢谢您提供的任何见解或新方向。
    提前致谢。
    编辑1:我在这里添加了入口YAML文件,这可能有助于更好地理解该问题。
    编辑2:我已经使用针对 liveness 和就绪性探针(scheme)找到的解决方案更新了部署YAML。
    编辑3:我使用服务声明上的注释找到了GCP健康检查的解决方案。我将把所有细节放在对自己的问题的回答上。

    最佳答案

    这是我发现的解决问题的方法。
    阅读了大量与Kubernetes和GCP相关的文档后,我在GCP上找到了一个文档,该文档解释了如何在Service声明中使用注释。看一下7-8行。

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: admin-service
      namespace: default
      annotations:
        cloud.google.com/app-protocols: '{"https":"HTTPS"}'
    spec:
      type: NodePort
      selector:
        app: iteam-admin
      ports:
      - port: 443
        targetPort: 8443
        name: https
        protocol: TCP
    
    这将提示GCP使用HTTPS创建后端服务运行状况检查,并且一切都会按预期进行。
    参考:https://cloud.google.com/kubernetes-engine/docs/concepts/ingress-xlb#https_tls_between_load_balancer_and_your_application

    关于ssl - 启用S​​SL的GCP健康检查,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63652017/

    10-15 04:29