개발놀이터

AWS EKS 스프링 프로젝트에 NGINX 붙이기 본문

배포/kubernetes

AWS EKS 스프링 프로젝트에 NGINX 붙이기

마늘냄새폴폴 2024. 10. 1. 00:28

이번 포스팅은 이전 포스팅과 어느정도 이어집니다. 이전에 스프링 프로젝트를 간단하게 배포했는데 저는 추후 HTTPS를 붙여서 실제 도메인을 붙여볼 예정이기 때문에 Nginx에 스프링 프로젝트를 붙여야했습니다. 

 

이번 포스팅에선 Nginx를 붙이기만 하고 다음 포스팅에선 HTTPS를 적용해보겠습니다. 

 

바로 시작해보겠습니다!

 

스프링에 Nginx 붙이기

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/aws/deploy.yaml

 

우선 Ingress Controller를 설치해줍니다. 

 

위의 명령어를 쓰면 namespace, Service Account, Role, RoleBinding, ClusterRole, ClusterRoleBinding, configmap, controller service, controller deploy 이렇게 모든 것들을 전부 배포해줍니다. 

 

그리고 서비스를 확인해보면

 

 

이렇게 NLB가 만들어집니다. 

 

이 상태에서 EXTERNAL-IP에 적힌 것을 그대로 복사해서 검색창에 넣으면 Nginx창이 뜨지만 아직 Nginx를 배포하지도 않았고 서비스로 연결하지도 않아서 그냥 404페이지가 뜹니다. 

 

이제 한번 연결해보겠습니다. 

 

server {
    listen 80;
    server_name a35a928c5918d4f46ad7a6206e6fffaa-b98369e8eaa8a657.elb.ap-northeast-2.amazonaws.com;
    server_tokens off;

    location / {
        proxy_pass http://spring-svc.was.svc.cluster.local:8080;
    }
}

 

우선 이건 제가 만든 default.conf 파일입니다. 우리의 Nginx conf 파일이 되어줄겁니다. 

 

server_name에는 NLB의 external IP를 적어주고 proxy_pass에는 headless service의 도메인을 적어주면 됩니다. 추후 만들것이니 일단 넘어가죠!

 

이제 이걸 ConfigMap으로 추출할겁니다. 

 

kubectl create configmap nginx-conf --from-file=default.conf -o yaml

 

제가 만든 default.conf를 ConfigMap으로 추출해서 생성했습니다. 저는 일단 yaml 파일로 ConfigMap도 가지고 있으려고 따로 추출했습니다. 

 

그리고 간단하게 서비스도 만들어주고

apiVersion: v1
kind: Service
metadata:
  namespace: ingress-nginx
  name: nginx-svc
spec:
  ports:
  - name: nginx-port
    port: 80
    targetPort: 80
  selector:
    app: nginx

 

저는 서비스를 ClusterIP로 만들었습니다. 왜냐하면 클러스터 내부 (Ingress) 에서 접근할 것이기 때문이죠. 

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: ingress-nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      volumes:
      - name: nginx-storage
        configMap:
          name: nginx-conf
          items:
          - key: default.conf
            path: custom-default.conf
      containers:
      - name: nginx-container
        image: nginx
        ports:
          - containerPort: 80
        volumeMounts:
        - name: nginx-storage
          mountPath: /etc/nginx/conf.d
          readOnly: true

 

이건 Nginx Deployment입니다. 여기서 주의해야 하는 점은 볼륨 마운트인데 우선 volumes에 들어있는 configMap 속성에서 items를 주목해서 봐야합니다. 

 

key에 해당하는 것은 아래의 명령어로 확인할 수 있습니다. 

 

 

밑줄친 저부분이 key에 해당합니다. 그리고 path부분은 우리가 원하는 이름으로 정해주면 됩니다. 

 

volumeMounts에선 /etc/nginx/conf.d 바로 하위에 우리의 conf파일을 두겠다고 선언하면 됩니다. 

 

이렇게 하면 준비 끝! Deployment를 배포해봅시다!

 

kubectl apply -f ./nginx-deployment.yml

 

 

잘 배포가 됐습니다. 

 

혹시 우리가 만든 custom-default.conf를 직접 확인하고 싶다면 직접

 

파드 안으로 들어가서 확인해보시면 됩니다. 명령어는 아래와 같습니다. 

kubectl exec -it -n {네임스페이스명} {파드명} -- /bin/bash

 

 

이제 마지막 단계로 Ingress를 만들어주면 됩니다. Ingress를 만들면 우리가 이미 배포한 Ingress Controller를 알아서 찾아가기 때문에 별다른 설정 없이도 Ingress Controller와 연결할 수 있습니다. 

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  namespace: ingress-nginx 
  annotations:
    kubernetes.io/ingress.class: "nginx" # 사용할 Ingress Controller
spec:
  rules:
  - host: a35a928c5918d4f46ad7a6206e6fffaa-b98369e8eaa8a657.elb.ap-northeast-2.amazonaws.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nginx-svc
              port:
                number: 80

 

우선은 host에 도메인을 입력하지 않고 external IP를 주었습니다. 이 것은 추후에 도메인으로 바뀔 예정입니다. 우선은 넘어가도록 하죠. 

 

그리고 Ingress를 배포해보면?

 

kubectl apply -f ./ingress.yml

 

 

이렇게 잘 생성된 것을 확인할 수 있습니다. 

 

이 상태에서 이제 이전 포스팅에서 만들었던 API를 호출해보겠습니다. 

 

잘 호출되네요! 

 

마치며

Nginx를 붙이고 HTTPS까지 진행하는 것은 시간관계상 그리고 포스팅 분량상 어쩔 수 없이 여기서 마무리 짓도록 하겠습니다. 점점 진도가 나가는 것이 끝이 보이는 것 같네요! 

 

이렇게 오늘도 조금씩 성장했습니다! 내일도 화이팅하기를 바라면서 오늘은 여기서 마무리짓도록 하겠습니다. 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요!

'배포 > kubernetes' 카테고리의 다른 글

AWS EKS HPA로 확장성 높이기  (1) 2024.10.08
AWS EKS 스프링 + Nginx + SSL  (0) 2024.10.05
AWS EKS PV로 EBS볼륨 바운드하기  (0) 2024.09.27
AWS EKS로 스프링 프로젝트 배포하기  (0) 2024.09.26
AWS EKS Cluster 구축  (1) 2024.09.25