컨테이터/가상화

쿠버네티스 서비스(kubernetes services) (1)

OSS 2018-09-27 14:27:09 697
2018

Posted in Kubernetes by arisu1000

 

서비스 소개

쿠버네티스 클러스터안에 컨트롤러를 이용해서 포드를 띄웠다면 이제 그 포드들에 접근하는 방법에 대해 알아봐야할 때입니다. 포드는 컨트롤러에 의해 관리되기 때문에 한군데에 고정되서 떠 있지 않고, 클러스터내를 옮겨다니게 됩니다. 이 과정에서 노드를 옮기면서 실행되기도 하고 클러스터내의 포드 IP가 변경되기도 합니다. 이렇게 동적으로 변하는 포드들에 고정된 방법으로 접근하기 위해서 사용하게는 쿠버네티스의 서비스(service)입니다. 서비스를 사용하게 되면 포드가 클러스터내의 어디에 있는지에 상관없이 고정된 주소를 이용해서 접근이 가능해 집니다. 그리고 클러스터 외부에서 포드에 접근하는것도 서비스를 통해서 가능합니다. 나중에 인그레스(ingress)에 대해 알게 되면 인그레스를 통해서도 가능해 지지만 인그레스 없이도 서비스를 통해서 클러스터 외부에서 클러스터 내부의 포드로 접근하는 것이 가능합니다.

다음 그림을 보면 포드가 옮겨 갔을때 서비스가 자동으로 새로 뜬 포드를 바라보기 때문에 실제 접속하는 사용자는 서비스만 바라보고 있으면 문제없이 새로운 포드를 사용가능한걸 알 수 있습니다.

996224375B434F241299310E4D5B434F2528

 

 

서비스 종류

서비스에는 크게 다음 4가지 종류가 있습니다. 

ClusterIP : 기본 서비스 타입이고 쿠버네티스 클러스터 내부에서 사용가능합니다. 클러스터 내부의 노드나 포드에서 이 ClusterIP를 이용해서 이 서비스에 연결된 포드에 접속 가능합니다. 클러스터 외부에서는 이용할 수 없습니다.

NodePort : 각 노드의 지정된 포트를 할당하는 방식입니다. node1:8080, node2:8080 이런방식으로 노드에 상관없이 포트번호만 서비스에 지정된걸 사용하면 접근이 가능합니다. 노드의 포트를 사용하기 때문에 클러스터 내부 뿐만 아니라 클러스터 외부에서도 접근이 가능합니다. 특이한 점은 포드가 node1에만 떠 있고 node2에는 없다고 하더라도 node2:8080으로 접근하면 node1에 떠 있는 포드로 연결이 가능합니다. 클러스터외부에서 클러스터내부의 포드로 접근할때 사용할 수 있는 가장 간단한 방법입니다.

LoadBalancer : AWS, GCP 같은 클라우드 서비스를 사용할때 사용가능한 옵션입니다. 포드를 클라우드에서 제공해주는 로드밸런서와 연결해서 그 로드밸런서의 IP를 이용해서 클러스터 외부에서 접근이 가능하게 해줍니다. kubectl get service로 서비스를 확인해 봤을때 EXTERNAL-IP 부분에 로드밸런서 IP가 표시되고 이 IP를 사용하면 외부에서 접근이 가능합니다.

ExternalName : 서비스를 externalName의 값이랑 매치합니다. 클러스터 내부에서 외부로 접근할때 주로 사용합니다. 이 서비스로 접근하면 설정해둔 CNAME값으로 연결되서 클러스터 외부로 접근할 수 있습니다. 외부로 접근할때 사용하는 값이기 때문에 설정할때 셀렉터가 필요 없습니다.

 

서비스 템플릿

서비스 템플릿 기본 구조는 다음과 같습니다. 다른 부분은 일반적인 형태고 spec부분을 보면 spec.type으로 서비스 타입을 지정할수 있습니다. spec.type을 지정하지 않으면 기본 타입은 ClusterIP입니다. spec.clusterIP를 이용해서 사용하려는 클러스터IP를 직접 지정하는것도 가능합니다. 지정하지 않으면 자동으로 값이 할당됩니다. spec.selector에서는 서비스와 연결할 포드에 지정된 라벨을 지정합니다. spec.ports는 배열 형태의 값입니다. 서비스가 포트를 외부에 제공할때 하나가 아니라 여러개를 한꺼번에 제공가능한데 spec.ports 하위에 값을 넣어주면 됩니다.

 

kind: Service

apiVersion: v1

metadata:

  name: my-service

spec:

  type: ClusterIP

  clusterIP: 10.0.10.10

  selector:

    app: MyApp

  ports:

  - protocol: TCP

    port: 80

    targetPort: 9376

 

헤드리스 서비스(headless service)

서비스를 만들때 ClusterIP를 None으로 설정하면 ClusterIP가 없는 서비스가 만들어 집니다. 이런 서비스를 헤드리스(headless) 서비스라고 합니다. 로드밸런싱이 필요없거나 단일 서비스 IP가 필요 없는 경우에 헤드리스 서비스를 사용합니다. 헤드리스 서비스에 셀렉터(selector)를 설정하면 api를 통해서 확인할 수 있는 엔드포인트(Endpoints)가 만들어 집니다. 서비스와 연결된 포드를 직접 가르키는 DNS A 레코드도 만들어 집니다. 셀렉터가 없는 경우에는 엔드포인트가 안 만들어 집니다. 셀렉터가 없더라도 DNS 시스템은 ExteralName 타입의 서비스를 위해 CNAME레코드가 만들어 집니다. 


원본출처: http://arisu1000.tistory.com/27838?category=787056 [아리수]

 

 

 

맨 위로
맨 위로