
사용자가 쿠버네티스망에 있는 서비스, 즉 서비스에 연결되어 있는 파드에 접근하기 위해서는 ClusterIP, NodePort, LoadBalancer 타입의 서비스를 만들어야 한다.
사용자와 서비스를 연결할 때는 서비스의 아이피만 알면 사용자가 접근할 수 있다.
예를 들어, 파드A, 파드B, 서비스가 있고 파드A와 파드B를 연결하려고 한다. 이 세 가지 오브젝트는 동시에 배포되었을 수 있다. IP는 파드가 배포될 때 동적으로 할당되기 때문에 파드A가 파드B의 IP를 알 수 없다. 또한, 파드가 문제가 생겨서 죽을 경우 재생성되어 IP가 변경되기 때문에 IP로 연결하기 어려울 수 있다.
이 때 연결할 수 있도록 하기 위해서는 DNS Server와 Headless가 필요하다.
서비스에서 제공하는 기능을 통해, 사용자가 아닌 파드를 원하는 서비스나 파드에 직접 연결하거나 파드를 외부 서비스와 안정적으로 연결할 수 있다.
만약 파드와 외부 서비스가 연결되어 있는데, 다른 외부 서비스와 연결하고자 한다면 파드를 재배포해야 할까?
그러지 않아도 된다. 쿠버네티스는 이런 문제를 쉽게 해결하기 위해 Service의 ExternalName을 이용해 파드의 수정 없이 외부 연결을 할 수 있도록 지원한다.
DNS Server가 있다면 서비스나 파드 등의 IP가 저장되어있을 것이다. 만약 파드가 Service1과 연결하고자 한다면 DNS Server에 Service1의 IP를 질의해서 알아내고 연결할 수 있다.
DNS로 clusterip1의 IP를 조회하는 명령어는 다음과 같다.
$ nslookup clusterip1
서비스를 통하지 않고 직접 파드로 접근하기 위한 방법이다. 서비스를 Headless로 지정해주기 위해서는 yaml 파일에 clusterIP: None이라는 속성을 적어주면 된다.
파드를 Headless 서비스와 연결하기 위해서는 hostname 속성과 subdomain 속성이 필요하다. subdomain에 Headless의 이름을 적어주면 된다.
Headless를 이용하면, 도메인이 DNS Server에 함께 저장되어 IP 주소를 알 필요 없이 도메인으로 접근할 수 있다.
nslookup headless1 명령어를 사용하면 headless1에 연결된 파드들의 아이피 주소를 알 수 있다.
$ nslookup headless1 명령어를 사용하면 headless1에 연결된 파드들의 아이피 주소를 알 수 있다.
파드와 서비스를 연결할 때 label로 연결하는데, 이 때 쿠버네티스는 내부적으로 Endpoint를 만든다. Service와 같은 이름으로 Endpoint를 만들고 안에 파드의 접속 정보를 넣어 준다.
그래서 파드와 서비스에 라벨을 넣지 않더라도 엔드포인트 오브젝트를 만들어주면 파드와 서비스를 연결해줄 수 있다.
꼭 내부 오브젝트가 아니라 외부 아이피주소도 가능하다. 하지만 아이피주소는 언제든 바뀔 수 있기 때문에 도메인 주소를 지정할 수 있어야 하는데, 이 때 쓰는 것이 다음에 나오는 ExternelName이다.
특정 외부 도메인을 저장할 수 있고, 여러 레이어의 DNS Server를 타고 타서 외부 도메인의 IP를 알아낼 수 있다. 외부 도메인을 다른 곳으로 변경하고자 할 때도 파드를 수정할 필요 없이 ExternelName의 외부 도메인만 변경해주면 된다.