GKE Ingress 健康检查在入口上失败但在 Loadbalncer 上成功
GKE Ingress health check failed on ingress but succeed on Loadbalncer
在 GKE 上,我的部署工作正常,状态 运行 和运行状况检查正常:
这里是:
apiVersion: apps/v1
kind: Deployment
metadata:
name: erp-app
labels:
app: erp-app
switch: app
spec:
replicas: 1
selector:
matchLabels:
app: erp-app
template:
metadata:
labels:
app: erp-app
spec:
containers:
- name: erp-container
# Extract this from Google Container Registry
image: gcr.io/project/project:latest
imagePullPolicy: Always
env:
ports:
- containerPort: 8080
livenessProbe:
failureThreshold: 10
httpGet:
path: /
port: 8080
scheme: HTTP
initialDelaySeconds: 150
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 30
readinessProbe:
failureThreshold: 10
httpGet:
path: /
port: 8080
scheme: HTTP
initialDelaySeconds: 150
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 20
然后,我创建了一个服务,将端口 8080 映射到 80
apiVersion: v1
kind: Service
metadata:
labels:
app: erp-app
name: erp-loadbalancer
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: erp-app
sessionAffinity: None
type: NodePort
然后,GKE Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
networking.gke.io/managed-certificates: managed-cert
kubernetes.io/ingress.class: "gce"
spec:
defaultBackend:
service:
name: erp-loadbalancer
port:
number: 80
事情是,入口不想工作,因为后端健康检查没有通过。如果我在 gcloud (https://console.cloud.google.com/compute/healthChecks) 上检查运行状况检查,我已经在 / 上为 http 端口 80 创建了(在此路径上,应用程序服务于 200)
如果我强制它是 tcp,那么健康检查通过。但是 google 自动将其切换回 http,从而导致 404。
我的问题是:我的服务器在使用外部负载均衡器时可用而在使用入口时不可用时配置有什么问题? (后端不健康状态)
答案:
我的页面 / 正在向 /login.jsp
发送 301 redirect
301 不是 GCP 健康检查的有效状态代码
所以我将它和我的 readinessProb 更改为 /login.jsp,这使得整个入口工作正常
在 GKE 上,我的部署工作正常,状态 运行 和运行状况检查正常: 这里是:
apiVersion: apps/v1
kind: Deployment
metadata:
name: erp-app
labels:
app: erp-app
switch: app
spec:
replicas: 1
selector:
matchLabels:
app: erp-app
template:
metadata:
labels:
app: erp-app
spec:
containers:
- name: erp-container
# Extract this from Google Container Registry
image: gcr.io/project/project:latest
imagePullPolicy: Always
env:
ports:
- containerPort: 8080
livenessProbe:
failureThreshold: 10
httpGet:
path: /
port: 8080
scheme: HTTP
initialDelaySeconds: 150
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 30
readinessProbe:
failureThreshold: 10
httpGet:
path: /
port: 8080
scheme: HTTP
initialDelaySeconds: 150
periodSeconds: 30
successThreshold: 1
timeoutSeconds: 20
然后,我创建了一个服务,将端口 8080 映射到 80
apiVersion: v1
kind: Service
metadata:
labels:
app: erp-app
name: erp-loadbalancer
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: erp-app
sessionAffinity: None
type: NodePort
然后,GKE Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
networking.gke.io/managed-certificates: managed-cert
kubernetes.io/ingress.class: "gce"
spec:
defaultBackend:
service:
name: erp-loadbalancer
port:
number: 80
事情是,入口不想工作,因为后端健康检查没有通过。如果我在 gcloud (https://console.cloud.google.com/compute/healthChecks) 上检查运行状况检查,我已经在 / 上为 http 端口 80 创建了(在此路径上,应用程序服务于 200) 如果我强制它是 tcp,那么健康检查通过。但是 google 自动将其切换回 http,从而导致 404。
我的问题是:我的服务器在使用外部负载均衡器时可用而在使用入口时不可用时配置有什么问题? (后端不健康状态)
答案:
我的页面 / 正在向 /login.jsp
发送301 redirect
301 不是 GCP 健康检查的有效状态代码
所以我将它和我的 readinessProb 更改为 /login.jsp,这使得整个入口工作正常