Ошибка получения Varni sh, возвращающая HTTP / 1.1 503 Не удалось получить внутреннюю выборку / X-Cache: не кэшируется при выполнении curl -IL (внешний Ip) - PullRequest
0 голосов
/ 17 марта 2020

Я создал таблицу управления для кеш-сервера varni sh, который работает в кластере kubernetes, в то время как тестирование с «внешним IP-адресом» сгенерировало ошибку метания, делясь ниже

HTTP/1.1 503 Backend fetch failed
Date: Tue, 17 Mar 2020 08:20:52 GMT
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
X-Varnish: 570521
Age: 0
Via: 1.1 varnish (Varnish/6.3)
X-Cache: uncached
Content-Length: 283
Connection: keep-alive

Sharing varni sh .vcl, values.yaml и deploy.yaml ниже. Любые предложения, как решить, поскольку я жестко закодировал внутренний сервер как .host = "www.varnish-cache.org" с портом: "80". Мое требование на выполнение curl -IL Я должен получить ответ с кэшированными значениями не так, как описано выше (непосредственно с внутреннего сервера) ..

varni sh .vcl:

# VCL version 5.0 is not supported so it should be 4.0 or 4.1 even though actually used Varnish version is 6
vcl 4.1;

import std;
# The minimal Varnish version is 5.0
# For SSL offloading, pass the following header in your proxy server or load balancer: 'X-Forwarded-Proto: https'



{{  .Values.varnishconfigData | indent 2 }}







sub vcl_recv {
  if(req.url == "/healthcheck") {
    return(synth(200,"OK"));
  }
}


sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "cached";
    } else {
        set resp.http.X-Cache = "uncached";
    }
}

values.yaml:

# Default values for tt.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1



#varnishBackendService: "www.varnish-cache.org"
#varnishBackendServicePort: "80"

image:
  repository: varnish
  tag: 6.3
  pullPolicy: IfNotPresent

nameOverride: ""
fullnameOverride: ""

service:
#  type: ClusterIP
  type: LoadBalancer
  port: 80
#  externalIPs: 192.168.0.10




varnishconfigData: |- 
      backend default {
         .host = "www.varnish-cache.org";
         .host = "100.68.38.132"
         .port = "80";
         .first_byte_timeout = 60s;
         .connect_timeout = 300s ;
         .probe = {
                .url = "/";
                .timeout = 1s;
                .interval = 5s;
                .window = 5;
                .threshold = 3;
           }
          }
         sub vcl_backend_response {
          set beresp.ttl = 5m;
         }




ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - chart-example.local
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources:
  limits:
    memory: 128Mi
  requests:
    memory: 64Mi

#resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #  cpu: 100m
  #  memory: 128Mi
  # requests:
  #  cpu: 100m
  #  memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

Deployment.yaml:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ include "varnish.fullname" . }}
  labels:
    app: {{ include "varnish.name" . }}
    chart: {{ include "varnish.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ include "varnish.name" . }}
      release: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ include "varnish.name" . }}
        release: {{ .Release.Name }}
    spec:
      volumes: 
        - name: varnish-config
          configMap:
             name: {{ include "varnish.fullname" . }}-varnish-config
             items:
               - key: default.vcl
                 path: default.vcl
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }} 
         # command: ["/bin/sh"]
         # args: ["-c", "while true; do service varnishd status, varnishlog;  sleep 10;done"]   
          env:
          - name: VARNISH_VCL
            value: /etc/varnish/default.vcl
          volumeMounts: 
            - name: varnish-config
              mountPath : /etc/varnish/
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
              targetPort: 80
          livenessProbe: 
            httpGet:
              path: /healthcheck
              port: http
              port: 80
            failureThreshold: 3
            initialDelaySeconds: 45
            timeoutSeconds: 10
            periodSeconds: 20
          readinessProbe:
            httpGet:
              path: /healthcheck
              port: http
              port: 80
            initialDelaySeconds: 10
            timeoutSeconds: 15
            periodSeconds: 5
          restartPolicy: "Always"
          resources:
{{ toYaml .Values.resources | indent 12 }}
    {{- with .Values.nodeSelector }}
      nodeSelector:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.affinity }}
      affinity:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
{{ toYaml . | indent 8 }}
    {{- end }}

1 Ответ

0 голосов
/ 17 марта 2020

Ошибка HTTP/1.1 503 Backend fetch failed указывает на то, что Varni sh не может подключиться к бэкэнд-хосту и порту.

Советую попробовать какую-нибудь старую добрую ручную отладку:

  • Получите доступ к оболочке bash одного из контейнеров
  • Откройте /etc/varnish/default.vcl и проверьте точное имя хоста и порт, которые были проанализированы в backend определении
  • Убедитесь, что curl установить и попытаться свернуть имя хоста на этом указанном c порту
  • Может быть, даже установить telnet и попытаться выяснить, принимает ли порт имени хоста соединения

По сути, вы попытаетесь выяснить, есть ли сетевая конфигурация, которая запрещает вам устанавливать исходящее соединение, или есть что-то еще, мешающее Varni sh совершать выборку.

...