Varnish - cache serwer w k8s

Varnish, świetny serwer cache'u umożliwiający bardzo zaawansowaną konfigurację. Większość serwerów cdn dostępnych w internecie wykorzystuje właśnie varnisha na backendzie do serwowania statycznych danych. Osobiście użyłem go jako front przed ghostem, o którego de facto oparty jest ten blog.

Pliki konfiguracyjne

Konfiguracja samego varnisha default.vcl:

vcl 4.0;

backend default {
  .host = "blog-mk:2368";
}

sub vcl_recv {
  if (req.url ~ "/(admin|p|ghost)/") {
           return (pass);
  }
  unset req.http.cookie;
}

sub vcl_backend_response {
    if (beresp.http.content-type ~ "text/plain|text/css|application/json|application/x-javascript|text/xml|application/xml|application/xml+rss|text/javascript") {
        set beresp.do_gzip = true;
        set beresp.http.cache-control = "public, max-age=1209600";
    }
    set beresp.ttl = 1w;
}

Deployment varnish-dep.yaml:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: blog-varnish-dep
  labels:
    app: blog-varnish
spec:
  replicas: 1
  selector:
    matchLabels:
      app: blog-varnish
  template:
    metadata:
      labels:
        app: blog-varnish
    spec:
      containers:
      - name: varnish
        image: varnish:6.4
        imagePullPolicy: Always
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/varnish/default.vcl
          name: varnish-config
          subPath: default.vcl
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
      volumes:
      - name: varnish-config
        configMap:
          name: varnish-config
          items:
            - key: default.vcl
              path: default.vcl

Service varnish-svc.yaml:

---
kind: Service
apiVersion: v1
metadata:
  name: varnish-svc
spec:
  selector:
    app: blog-varnish
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Ingress varnish-ing.yaml:

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: public
  name: blog-stage
spec:
  rules:
  - host: michal.kuzdzal.pl
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: varnish-svc
            port:
              number: 80

Deploy

kubectl create configmap varnish-config --from-file=default.vcl -n blog-stage
kubectl apply -f varnish-ing.yaml -f varnish-svc.yaml -f varnish-dep.yaml

Podsumowanie

W moim przypadku zastosowanie varnisha zwiększyło możliwości przetwarzania req/s mojego clustra prawie dziesięciokrotnie. Wszystko oparte jest tutaj o dosyć słabe wydajnościowo free-tier z oracle-cloud'a. Natomiast jeżeli połączymy całość z cloudflarem, to można uzyskać więcej niż zadawalające rezultaty.

Linki

Varnish,
Oracle free-tier.

michal

Read more posts by this author.

/dev/null