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 (외부와 연결)
- 외부에서 노드 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
- 파드들이 클러스터 내부의 다른 리소스들과 통신할 수 있도록 해주는 가상의 클러스터 전용 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
- 외부 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.