쿠버네티스 서비스(Service) 개념과 설정

ZER0·2022년 10월 8일
0

Kubernetes

목록 보기
6/39
post-thumbnail

1. 서비스 개념

  • 파드가 끊임없이 생성·삭제되는 쿠버네티스의 특성으로 인해 파드의 IP도 고정되지 않고 계속해서 바뀜
  • 이런 특성은 클러스터 외부에 있는 유저가 웹 서비스에 접근하거나, 클러스터 내부의 백엔드 또는 DB에 리소스를 요청할 때 큰 제약사항
  • 서비스 오브젝트는 이러한 문제를 해결하기 위해 애플리케이션에 접근 가능한 고정된 IP를 제공하는 역할
  • 서비스 타입은 4종류가 존재
    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName

2. 서비스 타입

  • ClusterIP
    • 서비스 오브젝트의 기본 타입으로 NodePort 등 별도의 옵션을 설정하지 않을 경우 디폴트로 ClusterIP로 설정
    • 클러스터 내부에서만 접근 가능한 ClusterIP라는 Virtual IP를 생성하고, 내부 리소스간에만 통신이 가능하도록 함
    • 따라서 클러스터 외부에서 접근하고자 할 경우 NodePort 또는 LoadBalancer 서비스 적용 필요
  • NodePort
    • 클러스터 외부에서 워커노드의 IP와 포트로 접속을 요청하면 워커노드는 해당 요청을 NodePort 서비스 오브젝트로 전달하고,
    • NodePort 서비스 오브젝트는 이를 전달받아 selector에 맵핑된 파드로 전달
  • LoadBalancer
    • CSP(AWS, GCP, Azure 등)에서 제공하는 로드밸런서를 이용하는 방법
    • IP를 가진 로드밸런서를 구성하고 DNS를 등록해 사용
    • 클러스터 외부의 이용자들이 NodePort처럼 주소(192.168.10.2:30008)를 입력하지 않고 URL을 통해 파드에 접근 가능
    • 로컬(virtualbox 등)에서 클러스터를 구성한 경우 metallb 등 오픈소스 LB를 통해 구현 가능
  • ExternalName
    • 클러스터 외부 서비스를 클러스터 내부에서 호출하고자 할 때 사용하는 서비스
    • ExternalName 서비스로 들어오는 모든 요청을 'externalName' 항목에 설정한 DNS 주소로 포워딩

3. ClusterIP

3.1. 서비스 생성

  • yaml를 활용한 ClusterIP 서비스 생성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: my-clusterip-svc
      name: my-clusterip-svc
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: clusterip-test
    cs
	12~13번: ClusterIP 서비스를 연결할 레플리카셋 또는 디플로이먼트의 레이블 값
  • 명령어를 활용한 ClusterIP 서비스 생성
	 kubectl create svc clusterip clusterip-test --tcp=80:80
     or
     kubectl expose deployment [디플로이먼트_이름] --port=[port] --target-port=[target-port]

3.2. 서비스 목록 확인

	kubectl get svc
    kubectl get svc -n [네임스페이스]
    kubectl get svc -A 
    kubectl get svc -o wide

3.3. 서비스 정보 확인

	kubectl describe svc [서비스_이름]

3.4. 서비스 삭제

	kubectl delete svc [서비스_이름]

3.5. ClusterIP 적용 예제

  • ClusterIP 서비스를 연결 할 nginx 디플로이먼트 생성
  • ClusterIP 서비스 생성
  • [ClusterIP 서비스의 IP]:[ClusterIP 서비스의 포트] 주소로 nginx 접속 테스트

4. NodePort

4.1. 서비스 생성

  • yaml를 활용한 NodePort 서비스 생성
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        name: nodeport-test
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    cs
6~7번: NodePort 서비스를 연결할 레플리카셋 또는 디플로이먼트의 레이블 값
8~11번: NodePort를 별도로 설정하지 않을 경우 30000 ~ 32767 범위에서 자동 할당
  • 명령어를 활용한 NodePort 서비스 생성
	kubectl create service nodeport [서비스_이름] --tcp=[port]:[targetPort]
    or
    kubectl expose deployment [디플로이먼트_이름] --port=[port] --target-port=[target-port] --type=NodePort

4.2. NodePort 적용 예제

  • NodePort 서비스를 연결 할 nginx 디플로이먼트 생성
  • 파드 배포 확인
  • NodePort 서비스 생성
  • nginx 디플로이먼트가 배포된 노드의 IP 확인
  • [디플로이먼트가 배포된 노드의 IP]:[NodePort 서비스의 포트] 주소로 nginx 접속 테스트

5. LoadBalancer

5.1. 서비스 생성

  • yaml를 활용한 LoadBalancer 서비스 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: frontend
      name: my-loadbalncer-test
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: frontend
      type: LoadBalancer
    cs

  • 명령어를 활용한 LoadBalancer 서비스 생성

	kubectl create service loadbalancer [서비스_이름] --tcp=[port]:[targetPort]
    or
    kubectl expose deployment [디플로이먼트_이름] --port=[port] --target-port=[target-port] --type=LoadBalancer

6. ExternalName

6.1. 서비스 생성

  • yaml를 활용한 ExternalName 서비스 생성
    1
    2
    3
    4
    5
    6
    7
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      type: ExternalName
      externalName: zero.test.com
    cs
  • 명령어를 활용한 LoadBalancer 서비스 생성
	kubectl create service externalname [서비스_이름] --external-name [DNS] 

7. 참고

  1. https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/
  2. https://kubernetes.io/ko/docs/concepts/services-networking/service/
profile
Security Compliance Engineer

0개의 댓글