我对 Kubernetes 的东西有点陌生,我正在尝试改进我们这里现有的一个系统。该应用程序是使用 Spring Boot 开发的,直到现在它使用 HTTP(端口 8080),没有任何加密。系统要求是为所有传输中的数据启用 e2e 加密。所以这就是问题所在。
目前,我们使用 Let's Encrypt 启用了启用了 TLS 的 GCE Ingress,以在集群入口提供证书。这工作正常。我们的 Ingress 有一些路径规则来将流量重定向到正确的微服务,并且这些微服务在通信中没有使用 TLS。
我设法创建了一个自签名证书并将其嵌入到 WAR 中,这在本地机器上运行良好(使用禁用证书验证)。当我在 GKE 上部署它时,GCP 健康检查和 Kubernetes 探测器根本不起作用(我在应用程序日志上看不到任何通信尝试)。
当我尝试在 GCP 上配置后端和健康检查同时更改为 HTTPS 时,它们没有显示任何错误,但一段时间后它们悄悄地切换回 HTTP。
这是我的 YAML 文件:
- 管理服务.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
- 管理员部署.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
- 入口.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
从 GCP阅读本文档后,我了解到 Loadbalancer 与自签名证书兼容。
我将不胜感激你们可以提供的任何见解或新方向。提前致谢。
编辑 1:我在这里添加了入口 YAML 文件,这可能有助于更好地理解这个问题。
编辑 2:我已经用我找到的活性和就绪探测 ( scheme
) 的解决方案更新了部署 YAML。
编辑 3:我使用服务声明上的注释找到了 GCP 健康检查的解决方案。我将把所有细节放在对我自己的问题的回答中。