【问题标题】:GKE BackendConfig not working with customRequestHeadersGKE BackendConfig 不适用于 customRequestHeaders
【发布时间】:2022-04-27 20:43:05
【问题描述】:

我有一个在 Google Kubernetes Engine (v1.20.8-gke.900) 上运行的 nodejs 应用程序

我想添加自定义标头以获取客户端的区域和纬度,因此我还参考了 this article 和 this one 并在 kubernetes 配置文件下创建,但是当我打印标头时,我没有得到任何自定义标头。

#k8s.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: my-app-ns-prod
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: npm-app-deployment
  namespace: my-app-ns-prod
  labels:
    app: npm-app-deployment
    tier: backend

spec:
  template:
    metadata:
      name: npm-app-pod
      namespace: my-app-ns-prod
      labels:
        app: npm-app-pod
        tier: backend

    spec:
      containers:
      - name: my-app-container
        image: us.gcr.io/img/my-app:latest
        ports:
        - containerPort: 3000
          protocol: TCP
        envFrom:
          - secretRef:
              name: npm-app-secret
          - configMapRef:
              name: npm-app-configmap
        imagePullPolicy: Always
      imagePullSecrets:
        - name: gcr-regcred

  replicas: 3
  minReadySeconds: 30

  selector:
    matchLabels:
      app: npm-app-pod
      tier: backend
---
apiVersion: v1
kind: Service
metadata:
  name: npm-app-service
  namespace: my-app-ns-prod
  annotations:
    cloud.google.com/backend-config: '{"ports": {"80":"npm-app-backendconfig"}}'
    cloud.google.com/neg: '{"ingress": true}'
spec:
  selector:
    app: npm-app-pod
    tier: backend
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 3000
    - name: https
      protocol: TCP
      port: 443
      targetPort: 3000
  type: LoadBalancer
---
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: npm-app-backendconfig
  namespace: my-app-ns-prod
spec:
  customRequestHeaders:
    headers:
    - "HTTP-X-Client-CityLatLong:{client_city_lat_long}"
    - "HTTP-X-Client-Region:{client_region}"
    - "HTTP-X-Client-Region-SubDivision:{client_region_subdivision}"
    - "HTTP-X-Client-City:{client_city}"
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /api/v1
            pathType: Prefix
            backend:
              service:
                name: npm-app-service
                port:
                  number: 80
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: npm-app-configmap
  namespace: my-app-ns-prod
data:
  APP_ID: "My App"
  PORT: "3000"
---
apiVersion: v1
kind: Secret
metadata:
  name: npm-app-secret
  namespace: my-app-ns-prod
type: Opaque
data:
  MONGO_CONNECTION_URI: ""
  SESSION_SECRET: ""

【问题讨论】:

  • 你在使用 Nginx 入口控制器吗? BackendConfig 仅适用于 GKE Ingress。
  • 嗨@GariSingh:我正在使用GKE Ingress,我已经关注了google doc
  • 嗯 ...您的 Ingress 资源定义中有 kubernetes.io/ingress.class: nginx 注释
  • 是的,因为它在文档中写的相同,你能指导我在我的 k8s 配置文件中写什么,以便我可以获得自定义标题吗?或者,如果您有任何资源链接可以引导我找到正确的方法。我对 k8s 还很陌生。
  • @ingernet:我是从他们的文档中得到的。我已将其发布在我的below answer。

标签: kubernetes google-kubernetes-engine kubernetes-ingress kubernetes-networking


【解决方案1】:

实际上问题出在入口控制器上,我错过了定义“cloud.google.com/backend-config”。一旦我定义了我能够获得自定义标题。我也从 nginx 切换到 GKE Ingress 控制器 (gce)。但同样的事情也适用于nginx

这是我最终入口的样子。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    cloud.google.com/backend-config: '{"default": "npm-app-backendconfig"}'
    kubernetes.io/ingress.class: "gce"
spec:
  ...
  ...

参考:User-defined request headers:

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 2021-01-22
    • 1970-01-01
    • 2018-05-25
    • 2020-08-28
    • 1970-01-01
    • 2019-12-01
    • 2023-01-07
    • 2019-11-22
    相关资源
    最近更新 更多