Istio를 사용하는 Kubernetes에서 503 UH 오류이지만 서비스가 작동 중입니다.

Nov 21 2020

Istio가 설치된 Kubernetes (minikube)에서 내 서비스 간의 적절한 통신 구성에 문제가 있습니다.

POST내 서비스에서 elasticsearch 로 요청 을 보내려고하는데 항상 수신됩니다.

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어떤 문제도 보여주지 않습니다. 나는 또한 mtls를 비활성화했습니다.

무엇이 잘못 될 수 있는지 아십니까? elasticsearch가 작동하고 Kiali 대시 보드도 정상으로 표시되기 때문에 UH (비정상)가있는 이유를 이해할 수 없습니다.

내 배포 + 서비스 :

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



내 서비스

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

답변

1 Jakub Nov 24 2020 at 15:01

여기에서 언급했듯이

Elasticsearch에서 설명한 솔루션을 사용하기로 결정했습니다. 나는 elasticseach-operator를 의미합니다. 모든 단계를 적용했으며 더 큰 문제없이 작동합니다.

따라서 해결책은 아래 주석을 사용하여 작동하도록하는 elasticsearch 문서 를 따르는 것입니다.

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

Istio에서 유효성 검사 웹 후크가 작동하도록하려면 인바운드 포트 9443을 프록시에서 제외해야합니다. 이는 elastic-operator StatefulSet의 템플릿 정의를 편집하여 연산자 포드에 다음 주석을 추가하여 수행 할 수 있습니다.

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

허용 모드 에서 Istio를 구성한 경우 ECK 설명서에 정의 된 예제는 수정없이 계속 작동합니다. 그러나 전역 (MeshPolicy) 또는 네임 스페이스 수준 (정책) 구성을 통해 서비스간에 엄격한 상호 TLS 인증 을 사용하도록 설정 한 경우 올바른 작업을 위해 리소스 매니페스트를 다음과 같이 수정해야합니다.

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 

자동 상호 TLS를 활성화 하지 않은 경우 운영자가 Elasticsearch 클러스터와 통신 할 수 있도록 대상 규칙을 생성해야 할 수 있습니다. 운영자와 관리 형 Elasticsearch 클러스터 간의 통신 문제는 운영자 로그에서 503 Service Unavailable 텍스트로보고 된 오류가 있는지 확인하여 감지 할 수 있습니다.

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

관련된 github 문제가 있습니다.

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