유레카와 쿠베르네테스
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
'source' 카테고리의 다른 글
Elastic Search에 JSON 파일 가져오기/인덱스화 (0) | 2023.04.06 |
---|---|
새 속성 값을 사용하여 프로그래밍 방식으로 WooCommerce 제품 변형을 생성합니다. (0) | 2023.04.06 |
MongoDB {aggregation $match} 대 {find} 속도 (0) | 2023.04.01 |
모바일에서 리액트 앱 미리보기를 만드는 방법 (0) | 2023.04.01 |
플러그인 개발 중 Wordpress 오류 - "이 페이지에 액세스할 수 있는 충분한 권한이 없습니다." (0) | 2023.04.01 |