source

유레카와 쿠베르네테스

manycodes 2023. 4. 1. 09:39
반응형

유레카와 쿠베르네테스

Spring Boot/Netflix OSS와 Kubernetes를 함께 사용하여 gotcha를 식별하기 위한 개념 증명을 정리하고 있습니다.프로메테우스, 그라파나 등 관련 기술도 검증하기 위해서다.

Kubernetes 클러스터 내에서 문제 없이 시작하는 Eureka 서비스 설정이 있습니다.이것은 디스커버리라고 이름 붙여지고 K8에 추가되었을 때 "discovery-1551420162-iyz2c"라는 이름이 붙여졌습니다.

컨피규레이션서버에서는 논리 URL 에 근거해 Eureka 를 사용하려고 하고 있기 때문에, bootstrap.yml 에는 다음과 같이 설정되어 있습니다.

server:
  port: 8889

eureka:
  instance:
    hostname: configserver
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://discovery:8761/eureka/

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/xyz/microservice-config

그리고 나는 이것을 시작하는데

kubectl run configserver --image=xyz/config-microservice --replicas=1 --port=8889

이 서비스는 configserver-3481062421-tmv4d라는 이름으로 실행됩니다.다음으로 설정 서버 로그에 예외가 표시됩니다.이 로그는 eureka 인스턴스를 검색하려고 하지만 찾을 수 없습니다.

도커 컴포지트를 링크와 함께 로컬로 사용하여 동일한 설정을 하고 있으며, 다양한 컨테이너를 문제없이 기동합니다.

discovery:
  image: xyz/discovery-microservice
  ports:
   - "8761:8761"
configserver:
  image: xyz/config-microservice
  ports:
   - "8888:8888"
  links:
   - discovery

마이크로 서비스가 K8 클러스터 내의 고정 IP 주소를 인식하지 않고 피어를 찾을 수 있도록 eureka.client.serviceUri와 같은 것을 설정하려면 어떻게 해야 합니까?

어떻게 하면 eureka.client.serviceUri 같은 것을 셋업할 수 있을까요?

유레카 팟/전개 위에 Kubernetes 서비스가 있어야 합니다.이 서비스를 통해 참조 가능한 IP 주소와 포트 번호를 얻을 수 있습니다.그런 다음 참조 가능한 주소를 사용하여 "8761" 대신 Eureka 서비스를 검색합니다.

Eureka의 HA 구성에 대한 추가 질문에 대처하기 위해

K8s 서비스당 여러 개의 Eureka 포드/레플리카를 보유할 수 없습니다(포드는 사용 후 삭제되므로 Eureka 서비스 레지스트리에 참조 가능한 IP 주소/도메인 이름이 필요합니다).고가용성(HA)을 달성하려면 각각 하나의 포드로 더 많은 k8s 서비스를 스핀업하십시오.

  • Eureka 서비스 1 --> 단일 포드
  • Eureka Service 2 --> 다른 단일 포드
  • ..
  • ..
  • Eureka Service n --> 다른 단일 포드

이것으로, 각 Eureka 에 대해서 참조 가능한 IP/도메인명(k8s 서비스의 IP)이 취득되었습니다.서로 등록할 수 있게 되었습니다.

과잉 살상이라고 느끼나요?모든 서비스가 동일한 Kubernetes 이름 공간에 있는 경우, eureka가 제공하는 모든 것(클라이언트 측 로드밸런싱을 제외한 거의 모든 것)을 k8s 서비스와 Kube를 통해 달성할 수 있습니다.DNS 애드온Christian Posta의 이 기사를 읽어보세요.

편집

Stefan Ocke가 지적한 바와 같이 각각 1개의 포드가 있는 서비스 대신 StatefulSets를 사용할 수 있습니다.

배포와 마찬가지로 StatefulSet은 동일한 컨테이너 사양을 기반으로 하는 포드를 관리합니다.전개와 달리 StatefulSet은 각 포드의 스틱아이덴티티를 유지합니다.이러한 포드는 동일한 사양으로 생성되지만 서로 호환되지 않습니다. 각 포드는 일정 변경 후에도 유지되는 영구 식별자를 가집니다.

Kubernetes에서의 Eureka HA 설정에 대해서:이 경우 인스턴스별로 서비스를 작성하는 대신 StatefulSet을 사용할 수 있습니다.StatefulSet은 작성하는 인스턴스별로 안정적인 네트워크 ID를 보장합니다.예를 들어 다음과 같은 yaml(StatefulSet + 헤드리스 서비스)과 같은 전개가 될 수 있습니다.StatefulSets의 DNS 명명 규칙에 따라 여기에 두 개의 Eureka 인스턴스가 있습니다(네임스페이스가 "기본값"이라고 가정).

  • eureka-0.eureka.default.cluster.local 및

  • eureka-1.eureka.default.cluster.local

포드가 같은 네임스페이스에 있는 한 다음과 같은 방법으로 Eureka에 도달할 수 있습니다.

  • 유레카-0.유레카
  • 유레카-1.유레카

주의: 이 예에서 사용되는 도커 이미지는 https://github.com/stefanocke/eureka에서 가져온 것입니다.직접 선택하거나 직접 만드는 것이 좋습니다.

---
apiVersion: v1
kind: Service
metadata:
  name: eureka
  labels:
    app: eureka
spec:
  ports:
  - port: 8761
    name: eureka
  clusterIP: None
  selector:
    app: eureka
---    
apiVersion: apps/v1beta2
kind: StatefulSet
metadata:
  name: eureka
spec:
  serviceName: "eureka"
  replicas: 2 
  selector:
    matchLabels:
      app: eureka
  template:
    metadata:
      labels:
        app: eureka
    spec:
      containers:
      - name: eureka
        image: stoc/eureka
        ports:
        - containerPort: 8761
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
          # Due to camelcase issues with "defaultZone" and "preferIpAddress", _JAVA_OPTIONS is used here
        - name: _JAVA_OPTIONS
          value: -Deureka.instance.preferIpAddress=false -Deureka.client.serviceUrl.defaultZone=http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/
        - name: EUREKA_CLIENT_REGISTERWITHEUREKA
          value: "true"
        - name: EUREKA_CLIENT_FETCHREGISTRY
          value: "true"
        # The hostnames must match with the the eureka serviceUrls, otherwise the replicas are reported as unavailable in the eureka dashboard      
        - name: EUREKA_INSTANCE_HOSTNAME
          value: ${MY_POD_NAME}.eureka
  # No need to start the pods in order. We just need the stable network identity
podManagementPolicy: "Parallel"

@Stefan Ocke 같은 설정을 시도하고 있습니다만, 자신의 Eureka 서버 이미지를 사용하고 있습니다만, 이 에러가 계속 발생하고 있습니다.

Request execution failed with message: java.net.ConnectException: Connection refused (Connection refused)
2019-09-27 06:27:03.363 ERROR 1 --- [           main] c.n.d.s.t.d.RedirectingEurekaHttpClient  : Request execution error. endpoint=DefaultEndpoint{ serviceUrl='http://eureka-1.eureka:8761/eureka/}

구성은 다음과 같습니다.

유레카 스프링 속성:

server.port=${EUREKA_PORT}
spring.security.user.name=${EUREKA_USERNAME}
spring.security.user.password=${EUREKA_PASSWORD}
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.instance.prefer-ip-address=false
eureka.server.wait-time-in-ms-when-sync-empty=0
eureka.server.eviction-interval-timer-in-ms=15000
eureka.instance.leaseRenewalIntervalInSeconds=30
eureka.instance.leaseExpirationDurationInSeconds=30
eureka.instance.hostname=${EUREKA_INSTANCE_HOSTNAME}
eureka.client.serviceUrl.defaultZone=http://eureka-0.eureka:8761/eureka/,http://eureka-1.eureka:8761/eureka/

StatefulSet 구성:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: eureka
spec:
  serviceName: "eureka"
  podManagementPolicy: "Parallel" 
  replicas: 2
  selector:
    matchLabels:
      app: eureka
  template:
    metadata:
      labels:
        app: eureka    
    spec:
      containers:
      - name: eureka
        image: "my-image"
        command: ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar","/app/eureka-service.jar"]
        ports:
        - containerPort: 8761
        env: 
        - name: EUREKA_PORT
          value: "8761"
        - name: EUREKA_USERNAME
          value: "theusername"
        - name: EUREKA_PASSWORD
          value: "thepassword"
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: EUREKA_INSTANCE_HOSTNAME
          value: ${MY_POD_NAME}.eureka   

서비스 구성:

apiVersion: v1
kind: Service
metadata:
  name: eureka
  labels:
    app: eureka
spec:
  clusterIP: None
  selector:
    app: eureka
  ports:
  - port: 8761
    targetPort: 8761

입력 컨트롤러:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: eureka
              servicePort: 8761

IP로 이름을 해결하려면 kubernetes kube-dns 서버를 설치한 후 서비스로 eureka pod를 공개해야 합니다.DNS 및 서비스 작성 방법에 대한 자세한 내용은 (kubernetes 문서 참조)를 참조하십시오.@filen_filen_filen_filen_filen_filen_filen_filen_filen_filen_filen_마이크로 서비스 'X'를 마운트하면 모든 Eureka 복제본에 등록되지만, 다운되면 한 개의 복제본만 업데이트를 받게 됩니다! 다른 복제본은 여전히 마이크로 서비스 인스턴스를 실행 중인 것으로 간주합니다.

정확히 이 문제가 발생하였고 pod 환경변수를 추가하여 해결되었습니다.이게 정답이에요.내 포드의 샘플 env 변수는 다음과 같습니다.

여기에 이미지 설명 입력

이 설정을 어디에 배치했는지 궁금한데, 이 설정은 Eureka에 있는 서비스 레지스트리에 있습니까?클라이언트측(eureka에 접속하고 싶은 곳)에 있습니까?

현재의 경우, 모든 설정은 repo에 배치되어 있습니다.또한 eureka 설정도 마찬가지입니다.그러면 Configuration이 스태틱해집니다.

언급URL : https://stackoverflow.com/questions/40567429/eureka-and-kubernetes

반응형