이 블로그에서는 간단한 Java 애플리케이션이 Kubernetes의 서비스 검색을 사용하여 데이터베이스와 통신하는 방법을 보여드립니다.

DC/OS에서 Java 및 데이터베이스 애플리케이션을 사용한 서비스 검색 에서 서비스 검색이 멀티 컨테이너 애플리케이션에 중요한 이유를 설명합니다. 이 블로그에서는 DC/OS에서 이를 수행하는 방법도 설명합니다.
애플리케이션 서버와 데이터베이스 서버의 단일 인스턴스를 사용하여 Kubernetes에서 이를 어떻게 수행할 수 있는지 알아보겠습니다. 이 블로그에서는 애플리케이션 서버에는 WildFly를, 데이터베이스에는 Couchbase를 사용합니다.
이 블로그에서는 다음과 같은 주요 단계를 사용합니다:
- 쿠버네티스 원노드 클러스터 시작하기
- 쿠버네티스 애플리케이션 정의
- 애플리케이션 배포
- 애플리케이션에 액세스
쿠버네티스 클러스터 시작
미니큐브 는 노트북의 가상 머신에서 단일 노드 Kubernetes 클러스터를 시작하는 가장 쉬운 방법입니다. 바이너리를 먼저 다운로드한 다음 설치해야 합니다.
전체 설치 지침은 다음에서 확인할 수 있습니다. github.com/kubernetes/minikube.
그리고 최신 릴리스 로 OSX에 설치할 수 있습니다:
|
1 2 |
curl -Lo 미니큐브 https://storage.googleapis.com/minikube/releases/v0.17.1/minikube-darwin-amd64 \. && chmod +x 미니큐브 |
또한 다음이 필요합니다. kubectl 를 설치해야 합니다. kubectl 설치 및 설정하기 에서 kubectl을 설치하는 방법에 대한 자세한 지침을 제공한다. OSX에서는 다음과 같이 설치할 수 있다:
|
1 2 |
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl \. && chmod +x ./kubectl |
이제 클러스터를 다음 이름으로 시작합니다:
|
1 2 3 4 5 6 7 8 9 10 11 |
미니큐브 시작 시작 local Kubernetes 클러스터... 시작 VM... 다운로드 미니큐브 ISO 88.71 MB / 88.71 MB [==============================================] 100.00% 0s SSH-ing 파일 에 VM... 설정 up certs... 시작 클러스터 구성 요소... 연결 에 클러스터... 설정 up kubeconfig... Kubectl 는 지금 구성된 에 사용 의 클러스터. |
그리고 kubectl 버전 명령은 kubectl 클라이언트 및 미니큐브 서버 버전에 대한 자세한 정보를 보여줍니다:
|
1 2 3 |
kubectl 버전 클라이언트 버전: 버전.정보{전공:"1", 미성년자:"5", GitVersion:"v1.5.4", GitCommit:"7243c69eb523aa4377bce883e7c0dd76b84709a1", GitTreeState:"clean", 빌드 날짜:"2017-03-07T23:53:09Z", GoVersion:"go1.7.4", 컴파일러:"gc", 플랫폼:"darwin/amd64"} 서버 버전: 버전.정보{전공:"1", 미성년자:"5", GitVersion:"v1.5.3", GitCommit:"029c3a408176b55c30846f0faedf56aae5992e9b", GitTreeState:"clean", 빌드 날짜:"1970-01-01T00:00:00Z", GoVersion:"go1.7.3", 컴파일러:"gc", 플랫폼:"LINUX/AMD64"} |
클러스터에 대한 자세한 내용은 다음을 사용하여 얻을 수 있습니다. kubectl 클러스터 정보 명령을 사용합니다:
|
1 2 3 4 5 |
Kubernetes 마스터 는 실행 중 에서 https://192.168.99.100:8443 KubeDNS 는 실행 중 에서 https://192.168.99.100:8443/api/v1/프록시/네임스페이스/kube-system/services/kube-dns 쿠버네티스-대시보드 는 실행 중 에서 https://192.168.99.100:8443/api/v1/프록시/네임스페이스/큐브-시스템/서비스/큐버네티스-대시보드 To 더 debug 그리고 진단 클러스터 문제, 사용 'kubectl 클러스터-정보 덤프'. |
쿠버네티스 애플리케이션 정의
애플리케이션 정의는 다음에서 정의됩니다. github.com/arun-gupta/kubernetes-java-sample/blob/master/service-discovery.yml. 다음으로 구성됩니다:
- 카우치베이스 서비스
- 단일 포드가 포함된 Couchbase 복제본 세트
- 단일 포드가 포함된 WildFly 복제본 세트
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
apiVersion: v1 종류: 서비스 메타데이터: 이름: 카우치베이스-서비스 사양: 선택기: 앱: 카우치베이스-rs-pod 포트: - 이름: 관리자 포트: 8091 - 이름: 조회수 포트: 8092 - 이름: 쿼리 포트: 8093 - 이름: 멤캐시드 포트: 11210 --- apiVersion: 확장 프로그램/v1beta1 종류: 복제 세트 메타데이터: 이름: 카우치베이스-rs 사양: 복제본: 1 템플릿: 메타데이터: 레이블: 앱: 카우치베이스-rs-pod 사양: 컨테이너: - 이름: 카우치베이스 이미지: arungupta/카우치베이스:여행 포트: - 컨테이너 포트: 8091 - 컨테이너 포트: 8092 - 컨테이너 포트: 8093 - 컨테이너 포트: 11210 --- apiVersion: 확장 프로그램/v1beta1 종류: 복제 세트 메타데이터: 이름: wildfly-rs 레이블: 이름: wildfly 사양: 복제본: 1 템플릿: 메타데이터: 레이블: 이름: wildfly 사양: 컨테이너: - 이름: wildfly-rs-pod 이미지: arungupta/wildfly-카우치베이스-javaee:여행 환경: - 이름: COUCHBASE_URI 값: 카우치베이스-서비스 포트: - 컨테이너 포트: 8080 |
핵심 부분은 COUCHBASE_URI 환경 변수는 Couchbase 서비스의 이름입니다. 이를 통해 WildFly에 배포된 애플리케이션이 서비스를 동적으로 검색하고 데이터베이스와 통신할 수 있습니다.
arungupta/couchbase:travel 도커 이미지는 다음을 사용하여 생성됩니다. github.com/arun-gupta/couchbase-javaee/blob/master/couchbase/Dockerfile.
arungupta/wildfly-couchbase-javaee:travel 도커 이미지는 다음을 사용하여 생성됩니다. github.com/arun-gupta/couchbase-javaee/blob/master/Dockerfile.
Java EE 애플리케이션은 데이터베이스 쿼리를 시작하기 전에 데이터베이스 초기화가 완료될 때까지 기다립니다. 이는 다음에서 확인할 수 있습니다. github.com/arun-gupta/couchbase-javaee/blob/master/src/main/java/org/couchbase/sample/javaee/Database.java#L25.
애플리케이션 배포
이 애플리케이션은 다음과 같이 배포할 수 있습니다:
|
1 |
kubectl create -f ~/작업 공간/쿠버네티스-자바-샘플/서비스-발견.yml |
서비스 및 복제본 세트 목록은 다음 명령을 사용하여 표시할 수 있습니다. kubectl get svc,rs:
|
1 2 3 4 5 6 7 8 |
이름 클러스터-IP 외부-IP PORT(S) AGE svc/카우치베이스-서비스 10.0.0.97 <없음> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 27m svc/쿠버네티스 10.0.0.1 <없음> 443/TCP 1h svc/wildfly-rs 10.0.0.252 <없음> 8080/TCP 21m 이름 DESIRED 현재 READY AGE rs/카우치베이스-rs 1 1 1 27m rs/wildfly-rs 1 1 1 27m |
Couchbase의 단일 복제본에 대한 로그는 다음 명령을 사용하여 얻을 수 있습니다. kubectl 로그 rs/couchbase-rs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
++ set -m ++ 수면 25 ++ /진입점.sh 카우치베이스-서버 시작 카우치베이스 서버 -- 웹 UI 사용 가능 에서 https://:8091 및 로그는 /opt/couchbase/var/lib/couchbase/logs에서 사용할 수 있습니다. ++ curl -v -X POST https://127.0.0.1:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 . . . {"storageMode":"memory_optimized","indexerThreads":0,"메모리 스냅샷 간격":200,"안정적인 스냅샷 간격":5000,"최대 롤백 포인트":5,"logLevel":"정보"}[]유형: ++ echo 'Type: ' ++ '[' '' = WORKER ']' ++ fg 1 /진입점.sh 카우치베이스-서버 |
WildFly 복제본 세트에 대한 로그는 다음 명령을 사용하여 확인할 수 있습니다. kubectl 로그 RS/WILDFLY-RS:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
========================================================================= JBoss 부트스트랩 환경 JBOSS_HOME: /opt/jboss/wildfly . . . 06:32:08,537 정보 [com.카우치베이스.클라이언트.핵심.노드.노드] (cb-io-1-1) 연결됨 에 노드 카우치베이스-서비스 06:32:09,262 정보 [com.카우치베이스.클라이언트.핵심.구성.구성 공급자] (cb-계산-3) 열림 버킷 여행-샘플 06:32:09,366 정보 [stdout] (서버 서비스 스레드 Pool -- 65) 수면 에 대한 3 초 ... 06:32:12,369 정보 [stdout] (서버 서비스 스레드 Pool -- 65) 버킷 발견! 06:32:14,194 정보 [org.jboss.resteasy.resteasy_jaxrs.i18n] (서버 서비스 스레드 Pool -- 65) RESTEASY002225: 배포 javax.ws.rs.핵심.애플리케이션: 클래스 org.카우치베이스.샘플.javaee.마이애플리케이션 06:32:14,195 정보 [org.jboss.resteasy.resteasy_jaxrs.i18n] (서버 서비스 스레드 Pool -- 65) RESTEASY002200: 추가 클래스 리소스 org.카우치베이스.샘플.javaee.항공사 리소스 에서 애플리케이션 클래스 org.카우치베이스.샘플.javaee.마이애플리케이션 06:32:14,310 정보 [org.wildfly.확장.언더로우] (서버 서비스 스레드 Pool -- 65) WFLYUT0021: 등록됨 웹 컨텍스트: /항공사 06:32:14,376 정보 [org.jboss.as.서버] (서버 서비스 스레드 Pool -- 34) WFLYSRV0010: 배포됨 "airlines.war" (런타임-이름 : "airlines.war") 06:32:14,704 정보 [org.jboss.as] (컨트롤러 부팅 스레드) WFLYSRV0060: Http 관리 인터페이스 듣기 on https://127.0.0.1:9990/management 06:32:14,704 정보 [org.jboss.as] (컨트롤러 부팅 스레드) WFLYSRV0051: 관리자 콘솔 듣기 on https://127.0.0.1:9990 06:32:14,705 정보 [org.jboss.as] (컨트롤러 부팅 스레드) WFLYSRV0025: WildFly 전체 10.1.0.Final (WildFly 핵심 2.2.0.Final) 시작 in 29470ms - 시작됨 443 의 691 서비스 (404 서비스 는 게으른, 패시브 또는 on-수요) |
애플리케이션 액세스
그리고 kubectl 프록시 명령은 쿠버네티스 API 서버에 대한 프록시를 시작합니다. 애플리케이션에 액세스하기 위해 Kubernetes 프록시를 시작해 보겠습니다:
|
1 2 |
kubectl 프록시 시작 에 serve on 127.0.0.1:8001 |
다음을 사용하여 WildFly 복제본 세트를 서비스로 노출합니다:
|
1 |
kubectl 노출 --이름=wildfly-서비스 rs/wildfly-rs |
서비스 목록은 다음을 사용하여 다시 볼 수 있습니다. kubectl get svc 명령을 사용합니다:
|
1 2 3 4 5 |
kubectl get svc 이름 클러스터-IP 외부-IP PORT(S) AGE 카우치베이스-서비스 10.0.0.97 <없음> 8091/TCP,8092/TCP,8093/TCP,11210/TCP 41m 쿠버네티스 10.0.0.1 <없음> 443/TCP 1h wildfly-서비스 10.0.0.169 <없음> 8080/TCP 5s |
이제 애플리케이션은 다음 주소에서 액세스할 수 있습니다:
|
1 |
curl https://localhost:8001/api/v1/proxy/namespaces/default/services/wildfly-service/airlines/resources/airline |
형식이 지정된 출력은 다음과 같습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[ { "travel-sample": { "country": "미국", "iata": "Q5", "콜사인": "MILE-AIR", "name": "40마일 에어", "icao": "MLA", "id": 10, "type": "항공사" } }, { "travel-sample": { "country": "미국", "iata": "TQ", . . . "name": "Airlinair", "icao": "RLA", "id": 1203, "type": "항공사" } } ] |
이제 복제본 세트를 확장하여 새 파드를 Couchbase 서비스의 일부로 추가할 수 있습니다. 기존 파드는 종료되거나 일정이 변경될 수 있습니다. 그러나 Java EE 애플리케이션은 논리적 이름을 사용하여 데이터베이스 서비스에 계속 액세스합니다.
이 블로그에서는 간단한 Java 애플리케이션이 Kubernetes의 서비스 검색을 사용하여 데이터베이스와 통신하는 방법을 보여드렸습니다.
자세한 내용은 여기에서 확인하세요:
[...] Kubernetes의 Java 및 데이터베이스 애플리케이션을 사용한 서비스 검색 [...]