본문으로 바로가기
반응형

Intro

  • 오늘은 쿠버네티스의 Pod로 접근하기위해 네트워크에 노출시키는 Service에 대해 설명하고자 합니다.
  • 서비스를 네트워크에 어떤 방식으로 노출 시킬 것인가에 따라서 타입이 달라집니다.

Service 의 type 종류

  • ClusterIP : 클러스터 내부에서만 접근할 수 있는 IP를 할당
  • NodePort : 노드의 특정 포트를 사용하여 접근하는 방식, 포트당 하나의 서비스만 사용 가능
  • LoadBalancer : 노드포트 앞단에 특정 LoadBalancer를 사용하여 접근하는 방식
  • ExternalName : DNS이름에 대한 서비스를 매핑함

ClusterIP타입

말그대로 ClusterIP는 서비스를 클러스터 IP로 할당 합니다. 클러스터 내부에서만 접근할 수 있으며, 외부에서는 접근할 수 없으로 port forwarding 또는 proxy를 통해 접근을 해야 합니다. 또한 서비스 타입을 별도 type을 설정하지 않으면 ClusterIP가 default로 설정됩니다.

ClusterIP타입 yaml예시

  • deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: k8s-test
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  • service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: k8s-test
spec:
  type: ClusterIP
  selector:
      app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

서비스를 apply 하고 확인해보면 아래와 같이 Cluster IP가 할당되어 있습니다.

ClusterIP 타입 서비스 외부 접근 방법

Proxy사용

  • kubernetes proxy 연결
kubectl proxy --port=8080
  • kubernetes api server 를 통해 proxy URL수동 구성
http://localhost:8080/api/v1/namespaces/<my_namespace_name>/services/http:<my_service_name>:<my_http_port_name>/proxy/
http://localhost:8080/api/v1/namespaces/k8s-test/services/http:my-service:http/proxy/

 

port forwarding 사용

  • kubernetes의 포트포워딩 기능을 통해 접근
kubectl port-forwarding service/<my_service_name> <local_port>:<remote_port>
kubectl port-forwarding service/my-service 8080:80

NodePort타입

  • 노드포트는 모든 워커 노드들의 특정 포트(port)를 이용하여 접근을 하도록 설정하는 타입입니다.
  • 노트포트를 사용하면 포트당 하나의 서비스를 사용하며, 30000-32767범위내 포트를 사용 합니다..
  • 노트포트의 단점은 노드가 사라졌을때 자동으로 다른노드를 통해 접근이 불가능합니다.
  • 따라서 자동으로 다른노드에 접근을 하려면 별도의 Loadbalancer가 필요 합니다.

NodePort타입 yaml예시

  • deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  namespace: k8s-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    spec:
      containers:
      - image: nginx:1.14.2
        name: nginx
        ports:
        - containerPort: 80
  • service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service2
  namespace: k8s-test
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30007

서비스를 apply 하고 확인해보면 아래와 같이 Cluster IP와, nodePort가 30007로 할당되어 있습니다.

NodePort 타입 서비스 외부 접근 방법

ClusterIP와 동일 방법으로 접근할 수 있습니다.

Proxy사용

  • kubernetes proxy 연결
kubectl proxy --port=8080
  • kubernetes api server 를 통해 proxy URL수동 구성
http://localhost:8080/api/v1/namespaces/<my_namespace_name>/services/http:<my_service_name>:<my_http_port_name>/proxy/
http://localhost:8080/api/v1/namespaces/k8s-test/services/http:my-service2:http/proxy/

 

port forwarding

  • kubernetes의 포트포워딩 기능을 통해 접근
kubectl port-forwarding service/<service_name> <local_port>:<remote_port>
kubectl port-forwarding service/my-service2 8080:80

LoadBalancer 타입

  • Nodeport 타입의 확장판이라고 할 수 있으며 서비스를 외부에 노출 할 수 있습니다.
  • NodePort타입 앞단에 Loadbalancer가 붙어서 살아있는 노드를 체크하여 트래픽을 전달 할 수 있는 장점이 있습니다.
  • 클라우드 공급업체(AWS, GCP 등)에서 지원하는 기능입니다.

LoadBalancer타입 yaml 예시

  • deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx-deployment
  namespace: k8s-test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    spec:
      containers:
      - image: nginx:1.14.2
        name: nginx
        ports:
        - containerPort: 80
  • service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service3
  namespace: k8s-test
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 30006

위 예시와 같이 nodeport 를 지정할 수 있습니다. 저는 AWS EKS 클러스터로 생성하였기 때문에 AWS에 ELB가 생성되는 것을 확인할 수 있습니다.

LoadBalancer 타입 서비스 외부 접근 방법

ELB가 외부에서 접근 할 수 있는 public subnet에 자동으로 생성이 되므로 서비스를 확인할때 나오는 External-IP의 주소를 사용하여 외부에서 접근이 가능합니다.

  • AWS External-IP 예시 : 0000asdf0asd0f0asdf00.ap-northeast-2.elb.amazonaws.com

External 타입

  • 외부에서 접근하기 위한 종류 아니며, 외부의 특정 FQDN에 대한 CNAME 매핑을 제공 함

External 타입 yaml 예시

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

다음 시간에는 AWS의 여러가지 Elastic LoadBalancer Type을 설정 해보고, ingress도 설정해보도록 하겠습니다.

감사합니다.

반응형