Always-Try(정보보안 및 일상)

AWS - 쿠버네티스 - 6탄 쿠버네티스 앱 노출을 위해 서비스 이용하기 (Minikube와 Katacoda를 이용한 가상 실습) 본문

AWS

AWS - 쿠버네티스 - 6탄 쿠버네티스 앱 노출을 위해 서비스 이용하기 (Minikube와 Katacoda를 이용한 가상 실습)

Always-Try 2021. 7. 13. 12:55
https://kubernetes.io/ko/docs/home/ 참고

 

쿠버네티스에서 파드들은 고유의 IP를 가지고 있긴하지만, 그 IP들은 별도의 도움 없이 외부로 노출되어 질 수 없다. 이때 외부 노출을 위한 개념이 서비스이다. 다시 말해, 쿠버네티스에서 서비스란 파드셋과 그 파드들에 접근할 수 있는 정책을 정의하는 개념이라고 볼 수 있다. 

서비스는 파드 셋에 걸쳐서 트래픽을 라우트한다. 애플리케이션에 영향을 주지 않으면서 쿠버네티스에서 파드들이 죽게도 하고, 복제가 되게도 해주는 추상적 개념이다. 종속적인 파드들 사이에서의 디스커버리와 라우팅은 (하나의 애플리케이션에서 프로트엔드와 백엔드 컴포넌트와 같은) 쿠버네티스 서비스들에 의해 처리된다.

서비스가 대상으로 하는 파드셋은 보통 Labelseletor에 의해 결정되며, 아래 4가지 타입으로 파드를 외부에 노출할 수 있다.

  • Cluster IP: 가장 기본적인 방법으로 클러스터 내에서 내부 IP에 대해 서비스를 노출해준다. 이 방식은 오직 클러스터 내에서만 서비스가 접근될 수 있도록 해준다. 간단히 요약하자면 파드들의 IP를 묶어줄 VIP를 생성하는 식으로 사용된다. (VIP 내 LB도 포함)
  • NodePort: NAT가 이용되는 클러스터 내에서 각각 선택된 노드들의 동일한 포트에 서비스를 노출시켜준다. NodePort를 이용하면 Cluster IP를 생성한 이후 모든 워커노드에 외부에서 접속 가능한 동일한 포트를 지정해준다. Cluster IP와 마찬가지로 외부에서 특정 포트로 접근했을 때, 자체 LB를 지원한다.
  • LoadBalancer: AWS, GCP 등등 기존 클라우드에서 외부용 로드밸런서를 생성하고 서비스에 고정된 공인 IP를 할당해준다. NodePort의 상위 집합이다.
  • ExternalName: CNAME 레코드 및 값을 반환함으로써 서비스를 externalName 필드의 내용(예를 들면, `foo.bar.example.com`)에 매핑한다. 어떠한 종류의 프록시도 설정되지 않는다. 이 방식은 kube-dns v1.7 이상 또는 CoreDNS 버전 0.0.8 이상을 필요로 한다.

 

서비스는 쿠버네티스의 객체들에 대해 논리 연산을 허용해주는 기본 그룹핑 단위인, 레이블과 셀렉터를 이용하여 파드 셋과 매치시킨다. 레이블은 오브젝트들에 붙여진 키/밸류 쌍으로 다양한 방식으로 이용 가능하다.

  • 개발, 테스트, 그리고 상용환경에 대한 객체들의 지정
  • 임베디드된 버전 태그들
  • 태그들을 이용하는 객체들에 대한 분류

그림1. 서비스

 

 

그럼 이제 실습을 시작해보자.

일단 기존 생성된 파드를 확인한다.

kubectl get pods

그림2. 파드 정보

그리고 kubectl을 통해 어떤 서비스들이 존재하는지 확인한다.

kubectl get services

그림3. 서비스 정보

위 캡쳐에서 보면 클러스터 IP와 포트(내부 포트), Extenal-IP(노드 IP)를 확인할 수 있다. 다시 말하지만 위에 나오는 포트는 내부 포트를 의미한다.

그럼 외부적으로는 어떤 포트가 열려있는지 확인하기 위해서 아래 명령어를 입력해보자.

kubectl describe services/kubernetes

그림4. 서비스 상세 확인

외부 접속용으로는 8443 포트가 TargetPort로 열려있다. 그럼 Curl을 이용해 한번 8443 포트로 연결해보자.

curl $(minikube ip):8443

그림5. 서비스 포트 연결 시도 성공

참고로 연결 실패시는 아래와 같이 출력된다.

그림6. 서비스 포트 연결 시도 실패

 

이제 라벨을 사용해보자. 기본적으로 Deployment는 생성 시 라벨도 함께 생성한다. 기본 라벨명을 확인하려면 아래 명령어를 입력하자.

kubectl describe deployment

그림7. Deployment 확인

 

라벨을 이용해 특정 파드나 서비스를 지정해서 쿼리할 수 있다.

kubectl get pods -l app=kubernetes-bootcamp

그림8. 파드의 라벨 호출

 

새로운 라벨을 적용하기 위해서는 아래와 같이 파드나 서비스명 뒤에 신규 라벨을 붙여준다.

kubectl label pods $POD_NAME version=v1

 

서비스를 삭제하기 위해서는 delete service 명령어를 사용한다.

kubectl delete service -l app=kubernetes-bootcamp

 

삭제가 잘 됐는지 확인하기 위해서는 아래 2가지 방법을 사용해보자.

kubectl get services
curl $(minikube ip):$NODE_PORT

 

위 명령어의 결과는 클러스터 외부에서 앱에 더 이상 연결할 수 없음을 증명한다. 그리고 외부 접속은 되지 않지만, 애플리케이션이 파드 내부에서 여전히 실행중인지는 컬(Curl)로 확인할 수 있다.

kubectl exec -ti $POD_NAME -- curl localhost:8080

 

Comments