k8s 이용해서 웹 서버 구축하기 - 1부. install k3s with Calico
k8s 이용해서 웹 서버 구축하기 - 2부. setup nginx-ingress, ipvs, metalb
👉 k8s 이용해서 웹 서버 구축하기 - 3부. deploy nextjs (with. bun.js)
k8s 이용해서 웹 서버 구축하기 - 4부. nginx ingress 에 https 적용 (cert-manager 이용)
k8s 이용해서 웹 서버 구축하기 - 5부. MariaDB 배포 및 연동
k8s 이용하서 웹 서버 구축하기 - 5-1부. (번외편) PostgreSQL 배포 및 연동
k8s 이용해서 웹 서버 구축하기 - 6부. MiniO 구축하기
개요NextJS 의 컨테이너화 - 컨테이너 이미지 생성도커 설치Dockerfile 작성컨테이너 이미지 생성컨테이너 이미지 배포💡 잠깐! ghcr 비공개 패키지 접근 방법ghcr 접근을 위한 github access token 발급K8s secret 생성yaml 파일 작성 시, imagePullSecrets 옵션 추가!NextJS 생성deployment 작성 및 실행service 작성 및 실행ingress 작성 및 실행완성
개요
이제 NextJS 를 이용하여, 간단한 웹 서비스를 만들어 보겠다.
NextJS 의 컨테이너화 - 컨테이너 이미지 생성
서비스, 어플리케이션을 K8s 에 올리기 위해서 먼저, 컨테이너 이미지 생성이 필요하다. Docker 를 다룰 수 있다면 어렵지 않게 만들 수 있다.
도커 설치
이전에 k3s 를 설치할 때, 사용했던 런타임은 containerd 이다.
containerd 를 사용하여 컨테이너 이미지를 빌드할 수 없다. 그래서 docker 를 따로 설치해주도록 한다.
서버에서 docker 를 설치하는 것 보다, 개발환경이나 로컬 PC 에서 Docker 로 이미지를 빌드한 후, 서버에서 사용하는 것을 추천한다.
Dockerfile 작성
2022.08월 기준으로 node, deno 보다 빠른 런타임이 화두이다. bun 이라는 것인데, 바로 적용하여 사용해보겠다. 다행히 react 와 nextjs 를 동작시킬 수 있었다.
ARG DEBIAN_FRONTEND=noninteractive # tzdate 적용을 위한 변수 FROM bitnami/minideb:latest ENV TZ=Asia/Seoul RUN apt-get update RUN apt-get install -y tzdata WORKDIR /opt/app # bun 설치한다. ENV BUN_INSTALL="/root/.bun" RUN apt-get install -y curl unzip RUN curl -fsSL https://bun.sh/install | bash RUN ln -s $BUN_INSTALL/bin/bun /usr/local/bin/bun ENV BUN_INSTALL="$HOME/.bun" ENV PATH="$BUN_INSTALL/bin:$PATH" # 아래 링크를 참고하여, 원하는 버전의 노드를 설치한다. # https://github.com/nodesource/distributions/blob/master/README.md RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - RUN apt-get install -y nodejs # 하위 모든 폴더 복사 # .dockerignore 파일을 꼭! 생성하여 불필요한 폴더 및 파일을 복사하지 말자! COPY . . RUN bun install RUN bun run build EXPOSE 3000 # ENTRYPOINT 가 성능은 더 좋다. CMD ["bun", "start"]
컨테이너 이미지 생성
docker build -t ghcr.io/eugenejeonme/minideb-bun:v0.0.1 .
컨테이너 이미지 배포
Github Repository 를 사용할 것이다. 아래 링크를 참고하여 설정할 수 있다.
docker push !$ # 이전 명령어의 마지막 인자 전달
Q. 개발과 테스트
- nextjs 코드는 빌드와 실행을 통해 직접 테스트 할 수 있다.
- 컨테이너 이미지는 docker, docker-compose 나 로컬이나 개발 서버의 k8s 환경을 통해 테스트 할 수 있다.
💡 잠깐! ghcr 비공개 패키지 접근 방법
ghcr 접근을 위한 github access token 발급
Github > Settings > Developer settings > Personal access tokens

ghcr 읽기 기능만 부여하도록 합니다.

K8s secret 생성
kubectl create secret docker-registry <NAME> \ --docker-server=ghcr.io \ --docker-username=<USERNAME> \ --docker-password=<TOKEN> \ --docker-email=<EMAIL> \ -n default
- NAME : secret 이름
- USERNAME : Github 계정 이름
- TOKEN : Github Access Token (위에서 발급한 토큰)
- EMAIL : Github 계정 메일
yaml 파일 작성 시, imagePullSecrets 옵션 추가!
... spec: ... template: ... spec: containers: - name: nextjs-test image: ghcr.io/{USERNAME}/{PACKAGENAME}:{TAG_VERSION} ... imagePullSecrets: - name: {SECRET_NAME}
아래 링크를 통해 다른 방법도 확인할 수 있다.
NextJS 생성
deployment 작성 및 실행
# web-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-v1 spec: replicas: 2 # 분산 strategy: # 무중단 업데이트를 위한 전략 설정 type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: web tier: app version: v1 template: metadata: labels: app: web tier: app version: v1 spec: containers: - name: web image: ghcr.io/{USERNAME}/{PACKAGENAME}:{TAG_VERSION} imagePullPolicy: IfNotPresent livenessProbe: httpGet: path: / port: 3000 #ports: # 주석해주어도 무방하다. #- containerPort: 3000 imagePullSecrets: - name: {SECRET_NAME}
kubectl apply -f web-deployment.yaml
service 작성 및 실행
# web-service.yaml apiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: web ports: - protocol: TCP port: 80 targetPort: 3000
kubectl apply -f web-service.yaml
ingress 작성 및 실행
sslip.io 를 이용하면, IP 를 이용한 도메인 테스트를 할 수 있다.
# web-ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress annotations: nginx.ingress.kubernetes.io/force-ssl-redirect: "false" nginx.ingress.kubernetes.io/rewrite-target: / # nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: ingressClassName: nginx # created default class rules: - host: {IP}.sslip.io http: paths: - path: "/" pathType: Prefix backend: service: name: web-service port: number: 80
kubectl apply -f web-ingress.yaml
아래와 같이 한 폴더로 묶어 두면, 한 번에 실행/관리가 되어 편하다.

kubectl apply -f ./nginx/
완성
