[Kubernetes] Pod 에서 데이터베이스 접근하기 - 서비스 디스커버리

2023. 7. 14. 16:57기술 창고/Kubernetes

728x90
SMALL

Pod 에서 데이터베이스에 접근하는 방법에 대해서 알아보겠습니다.

이는 단지 데이터베이스에 접근하기 위한 방법이 아니라 여러 다양한 서비스 컨테이너들과 통신하기 위한 공통적인 방법 중 하나입니다.

 

 

 

vi {데이터베이스 연결 설정 yml 파일 명} 명령어를 입력하여 연결할 데이터베이스 설정값들이 저장되어있는 yml 파일을 만들어줍니다.
해당 파일 내부에 MySQL 데이터베이스 image를 불러와 Pod 로 래핑하고 그 Pod를 Service로 로컬 (port 번호 3306) 연결해주었습니다.
MySQL 버전은 5버전으로 했습니다.
최신버전을 적용하려면 latest 로 입력하면 됩니다.
해당 설정들은 Docker의 yml 양식을 가져와 값을 기입해주었습니다.
이렇게 Pod 부터 Service 까지 한 파일에 설정을 해줄 수 있습니다.

 

 

이제 kubectl apply -f {만든 yml 파일명} 명령어를 통해 적용하고 생성해줍니다.
정상적으로 mysql Pod 가 생성되고 Service 또한 정상적으로 생성된 것을 볼 수 있습니다.

 

 

kubectl get all 명령어를 통해서도 생성된 내용들을 확인할 수 있습니다.

 

 

kubectl exec -it {실행할 어플리케이션 Pod 명} sh 명령어를 입력하여 이제 데이터베이스를 사용하기 위해 접근할 어플리케이션을 sh 셸로 실행해줍니다.
명령어를 실행했다면 지금 실행한 어플리케이션 내부로 들어와있는 상태입니다.

앞서 이전에 정리했던 내용들을 기억해보면, 컨테이너 간에 네트워킹을 하려면 중간에 DNS 서비스를 이용하여 접근을 해야됩니다.
따라서, 실행한 어플리케이션에서 데이터베이스 컨테이너를 연결하기 위해 해당 데이터베이스 컨테이너의 네임 스페이스, DNS, ip 주소를 알아야합니다.

 

 

cat /etc/resolv.conf 명령어를 입력하여 현재 서버 어느 ip에서 실행되고 있는지 확인할 수 있습니다.
저는 10.96.0.10 주소로 실행되고 있습니다.

 

 

나와서 kubectl get all -n kube-system 명령어를 입력해보면 kube-system 네임 스페이스에서 실행중인 모든 시스템에 대해서 확인할 수 있습니다.
이 중에서 실행중인 kube-dns Service가 방금 확인한 실행 서버 주소 ip 와 동일한 것을 알 수 있습니다.
쿠버네티스의 DNS 서비스는 자동적으로 백그라운드에서 생성되고 실행되어 kube-system 네임 스페이스로 지정됩니다.

 

 

이제 실행 중인 웹 어플리케이션의 주소는 알았으니 중요한 데이터베이스 컨테이너의 주소를 알아야 합니다.
nslookup {Service 명} 명령어를 입력하면 해당 Service의 ip 주소를 확인할 수 있습니다.
저는 아까 MySQL 연결 yml 파일에 Service 부분의 이름을 database 라고 지정해주었으니 database 라고 입력해주었습니다.
입력하면 저의 경우에는 10.110.55.80 ip 주소가 나왔습니다.

 

 

나와서 kubectl get all 명령어를 입력하여 database Service의 Cluster IP를 확인했을 때도 동일한 ip주소를 확인할 수 있습니다.

 

다시 웹 어플리케이션에 들어와서 mysql을 입력해보면 찾을 수 없다고 나올 것입니다.
당연히 현 웹 어플리케이션에 mysql 관련된 패키지를 설치하지 않았기 때문입니다.
mysql 드라이버를 내부에서 지원해주기 위해 apk 형식의 패키지를 받아야 합니다.
apk update 명령어를 입력하여 우선 apk를 최신화 시켜줍니다.

 

 

최신화가 되었으면 apk add mysql-client 를 입력합니다.
mysql 자체를 통째로 설치한 것이 아니라 mysql 용 명령줄만을 설치한 것입니다.

 

 

그후 다시 mysql을 입력해보면 에러가 발생합니다.
데이터베이스 서버가 없기 때문에 발생된 에러입니다.
따라서 다른 컨테이너에서 실행중인 데이터베이스에 연결할 필요가 있습니다.
앞서 database라는 이름으로 생성한 데이터베이스 Service에 연결해주면 될 것입니다.

 

 

mysql -h {생성한 yml 속 데이터베이스 Service 명} -uroot -p{생성한 yml 속 MYSQL_ROOT_PASSWORD value 값} {생성한 yml 속 MYSQL_DATABASE value 값} 명령어를 입력하면 생성한 yml 설정 파일을 기반으로 MySQL 컨테이너에 원격으로 접속하게 됩니다.

 

 

제대로 SQL 명령이 수행되는지 테스트 해보겠습니다.
DDL 명령어를 통해 testtable을 생성해주고, show tables 명령어를 입력했을 때 정상적으로 테이블이 생성이 되었습니다!

 

이로써 데이터베이스 Pod, Service를 생성하고 실행하여 다른 웹 어플리케이션 컨테이너에서 원격으로 연결하는 과정을 정리해보았습니다.

 

 

!! 
지금은 웹 어플리케이션과 데이터베이스를 연결하는 데에 그쳤지만 이 내용을 기반으로 중요한 점을 다시 한번 짚자면,
우리가 원하는 모든 서비스의 ip 주소를 찾을 수 있고 연결할 수 있다는 것입니다.
이것을 서비스 디스커버리라고 말합니다.

이러한 방식으로 다양한 서비스들을 연결하는 방식은 MSA 마이크로 서비스를 구현하는 데에 있어서도 많은 도움이 될 것입니다.

728x90
반응형
LIST