kubernetes - 要求BAN要求的Http 400

标签 kubernetes google-kubernetes-engine varnish istio envoyproxy

Istio Newbie在这里,

我正在使用Istio(版本1.3.0)进行首次测试。大多数事情运行起来都很轻松。
我遇到的问题是与 Varnish 进行对话以清理缓存的服务。此服务向 headless 服务后面的每个pod发出HTTP请求,并且失败,并显示HTTP 400(错误请求)错误。该请求使用HTTP方法“BAN”,我相信这是问题的根源,因为其他请求方法可以达到 Varnish 而没有问题。

作为一个临时的解决方法,我将端口名称从http更改为varnish,然后一切又开始正常工作

我使用1.3.0的 Helm chart 安装了istio:

helm install istio install/kubernetes/helm/istio --set kiali.enabled=true --set global.proxy.accessLogFile="/dev/stdout" --namespace istio-system --version 1.3.0

在GKE 1.13.9-gke.3上运行,并且Varnish是6.2版

最佳答案

我能够使用以下定义在没有 mTLS 的情况下使用 Istio 使其工作:

配置映射

只允许 pod 和服务 CIDR 用于 BAN 请求,并期望它们来自 Varnish 服务 FQDN。

apiVersion: v1
kind: ConfigMap
metadata:
  name: varnish-configuration
data:
  default.vcl: |
    vcl 4.0;

    import std;

    backend default {
      .host = "varnish-service";
      .port = "80";      
    }

    acl purge {
        "localhost";
        "10.x.0.0"/14; #Pod CIDR
        "10.x.0.0"/16; #Service CIDR
    }

    sub vcl_recv {
            # this code below allows PURGE from localhost and x.x.x.x

            if (req.method == "BAN") {
                    if (!client.ip ~ purge) {
                            return(synth(405,"Not allowed."));
                    }
                    return (purge);
            }
    }

部署
apiVersion: apps/v1
kind: Deployment
metadata:
  name: varnish
spec:
  replicas: 1
  selector:
    matchLabels:
      app: varnish
  template:
    metadata:
      labels:
        app: varnish
    spec:
      containers:
      - name: varnish
        image: varnish:6.3
        ports:        
        - containerPort: 80
          name: varnish-port
        imagePullPolicy: IfNotPresent        
        volumeMounts:
        - name: varnish-conf
          mountPath: /etc/varnish
      volumes:
      - name: varnish-conf
        configMap:
          name: varnish-configuration

服务
apiVersion: v1
kind: Service
metadata:
  name: varnish-service
  labels:
    workload: varnish
spec:
  selector:
    app: varnish
  ports:    
    - name: varnish-port
      protocol: TCP
      port: 80
      targetPort: 80

部署这些后,您可以运行启用 cURL 的 pod:
kubectl run bb-$RANDOM --rm -i --image=yauritux/busybox-curl --restart=Never --tty -- /bin/sh

然后,从 tty 尝试 curl 它:
curl -v -X BAN http://varnish-service

从这里,您将获得 200 purged405 Not allowed 。无论哪种方式,您都已经穿过网格击中了 Varnish pod。

您的问题可能与集群中的 mTLS 相关。您可以通过发出以下命令来检查它是否已启用*:
istioctl authn tls-check $(k get pod -l app=varnish -o jsonpath={.items..metadata.name}) varnish-service.default.svc.cluster.local

*该命令假定您正在使用本文中共享的定义。如果没有,您可以相应地进行调整。

我测试了两次运行 GKE:一个通过 Helm 安装使用开源 Istio,另一个使用 Google 管理的 Istio 安装(在许可模式下)。

关于kubernetes - 要求BAN要求的Http 400,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58080408/

相关文章:

c++ - 将 C++ 应用程序部署到 Google Cloud Platform Kubernetes 引擎

kubernetes - pods 挂起待处理状态

缓存 WebSocket

symfony1 - 在Symfony应用程序中使用Varnish?

kubernetes - 以其他用户身份在 Kubernetes pod 中执行命令

docker-compose - docker varnish cmd 错误 - 没有这样的文件或目录

ssl - 如何正确提交用于登录 Kubernetes 的证书?

amazon-web-services - 更改终止GracePeriodSeconds 值在新版本期间不会生效

kubernetes - Kubebuilder 谓词跳过某些命名空间

maven - 如何使用 Kubernetes runner 在 Gitlab 中为 Maven 添加持久卷