kubernetes - 如何为将HTTP重定向到https的容器正确配置ReadinessProbeProbe?

标签 kubernetes google-kubernetes-engine kubernetes-ingress kubernetes-health-check

我们有一个使用以下前端服务的GKE入口。入口也会终止tls。我们希望http到HTTP上的所有流量都具有http到https的永久重定向。

通过以下配置,我们可以正常工作,并在http和https上提供流量(不带重定向)。

可以将用于Deployment的容器配置为使用--https-redirect标志将http重写为https。它还尊重并信任 X-Forwarded-Proto header ,如果 header 值设置为 https ,它将认为它是安全的。

因此,对于readinessProbe,我可以看到的最合理的配置是以下配置,但是注释行未注释。但是,一旦应用此版本,我们就永远不会进入正常状态,而是使用Ingress配置的终止域将返回502,并且永不恢复。

那么下面的方法有什么问题呢?
我已经测试过使用端口转发Pod和服务,如果我不提供X-Forwarded-Proto header ,它们都返回301,如果我提供https值,则它们都返回200。

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort
  ports:
    - port: 8080
  selector:
    app: frontend
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - image: eu.gcr.io/someproject/frontend:master
        imagePullPolicy: Always
        # args:
        # - '--https-redirect'
        name: frontend
        resources:
          limits:
            memory: 1Gi
            cpu: '0.5'
        ports:
        - containerPort: 8080
          name: frontend
        readinessProbe:
          httpGet:
            path: /_readinessProbe
            port: 8080
            # httpHeaders:
            # - name: X-Forwarded-Proto
            #   value: https

最佳答案

GCP运行状况检查对于返回的HTTP响应代码非常挑剔。它必须是200,而不是重定向。如果在您发布的配置中,则NLB将从您的服务器获得301/302响应。它将标记您的后端不健康,因为这不是200响应。如果运行状况检查正在发送不带X-Forwarded-Proto header 的HTTP,则可能是这种情况。

您可以通过检查部署的Pod的kubectl日志来进行检查。

如果您尝试进行HTTPS健康检查,以解决此问题,我的上一个答案可能会很有用。

GKE documentation:
您将需要在服务定义上添加注释,以告诉GKE使用HTTPS进行运行状况检查。否则,它将尝试发送HTTP并感到困惑。

kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

我没有使用最新的语法,但这曾经为我工作。

但是,使用起来很笨拙,我最终还是转到了Istio,让它完成所有HTTPS终止。但是,这可不是一件容易的事,但是您正在考虑使用cert-manager / Let的Encrypt可能值得探索。

关于kubernetes - 如何为将HTTP重定向到https的容器正确配置ReadinessProbeProbe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54538186/

相关文章:

kubernetes - Kubernetes 和 Kubernetes Engine 有什么区别?

kubernetes - 谷歌云平台的 "Managed Infrastructure Mixer Client"是什么?

kubernetes - 在Kubernetes上使用Nginx Ingress注释进行多次重写?

kubernetes - Kubernetes集群中服务端点的基于延迟的路由

docker - curl 命令参数上的YAML解析错误

amazon-web-services - Kubernetes - 跨 AZ 流量

docker - 具有多个资源单个 YAML 的 Kubernetes 应用程序

kubernetes - k3s - pod 之间的网络无法正常工作

kubernetes - Cloud Composer 无法连接到 Cloud SQL 代理服务

Azure-AKS:使用 Postman 测试启用了 TLS 的 Ingress