Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kubernetes 如何为执行http到https重定向的容器正确配置readinessProbe?_Kubernetes_Google Kubernetes Engine_Kubernetes Ingress_Kubernetes Health Check - Fatal编程技术网

Kubernetes 如何为执行http到https重定向的容器正确配置readinessProbe?

Kubernetes 如何为执行http到https重定向的容器正确配置readinessProbe?,kubernetes,google-kubernetes-engine,kubernetes-ingress,kubernetes-health-check,Kubernetes,Google Kubernetes Engine,Kubernetes Ingress,Kubernetes Health Check,我们有一个使用以下前端服务的GKE入口。入口也会终止tls。我们希望对http上的任何流量进行http到https的永久重定向 通过下面的配置,我们可以在http和https(无重定向)上工作和服务流量 用于部署的容器可以配置为使用--https重定向标志将http重写为https。它还尊重和信任 X-PROTED-PROTO 标头,如果头值设置为 HTTPS>/P>,它将是安全的。 因此,我能看到的readinessProbe最合理的配置是下面的配置,但注释行未注释。然而,一旦我们应用这个版本

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

通过下面的配置,我们可以在http和https(无重定向)上工作和服务流量

用于部署的容器可以配置为使用--https重定向标志将http重写为https。它还尊重和信任<强> X-PROTED-PROTO <强>标头,如果头值设置为<强> HTTPS>/P>,它将是安全的。 因此,我能看到的readinessProbe最合理的配置是下面的配置,但注释行未注释。然而,一旦我们应用这个版本,我们就永远不会进入健康状态,相反,配置了入口的终止域返回502,并且永远不会恢复

那么,下面的方法有什么错呢? 我已经使用端口转发对pod和服务进行了测试,如果我不提供X-Forwarded-Proto标头,它们都返回301,如果我提供了带有https值的X-Forwarded-Proto标头,它们都返回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响应。如果健康检查发送的HTTP没有X-Forwarded-Proto头,则很可能是这样

您可以通过检查部署吊舱的kubectl日志来检查这一点

如果您尝试使用HTTPS健康检查来解决这一问题,我前面的回答可能会很有用


发件人: 您需要在服务定义上添加注释,告知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's Encrypt它可能值得探索。

请注意,我们知道可以通过使用kubernetes.io/ingres.allow-http禁用http流量:“false”,但这并没有帮助,因为客户端可能在一开始进入域时没有https。