Post

Section 2-3. Service

udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의 및 쿠버네티스 인 액션 (마르코 룩샤)를 참고하여 정리한 글입니다.

Section02. Core Concepts

Service

  • 파드는 특성상 생성될 때마다 내부 IP 주소가 계속 변하므로 고정된 엔드포인트로 호출이 어렵다. 또한 여러 파드에 같은 애플리케이션을 운용할 경우 파드 간 로드 밸런싱을 지원해야 하는데 이를 Service를 통해 할 수있다.
  • 쿠버네티스의 Service는 지정된 IP로 생성이 가능하고 여러 파드를 묶어 로드 밸런싱이 가능하며 고유한 DNS 이름을 가질 수 있다.

Service의 종류

  • Node Port
    • Service가 노드의 포트에 내부 포트를 액세스하게 한다. Cluster IP로만 접근이 가능한것이 아니라, 모든 노드의 IP와 포트를 통해서도 접근이 가능하게 된다.
  • Cluster IP
    • 디폴트 설정으로 서비스가 생성될 때마다 고유한 클러스터 IP 주소가 서비스에 할당되어 클러스터 내부 IP에서 서비스를 노출한다.
    • 쿠버네티스 클러스터 내에서는 이 서비스에 접근이 가능하지만, 외부 IP 를 할당받지 못했기 때문에 클러스터 외부에서는 접근이 불가능하다.
  • Load Balencer
    • 클라우드 제공자의 부하 분산 장치를 사용하여 서비스를 외부에 노출한다.
  • ExternalName
    • 해당 값과 함께 레코드를 반환하여 서비스를 필드의 내용 externalName에 매핑한다. 어떤 종류의 프록시도 설정되지 않는다.
    • 외부 서비스를 쿠버네티스 내부에서 호출하고자 할 때 사용할 수 있다.
    • ExternalName 유형의 서비스는 일반적인 셀렉터에 대한 서비스가 아닌 DNS 이름에 대한 서비스에 매핑한다.

Node Port (외부와 연결)

Node Port

  • 외부에서 노드 IP의 특정 포트로 들어오는 요청을 해당 포트와 연결된 정적 포트에서 각 노도의 IP에 서비스를 노출한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: NodePort
  ports:
    - targetPort: 80
      port: 80
      nodePort: 30007
  selector:
    app: my-app
    type: front-app
  • spec.type : 서비스가 어떤 타입인지 나타낸다. (ClientIP, LoadBalancer, NodePort, ExternalName)
  • spec.ports.port : 서비스의 ip에 접근할 때 사용할 포트를 설정한다. (= 서비스가 사용할 포트)
  • spec.ports.targetPort : 서비스가 포워드할 컨테이너 포트이다. (= 연결한 파드의 포트)
  • spec.ports.NodePort : 서비스를 클러스터 외부에 노출한다. 값은 30000에서 32767 사이여야 한다.
  • spec.selector : 서비스가 어떤 라벨을 가지는 파드에 접근할지를 나타낸다.
1
2
3
$ kubectl get services
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-demo-service   NodePort    10.43.189.153   <none>        80:30007/TCP     5s

Cluster IP

Cluster IP

  • 파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 IP다.
  • ClusterIP로 들어온 클러스터 내부 트래픽을 해당 파드의 파드IP:targetPort로 넘겨주도록 동작하므로, 오직 클러스터 내부에서만 접근 가능하게 된다

예시

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
  name: back-end-service
spec:
  type: ClusterIP		    # 생략 가능
  ports:
    - targetPort: 80    # 파드를 노출하는 포트
      port: 80          # 서비스를 노출하는 포트
  selector:             # 이 서비스가 적용될 파드 정보를 지정
    app: myapp
    type: back-end
1
2
3
$ kubectl get services
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
back-end-service       ClusterIP   10.43.126.215   <none>        80/TCP           4s
  • 이 서비스는 ClusterIP인 10.43.126.215 또는 서비스 이름(back-end-service)을 사용하여 클러스터의 다른 포드에서 액세스할 수 있다

LoadBalancer

LoadBalancer

  • 외부 IP를 가지고 있는 로드밸런서를 할당한다. 외부 IP를 가지고있어 클러스터 외부에서 접근이 가능하다

예시

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Service
metadata:
  name: my-lb-service
spec:
  selector:
    run: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer

ExternalName

  • ExternalName 유형의 서비스는 일반적인 셀렉터에 대한 서비스가 아닌 DNS 이름에 대한 서비스에 매핑한다.
  • spec.externalName 파라미터를 사용하여 서비스를 지정한다.

예시

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Service
metadata:
  name: kubia-nodeport
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com
This post is licensed under CC BY 4.0 by the author.