말하는 컴공감자의 텃밭

Krampolin 배포 테스트 하기 본문

카테고리 없음

Krampolin 배포 테스트 하기

현콩 2024. 5. 14. 23:37
728x90


https://krampoline-ide.kakao.com/my/dashboard



목표 : 크램폴린으로 프로젝트 github에서 이미지를 만들어 배포까지 진행하기.

컨테이너 생성

 

 

 

1. 깃허브 크램폴린 IDE 연동

2. Dockerfile 생성

3. IDE 에서 pull을 통해 gitjhub에 있는 Dockerfile 확인.

 

4. D2hub Repository 생성

D2hub 생성 확인

이후 클릭해서 빌드하기 클릭

 

빌드 로그 페이지

 

5. Kargo 배포 구성 파일 작성

 

Kargo로 앱 배포 시 github 소스 저장소의 main 브랜치에 저장된 소스 코드의 쿠버네티스 리소스 구성 파일을 읽는다
루트 디렉토리의 k8s 폴더 하위에 위치해야 인식함.

 

루트 디렉토리 아래 k8s 폴더 생성 및 yaml 세팅

 

kustomization.yaml에 k8s 구성 파일을 참조.

이제 쿠버네티스 구성 파일 작성 시 D2Hub 이미지 경로를 사용.

 

\경로 복사

Ex ) krmp-d2hub-idock.9rum.cc/dev-test/repo_089f59d02be7

 

쿠버네티스 구성 파일 작성.

파일의 deployment 객체에 작성 예시 (mysql로 예시) 

apiVersion: apps/v1
kind: Deployment
spec:
    template:
        metadata:
            labels:
                app: Mysql
        spec:
            containers:
                - name: Mysql
                  # 이미지 주소 작성
                  image: krmp-d2hub-idock.9rum.cc/dev-test/repo_089f59d02be7
                  imagePullPolicy: Always
                  ports:
						# 포트 번호는 자유롭게
                      - containerPort: 8090

 

Ingress 객체에 대한 정의

 

Ingress 객체에 대한 정의의 IP를 통해 외부 접속 URL을 연결.

외부 요청 라우팅, 가상 호스트 요청 처리, SSH/TLS 보안 연결 처리등의 기능을 제공한다.

외부에서 서버에 들어오는 트래픽을 처리하며 네트워크 7계층 레벨에서 정의되는 k8s의 객체이다.

User가 바로 접근하는것이 아닌 Ingress Controller를 통해 접근하게 되면  다양한 서비스가 존재해도 하나의 URL로 접근하게 된다.

따라서 정의된 규칙에 처리되고 deployment에 전달되는것이다.

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name:ingress_ex
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
  labels:
    app.kubernetes.io/managed-by: kargocd
  name: krampoline
  namespace: default
spec:
  rules:
    - http:
        paths:
          - mysql:
              serviceName: krampoline
              servicePort: 3000
              path: /
              pathType: Prefix

 

host: 해당 도메인 이름으로 접근하는 요청에 대해서 처리 규칙을 적용

여러개의 host를 가질 수 있음

path: 해당 경로에 들어온 요청은 어느 서비스로 전달할지 정의

위에서는 /etc-hostname으로 온 요청을 backend에 정의된 service에 전달

pathType: 경로의 유형

Prefix: URL 경로의 접두사를 / 를 기준으로 분리한 값과 일치시킴 (/hostname, /hostanme/ 가능)

Exact: URL 경로의 대소문자를 엄격하게 일치시킴 (/hostname 만 가능)

service: path로 들어온 요청이 전달될 내용을 담고있다

name, port.number: service 이름, port 번호

 

결국 저 ingress 파일은

엔드포인트에 따라 연결해주는 서비스들을 다르게 배정해준다고 생각하면 된다.

mysql이면 mysql 서비스, backend면 back 서비스를 할당.

 

이제 k8s에 파일을 만들고 push 후 크램폴린 IDE에서 pull 해주면 파일을 확인 할 수 있다.

pull

 

배포 탭 -> Kargo 클릭 > 앱 등록하기

 

git 연결, Kargo 생성 확인

 

1인당 1개의 Kargo만 가능하다.

 

Kargo 디테일 내용

 

실패 로그 확인

에러 로그를 확인한 뒤, 관련된 에러를 고친 후에 다시 배포를 진행해야 합니다.

배포 구성 파일에 포함된 에러를 고쳐서

github 소스 저장소에 업로드한 뒤에는, 해당 소스 저장소로부터 Kargo App으로 구성 파일을 다시 불러와야 합니다.

‘배포 파일 정보’ 항목의 ‘GIT 불러오기’ 버튼을 클릭해서 Kargo App의 구성파일 정보를 갱신할 수 있습니다.

 

S C:\Users\khv97\Desktop\Web> ls -l /tmp/kargo2018266253/k8s/
ls : 'C:\tmp\kargo2018266253\k8s\' 경로는 존재하지 않으므로 찾을 수 없습니다.
위치 줄:1 문자:1
+ ls -l /tmp/kargo2018266253/k8s/
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\tmp\kargo2018266253\k8s\:String) [Get-ChildItem], ItemNotFoundException
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

이런 에러가 발생했는데, C:\tmp\kargo2018266253\k8s\ 를 사용하나보다.

 

  1. Service 리소스는 apiVersion: v1을 사용
  2. Ingress 리소스는 apiVersion: networking.k8s.io/v1을 사용
  3. backend.yaml 파일에 Deployment, Service, Ingress 리소스를 통합 정의.
    Ingress는 중복되면 안된다는 점을 유념하자..


파일 구조

 

backend.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
        - name: backend
          image: backend-image
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: backend
  namespace: default
spec:
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: backend
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
  labels:
    app.kubernetes.io/managed-by: kargocd
  name: krampoline
  namespace: default
spec:
  rules:
    - host: example.com  # 적절한 호스트 이름으로 변경
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: backend
                port:
                  number: 8080

 

kustomization.yaml
namespace: default
resources:
  - backend.yaml
  - Mysql.yaml
  - krampoline-ingress.yaml

 

 

Mysql.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: default
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: mysql


나중에 정리해야지

728x90
Comments