서비스에 접근하기

Kubernetes는 서비스를 찾는 두개의 기본 모드를 지원합니다:

  • environment variables

  • DNS

전자는 기본적으로 작동 하지만 후자는 CoreDNS 클러스터 추가 기능(EKS 클러스터 생성시 자동으로 설치됨)이 필요 합니다.

1. Environment variables

Pod가 노드에서 실행될 때 kubelet은 각 활성 서비스에 대한 환경 변수 세트를 추가 합니다. 이로 인해 순서상의 문제가 발생합니다. 이유를 확인 하려면 실행중인 nginx 포드의 환경을 검사합니다 (포드 이름은 다를 수 있습니다).

kubectl -n my-nginx get pods -l run=my-nginx -o wide

이제 실행중인 nginx 파드 중 하나의 환경을 살펴보겠습니다.

export mypod=$(kubectl -n my-nginx get pods -l run=my-nginx -o jsonpath='{.items[0].metadata.name}')

kubectl -n my-nginx exec ${mypod} -- printenv | grep SERVICE

서비스에 대한 언급이 없습니다. 이는 서비스 이전에 복제본을 생성했기 때문입니다.

이 작업의 또 다른 단점은 스케줄러가 두 파드를 동일한 머신에 배치 할 수 있다는 것입니다. 이로 인해 서비스가 종료되면 전체 서비스가 중단 됩니다. 2개의 파드를 종료하고 Deployment가 다시 생성 할 때까지 기다리면 올바른 방법으로 서비스를 제대로 수행 할 수 있습니다. 이번에는 서비스 주변에 복제본이 존재합니다. 이렇게 하면 파드(모든 노드의 용량이 동일한 경우)에 퍼져있는 스케줄러 수준 서비스와 올바른 환경 변수가 제공됩니다.

kubectl -n my-nginx rollout restart deployment my-nginx
kubectl -n my-nginx get pods -l run=my-nginx -o wide

변경되는 순간의 출력은 다음과 같습니다.

파드가 파괴되고 다시 생성되기 때문에 파드의 이름이 다른 것을 알 수 있습니다. 이제 실행중인 nginx 파드 중 하나의 환경을 한 번 더 살펴 보겠습니다:

export mypod=$(kubectl -n my-nginx get pods -l run=my-nginx -o jsonpath='{.items[0].metadata.name}')

kubectl -n my-nginx exec ${mypod} -- printenv | grep SERVICE

이제 MY_NGINX_SERVICE_HOST라는 nginx 서비스 IP를 참조하는 환경 변수가 있습니다.

2. DNS

쿠버네티스는 DNS 이름을 다른 서비스에 자동으로 할당하는 DNS 클러스터 추가 서비스를 제공 합니다. 클러스터가 이미 CoreDNS를 실행하고 있는지 확인하려면 다음 명령을 사용하십시오.

kubectl get service -n kube-system -l k8s-app=kube-dns

CoreDNS에 대한 서비스가 kube-dns 로 불리고 있습니다.

본 실습의 나머지 부분에서는 IP(my-nginx)가 있는 서비스와 해당 IP에 이름을 할당한 DNS 서버 (CoreDNS 클러스터 추가 기능)가 있다고 가정 하므로 서비스와 통신 할 수 있습니다. 표준 방법 (예 : gethostbyname)을 사용하여 클러스터의 모든 파드에서 이를 테스트하기 위해 다른 curl 애플리케이션을 실행 해 보겠습니다.

kubectl -n my-nginx run curl --image=radial/busyboxplus:curl -i --tty

아래 명려어를 입력하여 실행합니다.

nslookup my-nginx

다음과 같은 결과가 나옵니다.

exit을 입력하고 컨테이너를 빠져 나옵니다.

 exit
 

Last updated