[BAN请求上的使节的Http 400

问题描述 投票:0回答:1

这里是Istio Newbie,

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

作为临时解决方法,我将端口名从http更改为varnish,然后一切又重新开始工作了

我使用1.3.0的头盔图表安装了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版

kubernetes google-kubernetes-engine varnish istio envoyproxy
1个回答
0
投票

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

ConfigMap

仅允许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 -v -X BAN http://varnish-service

从这里,您将得到200 purged405 Not allowed。无论哪种方式,您都可以在网格上打上光油盒。

您的问题可能与群集中的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安装(在许可模式下)。

© www.soinside.com 2019 - 2024. All rights reserved.