본문 바로가기
kubernetes

[kubernetes] 쿠버네티스(kubernetes) service(NodePort)란

by devjh 2021. 7. 14.
반응형

1. NodePort란

지난 게시글에서 service(clusterIP)에 대해 확인해봤습니다.

ClusterIP를 통해서 어떤 노드(서버)에 있더라도 pod과 pod끼리 통신을 시킬수 있었습니다.

즉 api서버와 db서버를 통신시킬수 있게됐었습니다.

그러나 clusterIP의 특성상 하나의 쿠버네티스 클러스터 안에서만 통신이 가능하다는 단점이 있었습니다.

이제 pod을 외부에 공개시킬 순서입니다.

 

2. deployment를 생성하여 pod를 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myHelloWorld
  template:
    metadata:
      labels:
        app: myHelloWorld
    spec:
      containers:
      - name: myapp
        image: jaeho310/helloworld:1
        ports:
          - containerPort: 8080
            protocol: TCP

deployment 게시글에서 사용한 deployment를 재활용합니다.

 

 

[kubernetes] 쿠버네티스(kubernetes) 디플로이먼트(deployment)란

1. deployment란 deployment가 등장하기 이전 레플리케이션 컨트롤러만 이용하는 경우 컨테이너에 들어가는 애플리케이션의 소스가 변경된경우 다시 레플리케이션 컨트롤러를 새로 만들고 rolling-update

frozenpond.tistory.com

 

3. service(nodePort) 생성

apiVersion: v1
kind: Service
metadata:
  name: mynp
spec:
  type: NodePort # type을 적지않으면 default는 clusterip이므로 꼭 적어줍니다.
  ports:
  - port: 80 # 서비스가 사용할 포트
    targetPort: 8080 #서비스가 포워드할 컨테이너포트
    nodePort: 31212 # 서비스의 노드포트(적지않으면 30000~32768중 자동할당)
  selector:
    app: myHelloWorld # app=MyHelloworld인 모든 pod는 이 서비스에 속한다.

clusterip와 다른점은 type을 nodeport로 해준점(default는 ClusterIP)입니다.

 

nodeport를 설정해주지않으면 3만번대에서 자동 할당하지만 중요한 부분이니 적었습니다.

 

이 서비스를 클러스터에 올리면 외부(웹브라우저)에서 쿠버네티스ip:31212 에 접근하면 pod에 접근할 수 있습니다. 

 

 

4. 동작확인

nodeport를 생성해줍니다.

$ kubectl apply -f mynodeport.yaml 
service/mynp created

service를 확인합니다.

$ kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        3d
mynp         NodePort    10.109.53.237   <none>        80:31212/TCP   8s

type이 nodeport인 resource가 하나 올라와있습니다.

노드포트는 클러스터 ip의 기능을 포함합니다.

이제 쿠버네티스 클러스터에 할당된 ip의 31212포트에 접근하면 pod에 접근할 수 있습니다.

 

$ kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   192.168.49.2:8443                 3d
mynp         172.17.0.2:8080,172.17.0.4:8080   111s

$ minikube service mynp
|-----------|------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT |            URL            |
|-----------|------|-------------|---------------------------|
| default   | mynp |          80 | http://192.168.49.2:31212 |
|-----------|------|-------------|---------------------------|
🏃  mynp 서비스의 터널을 시작하는 중
|-----------|------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT |          URL           |
|-----------|------|-------------|------------------------|
| default   | mynp |             | http://127.0.0.1:58836 |
|-----------|------|-------------|------------------------|
🎉  Opening service default/mynp in default browser...
❗  Because you are using a Docker driver on windows, the terminal needs to be open to run it.

 

kubectl get ep를 입력해 endpoint를 확인하면 쿠버네티스의 ip를 확인할 수 있습니다.

실제로 pc에 랜처, kubeadm등을 이용해 쿠버네티스를 깔았고, 공유기를 열고 포트프록시 설정을 해줬다면 쿠버네티스 ip를 진짜 외부에서 접근할 수 있겠지만

 

예제를 위한 클러스터인 minikube나 wsl2를 사용하고있으므로 웹 브라우저에서 접근하려면 다른 복잡한 방법을 사용해야합니다.

 

대신 minikube에 좋은 명령어가 있습니다.

minikube service [nodeport이름] 

 

해당명령어를 입력하면 192.168.49.2:31212를 자동으로 프록시해서 접근해줍니다.

내 웹 브라우저에서 내 웹 애플리케이션에 성공적으로 접근한것을 확인 할 수 있습니다.

 

 

반응형

댓글