1. 서비스가 지정하는 포트 설정
nodeport 설정 yaml을 예시로 보겠다.
//nodeport-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nodeport-service
spec:
type: NodePort
selector:
app: nginx-for-svc
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30000
위와 같은 yaml에서도보듯 서비스를 생성하는 설정 파일을 보면 위와 같이(port, targetPort, nodePort) 3개의 포트 정보를 설정하게 된다.
Nodeport는 클러스터 외부에서 클러스터 내부로 접근이 가능하도록 서비스는 트래픽을 중개하는 역할을 하는 서비스 타입이다.
1. "30000"번으로 설정된 "nodePort"는 외부에서 Node로 접근이 가능하게 하기 위해 사용하는 포트
2. "port"는 외부에서 들어온 트래픽을 서비스를 통해 내부 클러스터의 "80 port"를 통해 전달
3. 그 후 서비스는 "targetPort"로 설정한 클러스터 내부의 컨테이너에게 "8080 port"로 요청을 전달
* 서비스가 바라보고 있는 파드들은 서비스의 selector를 통해 연결된 파드라고 가정
2. 컨테이너가 사용하는 포트 설정
// pods-sample.yaml
apiVersion: v1
kind: Pod
metadata:
name: simple-pod
labels:
app: nginx-for-service
spec:
containers:
- name: simple-pod
image: nginx
ports:
- containerPort: 80
위의 yaml 파일은 파드를 구동시키기 위한 설정을 담고 있다
파드를 실행할 때 어떤 스펙의 컨테이너를 실행시킬지 spec.containers[] 부분에 설정을 진행하는데,
이 중 "spec.containers[].ports[].containerPort"에서 설정한 부분이 컨테이너에서 listen하고 있는 포트가 된다.
서비스에서 지정한 targetPort와 컨테이너에서 사용하는 ContainerPort가 일치하지 않는다면, 서비스는 해당 컨테이너로 트래픽을 전달할 수 없기에 요청을 보내도 오류가 발생하게 된다.
3. 고려할 점
ClusterIP 타입의 서비스를 사용하는 경우에는 외부에서 트래픽을 받을 수 없기 때문에 Nodeport를 사용하지 않는다.
(그래서 클러스터 아이피 타입의 pods들이 외부와 통신하기 위해선 LB 종류나 Proxy(리버스), ingress 등이 필요하다.)
'Kubernetes' 카테고리의 다른 글
Ingress (1) | 2023.11.30 |
---|---|
테스트용 Nginx 띄우기 (0) | 2023.11.03 |
파드의 동작 보증 기능 (0) | 2023.03.27 |
Liveness Probe / Readiness probe 공부 (0) | 2023.03.23 |
[Project] 최종 kubernetes yaml (0) | 2023.03.15 |