启用了SSL的GCP健康检查

问题描述

我在Kubernetes上有了新的东西,并且我正在尝试改进我们在这里拥有的当前系统。 该应用程序是使用Spring Boot开发的,到目前为止,它一直使用HTTP(端口8080)进行加密。系统要求是为所有传输中的数据启用e2e加密。这就是问题所在。

当前,我们使用“让我们加密”在集群入口提供证书来启用TLS的GCE入口。一切正常。我们的Ingress具有一些路径规则,可将流量重定向到正确的微服务,而这些微服务在通信中未使用TLS。

我设法创建了一个自签名证书,并将其嵌入到WAR中,并且可以在本地计算机上正常工作(禁用证书验证)。当我在GKE上部署它时,GCP运行状况检查和Kubernetes探针根本无法工作(我在应用程序日志中看不到任何通信尝试)。

当我尝试在GCP上同时配置后端和运行状况检查并将它们都更改为HTTPS时,它们没有显示任何错误,但是一段时间后,它们悄悄地切换回了HTTP。

这是我的YAML文件

  1. 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
  1. 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

  1. 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:我已经使用为 live readiness 探针({{1} )。

编辑3:我已经使用服务声明上的注释找到了GCP健康检查的解决方案。我会将所有详细信息放在对自己的问题的回答中。

解决方法

这是我找到的解决问题的方法。

在阅读了很多与Kubernetes和GCP相关的文档之后,我在GCP上找到了一个文档,该文档解释了在Service声明上使用注释。看一下7-8行。

class JsInterface(private val onClose: () -> Unit) {
    @android.webkit.JavascriptInterface    
    fun close() {
        onClose()    
    }
}
...
addJavascriptInterface(JsInterface { [email protected]() },"client")

这将提示GCP使用HTTPS创建 后端服务 运行状况检查 ,所有操作将按预期工作。

参考:https://cloud.google.com/kubernetes-engine/docs/concepts/ingress-xlb#https_tls_between_load_balancer_and_your_application