将健康检查主机 header 添加到 Ingress
Adding healthcheck host header to Ingress
我是 GKE 中的 运行 Kubernetes,我为我的一项服务创建了一个默认入口,但是我无法访问我的服务,因为入口默认健康检查(期望收到 200 return 查询根路径时的代码:/
) 不工作。
原因是我的服务在根路径 (/
) 上 returning 400,因为它希望收到具有特定 Host
header,如:Host: my-api.com
。如何配置我的入口以将此 header 添加到根健康检查?
注意:我设法在 GCP 控制台中配置了它,但我想知道如何在我的 yaml 上配置它,这样如果我必须重新创建我的文件,我就不必记住这样做入口。
入口:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: backend
annotations:
kubernetes.io/ingress.global-static-ip-name: "backend"
networking.gke.io/managed-certificates: "api-certificate"
spec:
rules:
- host: my-api.com
http:
paths:
- path: /*
backend:
serviceName: backend-service
servicePort: http
服务:
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
namespace: backend
annotations:
beta.cloud.google.com/backend-config: '{"ports": {"80":"backend-web-backend-config"}}'
spec:
selector:
app: backend-web
ports:
- name: http
targetPort: 8000
port: 80
type: NodePort
后端配置:
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
name: backend-web-backend-config
namespace: backend
spec:
timeoutSec: 120
部署:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: backend-web
namespace: backend
labels:
app: backend-web
spec:
selector:
matchLabels:
app: backend-web
template:
metadata:
labels:
app: backend-web
spec:
containers:
- name: web
image: backend:{{VERSION}}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
protocol: TCP
command: ["run"]
resources:
requests:
memory: "800Mi"
cpu: 150m
limits:
memory: "2Gi"
cpu: 1
livenessProbe:
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: "/healthcheck"
port: 8000
initialDelaySeconds: 15
timeoutSeconds: 5
periodSeconds: 30
readinessProbe:
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: "/healthcheck"
port: 8000
initialDelaySeconds: 15
timeoutSeconds: 5
periodSeconds: 30
您正在使用 GCE Ingress,目前还没有办法使用 GCE Ingress 进行此类配置。
我看到 Google 将为 GKE 发布一项新功能 "user defined request headers",这将允许您指定负载均衡器添加到请求的额外 headers。这个新功能将解决您的问题,但我们必须等到 Google 发布它,据我所知它将在 1.7 版本 [1].
上发布
话虽如此,还有一个选择,使用 NGINX Ingress Controller 而不是 GCE Ingress。 NGINX 支持 headers 更改[2],但这意味着您将必须 re-deploy 您的 Ingress。
[1] https://github.com/kubernetes/ingress-gce/issues/566#issuecomment-524312141
[2] https://kubernetes.github.io/ingress-nginx/examples/customization/custom-headers/
我是 GKE 中的 运行 Kubernetes,我为我的一项服务创建了一个默认入口,但是我无法访问我的服务,因为入口默认健康检查(期望收到 200 return 查询根路径时的代码:/
) 不工作。
原因是我的服务在根路径 (/
) 上 returning 400,因为它希望收到具有特定 Host
header,如:Host: my-api.com
。如何配置我的入口以将此 header 添加到根健康检查?
注意:我设法在 GCP 控制台中配置了它,但我想知道如何在我的 yaml 上配置它,这样如果我必须重新创建我的文件,我就不必记住这样做入口。
入口:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: backend
annotations:
kubernetes.io/ingress.global-static-ip-name: "backend"
networking.gke.io/managed-certificates: "api-certificate"
spec:
rules:
- host: my-api.com
http:
paths:
- path: /*
backend:
serviceName: backend-service
servicePort: http
服务:
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
namespace: backend
annotations:
beta.cloud.google.com/backend-config: '{"ports": {"80":"backend-web-backend-config"}}'
spec:
selector:
app: backend-web
ports:
- name: http
targetPort: 8000
port: 80
type: NodePort
后端配置:
apiVersion: cloud.google.com/v1beta1
kind: BackendConfig
metadata:
name: backend-web-backend-config
namespace: backend
spec:
timeoutSec: 120
部署:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: backend-web
namespace: backend
labels:
app: backend-web
spec:
selector:
matchLabels:
app: backend-web
template:
metadata:
labels:
app: backend-web
spec:
containers:
- name: web
image: backend:{{VERSION}}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8000
protocol: TCP
command: ["run"]
resources:
requests:
memory: "800Mi"
cpu: 150m
limits:
memory: "2Gi"
cpu: 1
livenessProbe:
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: "/healthcheck"
port: 8000
initialDelaySeconds: 15
timeoutSeconds: 5
periodSeconds: 30
readinessProbe:
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: "/healthcheck"
port: 8000
initialDelaySeconds: 15
timeoutSeconds: 5
periodSeconds: 30
您正在使用 GCE Ingress,目前还没有办法使用 GCE Ingress 进行此类配置。 我看到 Google 将为 GKE 发布一项新功能 "user defined request headers",这将允许您指定负载均衡器添加到请求的额外 headers。这个新功能将解决您的问题,但我们必须等到 Google 发布它,据我所知它将在 1.7 版本 [1].
上发布话虽如此,还有一个选择,使用 NGINX Ingress Controller 而不是 GCE Ingress。 NGINX 支持 headers 更改[2],但这意味着您将必须 re-deploy 您的 Ingress。
[1] https://github.com/kubernetes/ingress-gce/issues/566#issuecomment-524312141
[2] https://kubernetes.github.io/ingress-nginx/examples/customization/custom-headers/