본문 바로가기
Server/Nginx

[NCP] Nginx를 이용한 Static Resource Container service 구축기(2)

by JunHeeLim 2023. 11. 13.

nginx 설정에 대해 지난 정리하는 글에서 이어집니다!

https://dev-junhee.tistory.com/69

 

[NCP] Nginx를 이용한 Static Resource Container service 구축기(1)

Naver Cloud Platform에 몇가지 기능의 부재로 프론트 소스 도메인 서비스를 위해 nginx를 통한 정적 리소스 서버를 구축하였고, 쿠버네티스와의 연동과 오케스트레이션을 위해 컨테이너 기반으로 구

dev-junhee.tistory.com

 

기본적으로 k8s 클러스터, 마스터, 워커노드를 편하게 구성할 수 있도록 제공되는 nks를 사용하고 있습니다.

인프라 설계에 대한 부분에 설명은 추후에 진행중인 사이드 프로젝트에 적용 예정이여 패키지로 제공하는 서비스 없이 직접 구현 해보면서 과정에 대해 글을 정리해 보도록 하겠습니다 :)

 

이번 글에서 정리할 내용은

image, jenkins pipeline, container registry, namespace, deployment, service,  ingress에 대한 설정입니다.

 

Image

컨테이너 서비스를 위해 저희의 nginx를 이미지 화를 시킬 필요가 있습니다. 이미지를 만들기 위해 대표적으로 많이 사용하고 ncp 공식문서에서 권장하는 docker를 이용하였습니다. 직접 CLI를 통해 이미지를 생성할 수 있지만, 버전 관리를 위해 Dockerfile을 작성하여 필요한 요소를 추가하는 작업을 진행하였습니다. 

위 사진을 보시면 엥? nginx.conf? 라고 보실수 있을 것 같습니다. nginx 구동 시점에 nginx.conf 파일을 읽어 명시한 설정을 토대로 동작하기에 이미지 자체에 복사해서 넣어주기 위함과, 관리 측면에서 소스로 관리하는 방식을 채택하였습니다.

아래는 Dockerfile의 구성입니다.

FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/

 

정말 간단하게 2줄입니다. docker hub에서 제공하는 nginx 버전은 정말 많습니다. 그 중 alpine 버전을 선택한 이유는 이미지 사이즈를 최소화 해주기 위해 사용했습니다.

 

Jenkins

NCP Container Registry를 이용하기 위해서는 Docker Engine 1.10 이상의 버전이 필요고, 터미널에서 Docker CLI를 이용하여 엔드포인트에 로그인할 수 있습니다.  Shell Script 구성은 아래와 같습니다. 

$NCP_~ 에 대한 것은 공통으로 사용하기 위해 환경 변수를 적용하여 호출하고 있습니다.
# endpoint로 login
docker login -u $NCP_REGISTRY_ACCESS_KEY -p $NCR_REGISTRY_SECRET_KEY $NCP_REGISTRY_ENDPOINT

# 이미지 빌드
docker build --cache-from $NCP_REGISTRY_ENDPOINT/nginx:v1 --tag $NCP_REGISTRY_ENDPOINT/nginx:v1 .

# 이미지 container registry에 업로드
docker push $NCP_REGISTRY_ENDPOINT/nginx:v1

# 해당 이미지 제거
docker rmi $NCP_REGISTRY_ENDPOINT/nginx:v1

# logout
docker logout $NCP_REGISTRY_ENDPOINT

 

Namespace

우선 namespace는 구성에 따라 필요할수도 있고, 없을 수 있지만 현재 인프라 구성에서는 클러스터를 논리적으로 분리하여 리소스들을 관리하기 위해 설정 해 주었습니다.

kind: Namespace
apiVersion: v1
metadata:
  name: test-namespace
  labels:
    kubernetes.io/metadata.name: test-namespace
spec:
  finalizers:
    - kubernetes
status:
  phase: Active

 

Deployment

운영 환경에서는 대부분 replicaset과 pod를 정의하는 deployment를 yaml로 작성하여 사용합니다. replicaset을 이용하여 pod를 생명주기와 이력 등을 관리할 수 있습니다. deployment를 생성하면 replicaset도 함께 생성됩니다. replicaset은 설정한 개수에 해당하는 pod가 runtime이도록 관리하며, 장애회복을 통해 pod를 생명 주기를 관리해 줍니다. 정리하면, deployment를 통해 pod 가용성을 보장해 줍니다.

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx
  namespace: test-namespace
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: $CONTAINER_REGISTRY_ENDPOINT/nginx:v1
        imagePullPolicy: Always 
        ports:
          - containerPort: 80
      imagePullSecrets:
      - name: $NCP_SECRET
더보기
  • replicas: 생성할 pod 개수 설정합니다.
  • matchLabels: 생명주기를 관리할 pod의 labels를 가르킵니다.
  • imagePullPolicy: 이미지 pull 정책입니다.
    • 기본 IfNotPresent 로 설정되어 있으며, 로컬에 이미지가 있을 경우, 기존 이미지를 사용합니다.
    • tag 값이 latest일 경우 Always로 자동 설정되고 항상 갱신됩니다.
  • containerPort: 컨테이너에서 개방할 포트 번호를 의미합니다.
  • imagePullSecrets: container registry에 엑세스하는데 사용되는 docker 인증 정보를 저장합니다.
    • NCP의 Access Key와 Secret Key

Service

클러스터 내부에서 고정 ip를 갖도록 service를 이용하여 pod가 외부와 통신할 수 있도록 해줍니다.

고유한 이름을 통해 entry point 와 load balancer의 역할을 수행합니다.

kind: Service
apiVersion: v1
metadata:
  name: nginx
  namespace: test-namespace
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /health
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30200
  selector:
    app: nginx
더보기

 

  • annotations.healthcheck-path : ingress LB healthcheck 설정입니다.
    • 서비스 별 healthcheck 경로를 따로 주고 싶을 때 사용합니다.
  • port: cluster 로 들어오는 port 입니다.
  • targetPort: 어플리케이션 port 입니다.
    • spring 에서는 spring.active.profile 에 지정된 값 사용합니다.
  • selector.app: lable selector로 연결할 app 지정하는 것으로 deployment 리소스에 생성한 lable로 설정합니다.

https://kubernetes.io/docs/concepts/services-networking/service/#publishing-services-service-types

 

Ingress ( feat. ingress-controller )

Ingress는 요청들을 처리 방식 (url mapping, lb, ssl , domain hosting 등) 에 관한 규칙을 설정한 것입니다.

실제로 동작시키는 것은 ingress-controller입니다.

추가적으로, ingress-controller는 application layer에서 처리하기에 L7입니다.

출처 : https://kubernetes.io/docs/concepts/services-networking/ingress/

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-L7
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
  labels:
    app: ingress-L7
spec:
  ingressClassName: alb
  rules:
    - host: abc.test.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx
                port:
                  name: 80

 

더보기
  • ingressClassName: ‘alb’는 ncp 에서 사용하는 lb type입니다.
  • host: 요청에 대한 rule을 분기할 url 정보입니다.
  • path: 연결할 서비스의 경로를 설정합니다.
  • backend.service.name: service에서 설정한 name을 작성합니다.
  • backend.service.port: service에서 지정한 port를 작성합니다.

 

이로서 nginx 컨테이너 서비스와 오케스트레이션을 위한 k8s 설정에 대해 알아 보았습니다.

다음 글에서는 nginx.conf를 config map을 통해 관리하는 방식으로 고도화하는 방식에 대해 정리하도록 하겠습니다 :)

댓글