首页 > 解决方案 > 将运行状况检查主机标头添加到 Ingress

问题描述

我在 GKE 中运行 Kubernetes,并为我的一项服务创建了默认入口,但是我无法访问我的服务,因为入口默认运行状况检查(在查询根路径时期望收到 200 返回码的那个/:)不管用。

原因是我的服务在根路径 ( /) 上返回 400,因为它希望接收具有特定Host标头的请求,例如:Host: my-api.com。如何配置我的入口以将此标头添加到根健康检查?

注意:我设法在 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

标签: kubernetesgoogle-kubernetes-enginekubernetes-ingress

解决方案


您正在使用 GCE Ingress,尚无法使用 GCE Ingress 进行此类配置。我已经看到 Google 将为 GKE 发布一个新功能“用户定义的请求标头”,这将允许您指定负载均衡器添加到请求中的其他标头。这项新功能将解决您的问题,但我们将不得不等到 Google 发布它,据我所知,它将在 1.7 版本 [1] 上发布。

话虽如此,还有一种选择,使用 NGINX Ingress Controller 而不是 GCE Ingress。NGINX 支持标头更改[2],但这意味着您必须重新部署 Ingress。

[1] https://github.com/kubernetes/ingress-gce/issues/566#issuecomment-524312141

[2] https://kubernetes.github.io/ingress-nginx/examples/customization/custom-headers/


推荐阅读