쿠버네티스 서비스

greenTea·2023년 8월 25일
0

쿠버네티스 서비스

😎쿠버네티스는 컨테이너화된 애플리케이션을 대규모로 관리하고 배포하는 오픈소스 플랫폼입니다. 이 플랫폼에서, 서비스는 파드 간의 통신을 가능하게 하는 핵심 컴포넌트 중 하나입니다.

서비스란?

🤓쿠버네티스 서비스는 특정 파드 그룹에 대한 네트워크 트래픽을 라우팅하는 추상화 된 객체입니다. 예를 들어서 3개의 pod를 띄웠다고 가정하겠습니다. 이 경우 3개의 pod는 각자 ip를 가지게 됩니다. 그런데 만약 pod의 개수를 늘리고 줄일 경우에는 해당 pod들의 ip가 변경되게 되는데 파드는 비영구적인 리소스이기 때문입니다.

서비스를 사용할 경우 서비스 ip를 통해서 pod들의 ip에 상관없이 접속하는 것이 가능하게 됩니다.(서비스는 ip를 직접 커스텀할 수 있기에 고유한 ip를 가진다고 볼 수 있습니다.)

서비스의 주요 유형

ClusterIP

apiVersion: v1
kind: Service
metadata:
  name: test-cluster
  labels:
    app: new-cluster
spec:
  type: ClusterIP
  clusterIP: 10.0.0.100
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

😓위 yaml 파일에서 spec.type을 통해 서비스의 유형을 선택할 수 있으며 selector를 통해 pod들을 선택할 수 있습니다.
clusterIP: 10.0.0.100를 통해 직접 ip를 설정할 수 있습니다.(vpc로 이해하시면 됩니다.)
위 파일은 ClusterIp type으로 생성하였으며 labelapp:my-app 을 가진 pod를 대상으로 합니다.
port의 경우 protocoltcp를 사용하며 이 때 서비스의 80포트로 요청하면 해당 pod8080포트로 요청을 하게 됩니다.

ClusterIP 서비스클러스터 내에서만 사용가능한 서비스입니다.(외부 접속 안됨)

NodePort

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
    nodePort: 30080  # 원하는 포트 번호로 설정 (30000-32767 범위 내)

🤨클러스터의 각 노드의 특정 포트에 서비스를 노출시키며, 외부에서 해당 포트를 통해 서비스에 접근할 수 있습니다.
clusterIp의 특징과 함께 각 노드별로 위에서 설정한 nodePort: 30080를 open하게 됩니다.
그래서 만약 공인 ip가 있다면 공인ip:30080에서도 접속이 가능하게 됩니다.(같은 vpc라면 내부 ip로도 가능)
이때 nodePort30000-32767범위에서 선택이 가능합니다.

LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
  type: LoadBalancer

😑바로 사용할 수 있는 것은 아니며 gcpaws등에서 지원하는 로드밸런서를 이용해야 사용이 가능합니다.(gke, eks 등등)
로드밸런서를 생성한 후에 해당 ip를 위 yaml파일에 등록하시면 됩니다.

ExternalName

apiVersion: v1
kind: Service
metadata: 
  name: go
spec:
  type: ExternalName 
  externalName: google.com

🤗도메인이름으로 연결하는 서비스입니다.

spec.externalName은 연결하려는 외부 도메인을 의미합니다.
이후 pod를 하나 생성하고 들어간 다음 curl go.default.svc.cluster.local을 실행하면 구글로 요청하는 것을 확인 할 수 있습니다.

go.default.svc.cluster.local

  • go: 이것은 서비스의 이름입니다. 이 경우, externalname1이라는 이름의 서비스를 나타냅니다.
  • default: 네임스페이스를 의미합니다.
  • svc: service의 줄임말입니다.
  • cluster.local: 클러스터 내부에서만 접근 가능한 기본 도메인 이름을 나타냅니다.

위와 같은 규칙을 가지는 Domain Name을 FQDN라고 합니다.

이 때 같은 네임스페이스인 경우 curl go로도 요청이 가능합니다.

HeadlessService

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: ClusterIP
  clusterIP: None
  selector:
    app: hello
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

🤔type을 ClusterIp로 지정하고 명시적으로 clusterIP: None을 지정할 경우 HeadlessService가 됩니다.
기존 clusterIp service와는 달리 생성후에도 ip가 지정이 되지 않는데 이 때 selector를 통해 해당 파드들을 선택하게 됩니다.
이 후 위 ExternalName에서 알아본 FQDN형태의 도메인 네임으로 요청을 하면 됩니다.
curl my-service.default.svc.cluster.local

결론

🥳서비스를 통해 pod의 상관없이 요청을 할 수 있다는 점이 흥미로웠습니다. 이를 이용한다면 보다 더 안정적인 서비스를 운영 할 수 있을 것 같네요.

profile
greenTea입니다.

0개의 댓글