Service 란?
Pod는 클러스터 내에서 동적으로 생성되고 삭제될 수 있기 때문에
쿠버네티스 Service는 쿠버네티스 클러스터 내에서 파드들과 안정적으로 다른 클라이언트들과 통신할 수 있도록 사용되는 리소스 입니다.
이제 서비스에 대해 좀 더 자세히 알아보도록 하겠습니다.
Service 생성
서비스는 파드들과 연결되어 클라이언트들과 통신을 하는데, 파드들과 어떻게 연결이 될까요?
이에 필요한 것이 Label Selector 입니다.
레플리카컨트롤러, 디플로이먼트, 파드를 생성을 할 때, Label을 생성을 해주어야
해당 Label을 Service가 보고 연결이 됩니다.
yaml 파일을 보면서 알아보겠습니다.
파드에서 label을 생성을 해주면, 서비스에서 해당 lable을 selector로 지정을 해주면 연결이 됩니다.
ex) --- apiVersion: v1 kind: Pod metadata: name: nginx labels: # Pod 생성 시에 labels 생성 app.kubernetes.io/name: proxy spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80 name: http-web-svc --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: # app.kubernetes.io/name=proxy label에 있는 모든 파드가 해당 서비스에 연결 app.kubernetes.io/name: proxy ports: - name: name-of-service-port protocol: TCP port: 80 targetPort: http-web-svc
서비스에는 여러가지 Type이 있는 이에 대해 알아보겠습니다.
ClusterIP
- 쿠버네티스 Service의 기본 서비스 유형 입니다.
- Service의 Type을 지정하지 않거나, ClusterIP Type으로 지정을 해주어 사용할 수 있습니다.
- 해당 Type으로 서비스를 생성을 하면, 클러스터 내에서만 통신이 가능합니다.
NodePort
- 외부 클라이언트가 클러스터 내의 파드와 접근 할 수 있도록 노드의 특정 포트를 열어주어 통신 할 수 있게 해주는 서비스 입니다.
- 아래 그림과 같이 서비스 Type을 NodePort로 해주면, 파드가 생성된 Worker Node에서 Open된 포트로 외부 클라이언트가 통신 할 수 있습니다.
가볍게 실습으로 알아보겠습니다.
아래와 같이 Pod와 그에 맞는 서비스 yaml을 작성해줍니다.
=>nginx.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels: app.kubernetes.io/name: proxy spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80 name: http-web-svc --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app.kubernetes.io/name: proxy type: NodePort # 서비스 Type을 NodePort로 설정 ports: - name: name-of-service-port protocol: TCP port: 80 targetPort: http-web-svc
해당 yaml 파일로 Pod와 서비스를 생성 해주면 아래와 같이 생성됩니다.
node4에 Pod가 생성이 되었고, NodePort는 32033 입니다.
이제 정상적으로 서비스와 파드가 연결이 된 것을 확인하려면,
URL에 <node4의 IP>:<생성된 NodePort>로 검색을 해보면 됩니다.
LoadBalancer
- 외부 로드 밸런서를 통해 애플리케이션에 접근할 수 있도록 해줍니다.
- Public Provider (AWS, GCP, Azure 등)에서는 Service의 Type을 LoadBalancer 지정만 하면 자동으로 생성이 됩니다.
- 다만, 온프레미스에서 구성한 k8s 클러스터에서는 metallb와 같은 추가적인 솔루션을 구성해야 사용할 수 있습니다.
- 외부 클라이언트는 LoadBalancer 가 생성해주는 Externel-IP로 접속하면, 서비스와 연결된 파드로 연결해줍니다.
ExternalName
- ExternalName Type의 서비스는 클러스터 내부에서 외부의 DNS로 직접 연결 할 수 있도록 해주는 서비스 유형 입니다.
- 외부에서 사용되는 서비스를 클러스터 내에서도 쉽게 접근 할 수 있게 해주는 역할을 합니다.
예를 들어, db.example.com이라는 도메인이 외부에 있고
해당 도메인으로 요청을 클러스터 내부에서 바로 사용할 수 있게 설정 해주는 것이 ExternalName 타입의 서비스 입니다.아래 yaml 파일의 내용대로 Service를 생성 하면, 클러스터 내의 애플리케이션이 db-service로 접근을 하면 자동으로 db.example.com 으로 연결이 되는 것 입니다.
apiVersion: v1 kind: Service metadata: name: db-service spec: type: ExternalName externalName: db.example.com
이상 입니다.
'쿠버네티스 > 이론' 카테고리의 다른 글
쿠버네티스 Volume 이란? (0) | 2024.11.11 |
---|---|
쿠버네티스 Ingress 란? (0) | 2024.11.04 |
쿠버네티스 Job 리소스 란? (0) | 2024.10.31 |
쿠버네티스 라이브니스 프로브, 데몬셋 이란? (0) | 2024.07.18 |
쿠버네티스 클러스터 구조 알아보기 (0) | 2024.04.10 |