본문 바로가기

혼자하는 프로젝트/Hyper-V_쿠버네티스_서비스

노드포트(nodeport)를 활용한 nginx 웹서버 구현

- 클라우드 환경에서는 클라우드 환경의 loadbalancer를 통해 서비스들의 부하분산 구현이 가능하다.
- 단일환경 및 로컬환경에서는 loadbalancer구현이 쉽지 않으므로, nodeport를 통해 서비스를 구현해 보자.
- 노드포트를 통해 연결된 서비스가 3개라면 로드밸런싱이 자동으로 구현된다.

노드포트란?

NodePort 서비스는 Service를 만들어 외부에서 접속 가능한 Port 번호를 지정하여 서비스를 연결하고, 내부의 Pod은 Label Selector로 port를 지정, Target Port 번호를 정의하는 것이다.

말이좀 어려운데 잘 정리된 그림이 있어서 참조하며 설명 하겠다.

한마디로 외부에서 접근 가능한 port를 지정해주어 서비스를 가능하게 해주겠다는 이야기이다.
pod 자체는 ip를 가지고 있으나, 서비스를 직접적으로 해주지 못하므로 서비스라는 존재가 필요하다. 그 서비스를 연결하는 port를 지정하여 pod의 서비스를 하겠다는 의미이다. 아래의 그림이 잘 설명되어 있다.

그렇다면, 서비스는 무엇인가?

Service란, Pod의 논리적 집합이며 접근방법을 정의해놓은 것을 말한다. Service는 Label Selector 통해 정의가 가능하다.
각 Pod의 IP로는 외부에서 접근이 불가능하지만, 서비스를 활용하면 가능하다.

Service.yaml에서 어떤 방식으로 외부에 노출시킬지에 대한 type에는 여러 종류가 있다.

  • ClusterIP (default) - 클러스터 내부에서만 접근 가능한 IP. 
  • NodePort - Port번호를 통해 외부에서 접근. (NAT 컨셉)
  • Load Balancer - 외부의 Load Balancer를 사용하는 방법.(AWS, GCP 등)
  • ExternalName - kube-dns 컴포넌트로 DNS를 이용하는 방법.

# Hyper-V 에서 Nodeport를 통해 nginx 웹서버3개를 구현을 해보자.

1. 환경 설명

- kubectl get nodes 를 통해 현재 마스터 노드와 워커노드를 확인한다.
- 마스터 노드와 워커노드 2개가 확인이 되었다.

k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl get nodes
NAME                              STATUS   ROLES                  AGE   VERSION
k8smasternode-virtual-machine     Ready    control-plane,master   37h   v1.22.3
k8sworkernode01-virtual-machine   Ready    <none>                 36h   v1.22.3
k8sworkernode02-virtual-machine   Ready    <none>                 36h   v1.22.3

2. yaml 파일 생성

- nginx 서비스를 구현할 yaml 파일을 생성한다.
- 마스터 노드에서 yaml 이라는 폴더를 생성 후 nginx-deployment.yaml 파일을 생성하여 정의하자.

mkdir yaml
cd yaml
vi vi nginx-deployment.yaml

- yaml 파일 코드

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-01
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

3. 생성한 yaml 파일을 실행하자

kubectl apply -f nginx-deployment.yaml

- 정상실행 확인 : 3개의 pod가 정상적으로 Running 상태 된것을 확인 할 수 있다.

k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment-01 created

k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl get pod
NAME                                   READY   STATUS    RESTARTS      AGE
jenkins-7ffb988b7-mw9rp                1/1     Running   1 (40m ago)   31h
nginx-deployment-01-66b6c48dd5-f6858   1/1     Running   0             31s
nginx-deployment-01-66b6c48dd5-gx4wp   1/1     Running   0             31s
nginx-deployment-01-66b6c48dd5-xqxs8   1/1     Running   0             31s

4. Nodeport 를 통해 외부로 expose를 해보자.

kubectl expose deployment/nginx-deployment-01 --type="NodePort" --port 9090 --target-port=80 --protocol="TCP"

- 서비스 확인

k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl expose deployment/nginx-deployment-01 --type="NodePort" --port 9090 --target-port=80 --protocol="TCP"
service/nginx-deployment-01 exposed
k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl get svc
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
jenkins-svc           LoadBalancer   10.96.254.189   <pending>     8080:30285/TCP   31h
kubernetes            ClusterIP      10.96.0.1       <none>        443/TCP          37h
nginx-deployment      NodePort       10.99.161.15    <none>        8080:31938/TCP   42m
nginx-deployment-01   NodePort       10.100.95.42    <none>        9090:30827/TCP   4m56s

- 자세한 서비스 정보 확인

k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl describe services/nginx-deployment-01
Name:                     nginx-deployment-01
Namespace:                default
Labels:                   app=nginx
Annotations:              <none>
Selector:                 app=nginx
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.100.95.42
IPs:                      10.100.95.42
Port:                     <unset>  9090/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30827/TCP
Endpoints:                10.244.1.2:80,10.244.1.3:80,10.244.1.4:80 + 3 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

5. nginx 접속하기

- nginx웹서버 접속을 위해서는 각 node들의 ip확인이 필요하다.
- 노드의 ip는 105번과 254번으로 확인이 된다.

k8s-master-node@k8smasternode-Virtual-Machine:~/yaml$ kubectl get nodes -o wide
NAME                              STATUS   ROLES                  AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
k8smasternode-virtual-machine     Ready    control-plane,master   37h   v1.22.3   192.168.137.50    <none>        Ubuntu 20.04.3 LTS   5.11.0-38-generic   docker://20.10.7
k8sworkernode01-virtual-machine   Ready    <none>                 37h   v1.22.3   192.168.137.105   <none>        Ubuntu 20.04.3 LTS   5.11.0-38-generic   docker://20.10.7
k8sworkernode02-virtual-machine   Ready    <none>                 37h   v1.22.3   192.168.137.254   <none>        Ubuntu 20.04.3 LTS   5.11.0-38-generic   docker://20.10.7

- 웹브라우저에서 접속을 해보자.
- 위의 describe를 통해 확인한 정보에서 Nodeport는 30827로 확인이 되었다. 그러므로 접속 URL은 Worker Node 1번 : 192.168.137.105:30827 이 되겠고, Worker Node 2번은 192.168.137.254:30827 이 될것이다.

- 접속 테스트 : 2개의 nginx 웹페이지가 정상적으로 뜨는 것을 확인 할 수 있다.

지금까지 Hyper-V 환경에서 쿠버네티스, Nodeport를 활용하여 nginx 웹서버를 구현하는 작업에 대해서 알아보았다.

- 끝 -