나의 공부기록

[Kubernetes] 03. LoadBalancer & Ingress 본문

CS/Kubernetes

[Kubernetes] 03. LoadBalancer & Ingress

나의 개발자 2025. 4. 14. 18:11

Kubernetes Service

LoadBalancer 타입

  • 각 클러스터 관리자의 도움이 필요한 서비스 타입
  • EKS 같은 클라우드 서비스 제공자의 경우, Service 타입을 LoadBalancer로 명시하기만 해도 이미 기능이 구현되어 있기 때문에, 자동으로 LoadBalancer(LB)가 생성됨
    ➡️ AWS의 EKS에서 Service 타입을 LoadBalancer로 생성하면 실제 NLB나 Classic LoadBalancer(=기본값)가 생성
  • 근데, 우리는 온프레미스에 클러스터를 구축했기 때문에, 그 기능이 존재하지 않음
    ➡️ Bare-metal 환경에 직접 구축했기 때문에, metalLB라는 애드온을 추가하여 로드밸런생 기능을 구현해야 함
더보기

01. metalLB 설치 페이지

metalLB 설치 사이트

02. metalLB 다운로드

  • 나중에 클러스터 재구축 시, 사용할 수 있으므로 wget으로 다운로
root@master-250410:~# wget https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml

 

03. metallb 설치

root@master-250410:~# kubectl apply -f metallb-native.yaml
  • 설치된 네임스페이스 : metallb-system

 

  • speaker의 역할 = LB에 부여된 IP를 외부 대역에 알려주는 역할
  • 서비스 타입을 LoadBalancer로 하여 LB를 생성하면, 211.183.3.0/24 대역의 IP를 갖는 리소스가 하나 생성됨
    ➡️ 실제 네트워크인 211.183.3.0/24대역의 입장에서는 가상의 리소스이며, 인지 불가능
  • 이렇게 부여받은 IP는 211.183.3.0/24 네트워크 입장에서는 알 수 없음
    ➡️ LB에 부여된 IP를 집 외부(=211.183.3.0/24) 대역에 알려줘야 함 = Speaker의 역할
    👉 Ex) LB를 생성해서 211.183.3.200이라는 IP를 부여할거니까 211.183.3.0/24대역도 그렇게 알아!
root@master-250410:~# kubectl get pod -n metallb-system 
NAME                         READY   STATUS    RESTARTS   AGE
controller-7dcb87658-sj75c   1/1     Running   0          98s
speaker-5h4z5                1/1     Running   0          98s
speaker-vj8gn                1/1     Running   0          98s
speaker-zrvf9                1/1     Running   0          98s

 

 04. config 파일 설정

  • config 파일 참고 서식
  • IPAddressPool : LB를 생성했을 때, 부여받을 IP 대역 정의
  • L2Advertisement :  LB에 특정한 IP가 부여됐다는 사실을 다른 네트워크 구성원들에게 알려주는 역할(speaker라는 pod가 정상 동작)
root@master-250410:~/mani/250414# vi config-metal.yml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 211.183.3.200-211.183.3.240 # 대역이 겹치지 않게 수정
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system

 

05. manifest file 반영 - config-metal 설정 파일 적용

root@master-250410:~/mani/250414# kubectl apply -f config-metal.yml
ipaddresspool.metallb.io/first-pool created
l2advertisement.metallb.io/example created

 

06. manifest file 생성 - LoadBalancer 생성 

root@master-250410:~/mani# cp hw1.yml lbtest.yml
root@master-250410:~/mani# vi lbtest.yml 

apiVersion: v1
kind: Namespace
metadata:
  name: ip-ns
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ip-dep
  namespace: ip-ns
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myipnginx
  template:
    metadata:
      labels:
        app: myipnginx
    spec:
      containers:
      - name: ip-con
        image: oolralra/ipnginx
---
apiVersion: v1
kind: Service
metadata:
  name: svc-ipnginx
  namespace: ip-ns
spec:
  selector:
    app: myipnginx
  type: LoadBalancer # ✅ edit : NodePort -> LoadBalancer 
  ports: 
  - port: 80 # ✅ edit : NodePort 삭제
    targetPort: 80

 

  • ✅ config-metal.yml에서 정의한 IP대역에서 IP를 부여받았는지 확인

 

07. 외부 IP로 접속 가능 확인

 

실습 - 01

문제

https://github.com/oolralra/simple_jar #이미 빌드가 되어있는 springboot 앱.
8085 포트 사용
211.183.3.150~160정도의 IP로 접속했을 때, 위 앱이 뜨도록 한번 만들어보세요.
ns : spring-ns
svc: svc-spring
pod의 label => app: spring

컨테이너 레지스트리는 제꺼 써도 괜찮고 도커허브 쓰셔도 됩니다.

풀이

더보기

0. 소스코드 다운로드

root@master-250410:~/mani/250414/exam01# git clone https://github.com/oolralra/simple_jar.git

 

1. Dockerfile 생성

root@master-250410:~/mani/250414/exam01/simple_jar# vi Dockerfile 

FROM openjdk:8-jre-alpine
WORKDIR /app
COPY ./springbootApp.jar /app/myapp.jar
CMD ["java","-jar","/app/myapp.jar"]

 

2. 이미지 빌드

  • docker push 전에 테스트 용
root@master-250410:~/mani/250414/exam01/simple_jar# docker build -t etoile0320/simple:5 .

 

3.  이미지 실행

root@master-250410:~/mani/250414/exam01/simple_jar# docker run -dp 8085:8085 --name simple etoile0320/simple:5

 

4. 이미지 정상 확인

 

5. Docker Hub에 Push

5-1. docker 이미지 확인

root@master-250410:~/mani/250414/exam01/simple_jar# docker image ls
REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
etoile0320/simple      5         55bd8f829758   3 minutes ago    106MB
etoile0320/simple      4         cced63971271   10 minutes ago   126MB
etoile0320/simple      3         bf59e2841f13   10 minutes ago   126MB
etoile0320/simple      2         162d882fecf2   16 minutes ago   526MB
etoile0320/simple      1         00c20af94bff   25 minutes ago   526MB
61.254.18.30:5000/bo   1         3b301fa6937e   3 days ago       47.9MB
etoile0320/mynginx     1         3b301fa6937e   3 days ago       47.9MB
mynginx                1         3b301fa6937e   3 days ago       47.9MB
oolralra/ipnginx       latest    788e26c8647a   5 years ago      127MB

 

5-2. 이미지 push

root@master-250410:~/mani/250414/exam01/simple_jar# docker tag etoile0320/simple:5 etoile0320/simple:1

root@master-250410:~/mani/250414/exam01/simple_jar# docker push etoile0320/simple:1
The push refers to repository [docker.io/etoile0320/simple]
53b5e98fd6f6: Pushed 
c15fdb7a75f6: Pushed 
edd61588d126: Mounted from library/openjdk 
9b9b7f3d56a0: Mounted from library/openjdk 
f1b5933fe4b5: Mounted from library/openjdk 
1: digest: sha256:aa75b8aa3f804d6bde66e4ef6d7016b7713f14616dc809a8d84bab6241ece005 size: 1366

 

5-3. Docker Hub에 업로드된 이미지 확인

 

6. LB 대역 설정

6-1. config-metal.yml 수정

root@master-250410:~/mani/250414# vi config-metal.yml 

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 211.183.3.150-211.183.3.160 # 대역이 겹치지 않게 수정
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system

 

6-2. config-metal.yml 반영

 

7. manifest file 수정 

  • targetPort를 실제 앱이 동작하는 포트인 8085로 해주는 것이 제일 중요❗
  • LB를 생성하면 service의 포트(port)인 80을 따라감
root@master-250410:~/mani/250414/exam01# vi lb.yml 

apiVersion: v1
kind: Namespace
metadata:
  name: spring-ns
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-dep
  namespace: spring-ns
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring
  template:
    metadata:
      labels:
        app: spring
    spec:
      containers:
      - name: spring-con
        image: etoile0320/simple:1
---
apiVersion: v1
kind: Service
metadata:
  name: svc-spring
  namespace: spring-ns
spec:
  selector:
    app: spring
  type: LoadBalancer
  ports: 
  - port: 80
    targetPort: 8085 # 포트 번호 주의❗

 

8. manifest file 반영 - LoadBalancer, Service, Namespace, Pod 등... 생성 

root@master-250410:~/mani/250414/exam01# kubectl apply -f lb.yml 
namespace/spring-ns created
deployment.apps/spring-dep created
service/svc-spring created

 

9. LB - 외부 대역 IP 부여 확인

root@master-250410:~/mani/250414/exam01# kubectl get svc -n spring-ns
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)        AGE
svc-spring   LoadBalancer   10.107.204.149   211.183.3.150   80:32458/TCP   13s
  • Pod 정상 작동 확인

 

 10. LB 접속 확인

 

✅ 실습 정리

  • 쿠버네티스 클러스터에서 Advertisement를 통해 적극적으로 metalLB가  쓰는 IP를 알려줬기 때문에
    ➡️ 다른 노트북이나 네트워크 구성원들이 IP를 인지할 수 있음


ExternalName 서비스

  • 생략 ➡️ 호스트네임을 다루지는 않을거라 따로 정리❌

➕ 모놀리식(Monolithic) VS 마이크로서비스(Micro-Service)

  • 여러 개의 컨테이너에 각 기능들을 구현하여 path로 라우팅이 가능해야 함
  • 일반적인 svc로는 path기반 라우팅이 불가능
     ➡️ path 기반 라우팅을 지원하는 것이 Ingress 서비스
  • 프로그램 언어를 나누어도 동일한 DB를 사용 ➡️ Micro-Service라고 할 수 없

  • 위의 내용처럼 개념과 공부 흐름을 알고 있어야 함
  • 현재는 컨테이너 가상화를 공부하고 있으며, Kubernetes는 컨테이너 가상화임

🌟Ingress - path 기반 라우팅이 가능한 리소스

일반적인 LB로 구성

  • 만약 위 마이크로 서비스를 일반적인 Load Balancer로 구현한다고 하면,  위와 같은 한계가 발생
    ➡️ 서비스는 한 종류의 label만 품을 수 있기 때문에

  • 여러 개의 서비스를 하나로 품을 수 있는 무언가 = Ingress
    ➡️ Ingress Controller가 필요❗
  • 되도록이면 Ingress Controller를 설치할 때, metalLB를 먼저 구성해 주는 것이 좋음
더보기

1. Ingress Controller 설치

 1-1. ingress-controller 배포 경로 다운로드

root@master-250410:~/mani/ingress# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.1/deploy/static/provider/baremetal/deploy.yaml

 

1-2. ingress-controller 매니페스트 파일 수정

root@master-250410:~/mani/ingress# vi deploy.yaml

365   type: LoadBalancer # NodePort ➡️ LoadBalancer 수정

 

 

1-3. Ingress-Controller 설치

  • ingress-nginx라는 네임스페이스에 기능이 설치됨
root@master-250410:~/mani/ingress# kubectl apply -f deploy.yaml

 

1-4. Ingress-Controller 설치  확인

root@master-250410:~/mani/ingress# kubectl get pod -n ingress-nginx 
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-bk9fz        0/1     Completed   0          89s
ingress-nginx-admission-patch-d7wtb         0/1     Completed   0          89s
ingress-nginx-controller-59f798c8dd-hg4q7   1/1     Running     0          89s 
# ✅controller만 1/1(정상)이면 됨

 

1-5. Ingress-Controller 접속 주소 확인

  • Ingress-Controller의 Service 타입을 LoadBalancer로 했기 때문에 IP를 하나 부여받아야 함

 

2. headless 서비스 생성

2-1. headless 서비스의 manifest file 생성

  • ❗나중에 ingress를 구성할 때, 서비스의 이름으로 찾아갈 것이기 때문에, svc의 이름(svc-ip)을 기억해야 함
root@master-250410:~/mani/ingress# vi ip.yml

apiVersion: v1
kind: Service
metadata:
  name: svc-ip
spec:
  selector:
    app: ipnginx
  ports:
  - port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ip-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ipnginx
  template:
    metadata:
      name: ip-pod
      labels:
        app: ipnginx
    spec:
      containers:
      - name: ip-con
        image: 61.254.18.30:5000/ipnginx

 

2-2. headless 서비스 반영(apply)

root@master-250410:~/mani/ingress# kubectl apply -f ip.yml 
service/svc-ip created
deployment.apps/ip-dep created

 

2-3.  서비스 작동 확인 - ENDPoint에 Pod가 존재하는 것을 확인

root@master-250410:~/mani/ingress# kubectl describe svc svc-ip

 

2-4. Pod 정상 작동 확인

  • Service와 Pod에 문제없는 것을 확인
    ➡️ Ingress에 문제가 발생해서 트러블슈팅할 때, 용
request_method : GET | ip_dest: 10.244.1.56
root@master-250410:~/mani/ingress# clear
root@master-250410:~/mani/ingress# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP   4d4h
svc-ip       ClusterIP   10.110.130.160   <none>        80/TCP    7m7s

 

3. Ingress 생성

3-1. Ingress의 manifest file 생성

  • annotations : 추가적인 정보 ➡️ Labels와 비슷하지만 주로 부가적인 기능 명시
    • ingress controller ➡️ nginx
    • rewrite-target: /
      ➡️ path(/httpd) 통해서 해당 앱으로 접근하면 경로를 '/httpd'이 아닌 '/'로 가겠다.
    • host ➡️ 영문 주소 / DNS 기능 필요
    • path: /httpd ➡️ host와 조합하여 rapa.com/httpd로 들어왔을 때를 의미
    • backend: ➡️ Service를 의미
      • service
        • name: svc-ip ➡️ 연결시켜줄 Service 이름
        • port
          • number: 80 ➡️ 연결시켜줄 Service 포
root@master-250410:~/mani/ingress# vi ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: rapa.com
      http:
        paths:
          - path: /httpd
            pathType: Prefix
            backend:
              service:
                name: svc-ip #서비스의 이름
                port:
                  number: 80 #서비스의 포트

 

3-2.  Ingress의 manifest file 적용

root@master-250410:~/mani/ingress# kubectl apply -f ingress.yml 
Warning: annotation "kubernetes.io/ingress.class" is deprecated, please use 'spec.ingressClassName' instead
ingress.networking.k8s.io/ingress created

 

3-3. Ingress 반영 확인

 

3-4. 작은 DNS 설정

  • DNS-Server를 구성하긴 그러니까, rapa.com을 안내해주기 위해 /etc/hosts에 적어줌
root@master-250410:~/mani/ingress# vi /etc/hosts

127.0.0.1 localhost
127.0.1.1 ubuntu-tem

# ✅ kubectl get svc -n ingress-nginx에서 나왔던 주소
# ingress-controller 주소
211.183.3.151 rapa.com

 

 4. ingress - svc - pod 구성 확인

  • rapa.com 주소가 211.183.3.151로 매칭이 되어 있으므

 

 🌟 Ingress 전체 흐름

 

 

실습 - 02

문제

rapa.com/httpd 으로 접속했을 때, 61.254.18.30:5000/ipnginx 이 보이도록 이미 구성되어 있음.
rapa.com/ 으로 접속했을때61.254.18.30:5000/hnginx 이 보이도록 해보세요.

실습

더보기

1. headless 서비스 - manifest file 생성

root@master-250410:~/mani/ingress# cp ip.yml hip.yml
root@master-250410:~/mani/ingress# vi hip.yml 

spec:
  replicas: 3
  selector:
    matchLabels:
      app: hnginx
  template:
    metadata:
      name: hip-pod
      labels:
        app: hnginx
    spec:
      containers:
      - name: hip-con
        image: 61.254.18.30:5000/ipnginx

 

2. headless 서비스 - manifest file 반영(apply)

root@master-250410:~/mani/ingress# kubectl apply -f hip.yml 
service/svc-hip created
deployment.apps/hip-dep created

 

3. 서비스 정상 작동 확인

 

4. 서비스의 트래픽 분산 & Pod 정상 작동 확인

 

5. ingress의 manifest file 수정 - / 경로 라우팅 설정 추가

root@master-250410:~/mani/ingress# vi ingress.yml 

    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: rapa.com
      http:
        paths:
          - path: /httpd
            pathType: Prefix
            backend:
              service:
                name: svc-ip #서비스의 이름
                port:
                  number: 80 #서비스의 포트
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc-hip
                port:
                  number: 80

 

 6. ingress 수정 사항 반영(apply)

root@master-250410:~/mani/ingress# kubectl apply -f ingress.yml 
ingress.networking.k8s.io/ingress configured

 

7. ingress 정상 작동 확인 - rapa.com/

 

🌟 ingress - svc - pod로 이어지는 흐름이 잘 구성된 것을 확인 가능

root@master-250410:~/mani/ingress# kubectl describe ingress ingress
root@master-250410:~/mani/ingress# kubectl describe ingress <ingress명>

➕ 실습 - 02 정리

  • 노트북은 rapa.com을 모르기 때문에 ➡️ rapa.com으로는 노트북에서 접속 ❌
    👉 현재 rapa.com의 IP를 아는 것은 /etc/hosts에 등록해준 master 노드뿐
  • ingress-controller의 svc는 ingress-nginx라는 네임스페이스에 존재하는데, 다른 리소스들은 default 네임스페이스에 존재
    ➡️ 어떻게 트래픽이 인가가 되는가?
    👉 ingress-controller의 IP는 클러스터 외부에 존재하는 IP이기 때문에, ingress와 svc, pod들만 같은 네임스페이스에 존재하면 됨

 

실습 - 03

문제

mario라는 이름의 ingress를 생성하세요.

aws8.com/ 로 접속시 8085 포트로 동작하는 61.254.18.30:5000/pcm/spring:1 , 서비스포트는 8085
aws8.com/h로 접속 시 80 포트로 동작하는 61.254.18.30:5000/hnginx , 서비스포트는 81
aws8.com/ip로 접속 시 80 포트로 동작하는 61.254.18.30:5000/ipnginx , 서비스포트는 81

풀이

  • 로드밸런서 타입의 경우, SVC의 포트를 따라가지만, ingress의 경우에는 그렇지 않음
  • aws8.com/h로 접속하면 특정 서비스의 포트까지 명시하므로, 따로 포트를 명시할 필요❌
더보기

1. Spring

1-1. manifest file 생성

root@master-250410:~/mani/ingress# cp ip.yml spring.yml
root@master-250410:~/mani/ingress# vi spring.yml 

apiVersion: v1
kind: Service
metadata:
  name: svc-spring
spec:
  selector:
    app: spring
  ports:
  - port: 8085
    targetPort: 8085
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring
  template:
    metadata:
      name: spring-pod
      labels:
        app: spring
    spec:
      containers:
      - name: spring-con
        image: 61.254.18.30:5000/pcm/spring:1

 

1-2. manifest file 반영(apply)

root@master-250410:~/mani/ingress# kubectl apply -f spring.yml 
service/svc-spring created
deployment.apps/spring-dep created

 

1-3. pod & svc 작동 확인

 

2. ipnginx

2-1. manifest file 생성

root@master-250410:~/mani/ingress# cp ip.yml ipnginx.yml
root@master-250410:~/mani/ingress# vi ipnginx.yml 

apiVersion: v1
kind: Service
metadata:
  name: svc-ip
spec:
  selector:
    app: ipnginx
  ports:
  - port: 81
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ip-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ipnginx
  template:
    metadata:
      name: ip-pod
      labels:
        app: ipnginx
    spec:
      containers:
      - name: ip-con
        image: 61.254.18.30:5000/ipnginx

 

 2-2. manifest file 반영(apply)

root@master-250410:~/mani/ingress# kubectl apply -f ipnginx.yml 
service/svc-ip created
deployment.apps/ip-dep created

 

2-3. Pod, SVC  작동 확인

 

3. hnginx

3-1. manifest file 생성

root@master-250410:~/mani/ingress# cp ip.yml hnginx.yml
root@master-250410:~/mani/ingress# vi hnginx.yml 

apiVersion: v1
kind: Service
metadata:
  name: svc-hnginx
spec:
  selector:
    app: hnginx
  ports:
  - port: 81
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hnginx-dep
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hnginx
  template:
    metadata:
      name: hnginx-pod
      labels:
        app: hnginx
    spec:
      containers:
      - name: hnginx-con
        image: 61.254.18.30:5000/hnginx

 

 3-2. manifest file 반영(apply)

root@master-250410:~/mani/ingress# kubectl apply -f hnginx.yml 
service/svc-hnginx created
deployment.apps/hnginx-dep created

 

3-3. Pod, SVC 작동 확인 

 

4. Ingress 설정

4-1. manifest file 생성

root@master-250410:~/mani/ingress# vi multi-ingress.yml 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: aws8.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: svc-spring #서비스의 이름
                port:
                  number: 8085 #서비스의 포트
          - path: /h
            pathType: Prefix
            backend:
              service:
                name: svc-hnginx
                port:
                  number: 81
          - path: /ip
            pathType: Prefix
            backend:
              service:
                name: svc-ip
                port:
                  number: 81

 

4-2. manifest file 반영(apply)

  • 경고가 발생한 부분 수정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: multi-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  • 경고가 사라진 것 확인 가능

 

 

4-3. Ingress 정상 작동 확인

 

5. 미니 DNS 설정

root@master-250410:~/mani/ingress# kubectl get svc -n ingress-nginx 
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.102.245.251   211.183.3.151   80:30223/TCP,443:32630/TCP   133m
ingress-nginx-controller-admission   ClusterIP      10.97.1.232      <none>          443/TCP                      133m


root@master-250410:~/mani/ingress# vi /etc/hosts

127.0.0.1 localhost
127.0.1.1 ubuntu-tem

# kubectl get svc -n ingress-nginx에서 나왔던 주소
# ingress-controller 주소
211.183.3.151 aws8.com

 

6. 결과 확인 

6-1. spring

 

6-2. hnginx

6-3. ipnginx