Błąd 503 UH na Kubernetes z Istio, ale usługa działa

Nov 21 2020

Mam problem z poprawną konfiguracją komunikacji pomiędzy moimi usługami na Kubernetes (minikube) z zainstalowanym Istio.

Próbuję wysłać POSTżądanie z mojej usługi do elastycznego wyszukiwania, ale cały czas otrzymuję:

POST /_bulk?timeout=1m HTTP/1.1" 503 UH "-" "-" 0 19 0 - "-" "Apache-HttpAsyncClient/4.1.4 (Java/11.0.9.1)" "1a290357-7b18-9692-9392-d0298ed3276c" "elasticsearch:9200" "-" - - 10.102.10.19:9200 172.18.0.12:39194 - default

Istioctl analyzenie wykazuje żadnych problemów. Wyłączyłem również mtls.

Czy masz pojęcie, co może być nie tak? Nie rozumiem, dlaczego jest UH (niezdrowy), ponieważ Elasticsearch działa, a pulpit nawigacyjny Kiali również wyświetla go jako zdrowy.

Moje wdrożenia + usługi:

Elasticsearch

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
    tier: database
spec:
  selector:
    app: elasticsearch
  ports:
  - name: "http-9200"
    port: 9200
    targetPort: 9200
  - name: "tcp-9300"
    port: 9300
    targetPort: 9300
  selector:
    app: elasticsearch
    tier: database

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  labels:
    service: elasticsearch
spec:
  serviceName: elasticsearch
  replicas: 1
  selector:
    matchLabels:
      service: elasticsearch
  template:
    metadata:
      labels:
        service: elasticsearch
    spec:
      terminationGracePeriodSeconds: 300
      initContainers:
      - name: fix-the-volume-permission
        image: busybox
        command:
        - sh
        - -c
        - chown -R 1000:1000 /usr/share/elasticsearch/data
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      - name: increase-the-vm-max-map-count
        image: busybox
        command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        securityContext:
          privileged: true
      - name: increase-the-ulimit
        image: busybox
        command:
        - sh
        - -c
        - ulimit -n 65536
        securityContext:
          privileged: true
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4
        ports:
        - containerPort: 9200
          name: "http-9200"
        - containerPort: 9300
          name: "tcp-9300"
        env:
          - name: cluster.name
            value: elasticsearch-cluster
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: ES_JAVA_OPTS
            value: -Xms4g -Xmx4g
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
      annotations:
        volume.beta.kubernetes.io/storage-class: "standard"
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi



My-Service

apiVersion: v1
kind: Service
metadata:
  name: scrappers-service
  labels:
    name: scrappers-service
spec:
  ports:
  - nodePort: 30164
    name: "http-8080"
    port: 8080
    targetPort: 8080
  selector:
    app: scrappers-service
  type: NodePort
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: scrappers-service
  labels:
    name: scrappers-service
spec:
  selector:
    matchLabels:
      app: scrappers-service
  replicas: 1
  template:
    metadata:
      labels:
        app: scrappers-service
    spec:
      containers:
      - image: example/scrappers:master
        imagePullPolicy: Never
        name: scrappers-service
        ports: 
        - containerPort: 8080

Odpowiedzi

1 Jakub Nov 24 2020 at 15:01

Jak wspomniano tutaj

Postanowiłem skorzystać z rozwiązania opisanego przez elastyczne wyszukiwanie. Mam na myśli operatora elastycznego. Zastosowałem wszystkie kroki i po prostu działa bez większych problemów.

Tak więc rozwiązaniem byłoby postępowanie zgodnie z dokumentacją Flexiblesearch , która używa poniższych adnotacji, aby to działało.

annotations:
  traffic.sidecar.istio.io/excludeOutboundPorts: "" 
  traffic.sidecar.istio.io/excludeInboundPorts: ""

Aby walidacja elementu webhook działała w Istio, musisz wykluczyć port przychodzący 9443 z serwera proxy. Można to zrobić, edytując definicję szablonu operatora elastycznego StatefulSet, aby dodać następujące adnotacje do operatora Pod:

[...]
spec:
  template:
    metadata:
      annotations:
        traffic.sidecar.istio.io/excludeInboundPorts: "9443"
        traffic.sidecar.istio.io/includeInboundPorts: '*'
[...]

Jeśli skonfigurowałeś Istio w trybie zezwalającym , przykłady zdefiniowane w innym miejscu w dokumentacji ECK będą nadal działać bez konieczności wprowadzania jakichkolwiek modyfikacji. Jeśli jednak włączono ścisłe wzajemne uwierzytelnianie TLS między usługami za pośrednictwem konfiguracji globalnej (MeshPolicy) lub na poziomie przestrzeni nazw (zasady), do poprawnego działania konieczne są następujące modyfikacje manifestów zasobów.

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: elastic-istio
spec:
  version: 7.10.0
  http:
    tls: 
      selfSignedCertificate:
        disabled: true
  nodeSets:
  - name: default
    count: 3
    podTemplate:
      metadata:
        annotations:
          traffic.sidecar.istio.io/includeInboundPorts: "*"
          traffic.sidecar.istio.io/excludeOutboundPorts: "9300" 
          traffic.sidecar.istio.io/excludeInboundPorts: "9300"
      spec:
        automountServiceAccountToken: true 

Jeśli nie masz włączonego automatycznego wzajemnego TLS , może być konieczne utworzenie reguły docelowej, aby umożliwić operatorowi komunikację z klastrem Elasticsearch. Problem z komunikacją między operatorem a zarządzanym klastrem Elasticsearch można wykryć, przeglądając dzienniki operatorów, aby sprawdzić, czy są zgłoszone błędy z tekstem 503 Usługa niedostępna.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: elastic-istio
spec:
  host: "elastic-istio-es-http.default.svc.cluster.local"
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL

Istnieją powiązane problemy z githubem:

  • https://github.com/istio/istio/issues/14662
  • https://github.com/elastic/cloud-on-k8s/issues/2770