Provisioning, Nginx reverse proxy

Jeonghak Cho·2025년 3월 1일

Provisioning

목록 보기
4/44

Nginx 프로비저닝 할일

  • 볼륨을 준비하여 정적 리소스가 POD 가 삭제되더라고 유지하도록 처리
  • 필수 유틸리티 (curl, vi), 네트워크 확인 도구가 기본 설치된 분석용 이미지를 준비.
  • nginx설정 파일을 컨피그맵에 구성하여 확장 시 동일한 파일을 볼 수 있도록 처리

Nginx 프로비저닝 절차

  • Nginx 이미지 선택 - 최신 nginx 버전 확인
  • sc, pv, pvc 생성하기
  • nginx 볼륨 마운트 deploy 워크로드 생성
  • nginx 서비스 워크로드 생성
  • nginx 디플로이먼트 워크로드 생성

Nginx 프로비저닝 진행

Nginx 이미지 선택 - 최신 nginx 버전 확인

vagrant@slave1:~$ kubectl create deploy nginx --image=nginx
deployment.apps/nginx created

vagrant@slave1:~$ kubectl exec -it $(kubectl get pod -l app=nginx -o jsonpath='{.items[0].metadata.name}') -- nginx -v
nginx version: nginx/1.27.4

vagrant@slave1:~$ kubectl exec -it $(kubectl get pod -l app=nginx -o jsonpath='{.items[0].metadata.name}') -- bash
root@nginx-58bc5fbc45-kpj7r:/# exit

vagrant@slave1:~$ k delete deploy nginx
deployment.apps "nginx" deleted

SC 생성

  • 작성
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
  • 적용

vagrant@slave1:~$ k apply -f nginx-sc.yml
storageclass.storage.k8s.io/local-storage created

vagrant@slave1:~$ k get sc
NAME            PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  3s

PV 생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv1
  labels:
    type: local
spec:
  storageClassName: local-storage
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 500Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data1"
  • 적용
vagrant@slave1:~$ k apply -f nginx-pv.yml
persistentvolume/mypv1 created

vagrant@slave1:~$ k get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS    REASON   AGE
mypv1   500Mi      RWO            Delete           Available           local-storage            6s
mypv2   500Mi      RWO            Delete           Available           local-storage            6s
mypv3   500Mi      RWO            Delete           Available           local-storage            6s

PVC 매니페스트 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi
  • 적용
vagrant@slave1:~$ k apply -f nginx-pvc.yml
persistentvolumeclaim/mypvc created

vagrant@slave1:~$ k get pvc
NAME    STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS    AGE
mypvc   Pending                                      local-storage   3s

서비스 생성

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: nginx    

컨피그맵 생성

nginx.cnf 파일을 포함하는 컨피그맵을 생성한다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx
data:
  nginx.conf: |
    user nginx;
    worker_processes  3;
    error_log  /var/log/nginx/error.log;
    events {
      worker_connections  10240;
    }
    http {
      log_format  main
              'remote_addr:$remote_addr\t'
              'time_local:$time_local\t'
              'method:$request_method\t'
              'uri:$request_uri\t'
              'host:$host\t'
              'status:$status\t'
              'bytes_sent:$body_bytes_sent\t'
              'referer:$http_referer\t'
              'useragent:$http_user_agent\t'
              'forwardedfor:$http_x_forwarded_for\t'
              'request_time:$request_time';
      access_log        /var/log/nginx/access.log main;
      server {
          listen       80;
          server_name  _;
          location / {
              root   /usr/share/nginx/html;
              index  index.html index.htm;
          }
      }
    }

디플로이먼트 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: shared-data
          mountPath: /usr/share/nginx/html
      volumes:
      - name: shared-data
        persistentVolumeClaim:
          claimName: mypvc
            - name: nginx-conf
      - name: nginx-conf      
        configMap:
          name: nginx
          items:
            - key: nginx.conf
              path: nginx.conf
      - name: log
        emptyDir: {}    

Nginx 이미지 분석용 추가 이미지 생성

최초 www 화면 띄우기가 종종 힘들때가 있다. 서비스에서 디플로이먼트 연결이 안되던지, www root 위치를 찾으려고 하는 데 curl이 설치되어 있지 않아 불편할 때가 있다. 이럴 때
curl 이 지원되는 디버깅용 이미지를 설치하면 편리하다.최초에는 아래 처럼 이미지 설치와 동시에 프롬프트를 띄울 수 있다.

vagrant@slave1:~$ kubectl run curl --image=radial/busyboxplus:curl -it
If you don't see a command prompt, try pressing enter.
[ root@curl:/ ]$

이후는 일반 pod 에 접속하듯이 사용할 수 있다.

vagrant@master:~$ k get po
NAME                            READY   STATUS    RESTARTS      AGE
curl                            1/1     Running   4 (60m ago)   39h
nginx-865d44cb48-wvd5w          1/1     Running   0             52m

vagrant@master:~$ k exec -it curl -- sh

내부 DNS 확인

[ root@curl:/ ]$ cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options ndots:5

서비스명을 붙여 서비스를 조회

[ root@curl:/ ]$ curl nginx.default.svc.cluster.local
<H1>hello</H1>

리버스프록시 역할로 벡엔드 api 호출

백엔드 서비스 확인

5000 포트로 접근 시 {"message":"Hello, FastAPI!"} 응답 확인

vagrant@slave1:~$ k get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
myfastapi       NodePort    10.105.125.216   <none>        5000:31217/TCP   3h23m

vagrant@slave1:~$ k exec -it curl -- sh
[ root@curl:/ ]$ curl myfastapi.default.svc.cluster.local:5000/
{"message":"Hello, FastAPI!"}

컨피그맵 구성

localhost/api를 호출했을 경우 backend인 http://myfastapi.default.svc.cluster.local:5000/ 호출하도록 구성

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx
data:
  nginx.conf: |
    user nginx;
    worker_processes  3;
    error_log  /var/log/nginx/error.log;
    events {
      worker_connections  10240;
    }
    http {
      server {
          listen       80;
          server_name  _;
          location / {
              root   /usr/share/nginx/html;
              index  index.html index.htm;
          }

          location /api {
              rewrite /api/(.*) /$1 break;
              proxy_pass http://myfastapi.default.svc.cluster.local:5000/;
              proxy_http_version 1.1;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "Upgrade";
              proxy_set_header Host $host;
          }
      }
    }

리버스 프록시 연결 확인

nginx 의 서비스 주소로 접근하여 /api 엔드포인트를 호출하면 벡엔드 api 호출하는 것을 확인

vagrant@slave1:~$ k exec -it curl -- sh
[ root@curl:/ ]$ curl nginx.default.svc.cluster.local/api
{"message":"Hello, FastAPI!"}

0개의 댓글