Błąd 503 UH na Kubernetes z Istio, ale usługa działa
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 analyze
nie 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
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