Ubuntu 22.04 Kind Cluster 에서 Korifi 설치하기 (스크립트를 이용한 간단 설치)

리눅스/PaaS|2023. 11. 2. 16:25
반응형

Ubuntu 22.04 서버 한대로 Kind Cluster 를 구성하고 Korifi 를 설치해 애플리케이션 배포하는 방법입니다. Korifi 를 경험해보거나 테스트가 필요한 경우에 간단히 구성하여 사용이 가능합니다.

여기에서는 서버 한대로 스크립트를 이용한 설치 방법이 기술되어 있어 세세하게 설정을 하거나 확장을 하고자 할때는 이전 포스팅 (https://sysdocu.tistory.com/1904) 을 기준으로 시스템을 구축, 운영해보면 스스로 시스템을 유지보수 하는데 도움이 될 것으로 보입니다.

본 매뉴얼은 다음 포스팅을 참고하여 재작성 하였습니다.

https://tutorials.cloudfoundry.org/korifi/local-install/

https://dzone.com/articles/deploying-python-and-java-applications-to-kubernet

 

- 테스트 환경 : Ubuntu 22.04 서버 1대

 

 

1. 준비 작업

 

Korifi 를 설치하기 전에 아래 내용이 서버에 미리 준비되어 있어야 합니다.

- Cf8 cli

- Docker

- Go

- Helm

- Kbld

- Kind

- Kubectl

- Make

 

이 모든것을 자동 설치하도록 스크립트를 다운로드 받아 실행합니다.

# git clone https://github.com/sylvainkalache/korifi-prerequisites-installation
# cd korifi-prerequisites-installation && ./install-korifi-prerequisites.sh

* go 명령을 실행해보세요. go 명령어가 없거나, 에러 메세지 (permanently dropping privs did not work: File exists) 가 출력될 경우 아래와 같이 go 명령어를 별도로 설치해 줍니다.

공식 홈페이지 (https://go.dev/dl/) 에 접근하여 go1.21.3.linux-amd64.tar.gz 파일을 다운로드 받고, 설치를 진행합니다.

# cd

# wget https://go.dev/dl/go1.21.3.linux-amd64.tar.gz

# tar -C /usr/local -xzf go1.21.3.linux-amd64.tar.gz

# echo "export PATH=/usr/local/go/bin:$PATH" >> /etc/profile

# source /etc/profile

 

설치된 버전을 확인합니다.

# go version
go version go1.21.3 linux/amd64

 

 

2. Korifi 설치

 

이번에 실행할 스크립트는 아래 작업 과정을 담고 있습니다.

- Korifi 에 대한 올바른 포트 매핑을 사용하여 Kind Cluster 생성
- Twuni helm chart 를 사용하여 로컬 도커 레지스트리 배포
- Cloud Foundry 관리자 생성
- Cluster 내에서 내부 인증서를 생성하고 관리할 수 있도록 cert-manager 설치
- Cloud Native Buildpack 을 사용하여 소스 코드에서 실행 가능한 애플리케이션을 구축하는데 사용되는 Kpack 설치
- Korifi ingress 컨트롤러 Contour 설치
- Service Binding Spec 을 구현한 Service Binding Runtime 설치
- Metrics-server 설치
- Korifi 설치

 

# cd

# git clone https://github.com/cloudfoundry/korifi
# cd korifi/scripts

 

1) Registry 변경 (선택)

설치 스크립트에서는 자동으로 로컬에 Registry 를 생성하게 되는데, 별도의 Registry 를 사용하고자 할 경우 deploy-on-kind.sh 실행파일을 편집해서 Registry 관련 변수값을 변경하여 줍니다.

# vi deploy-on-kind.sh

- 8번째줄 : LOCAL_DOCKER_REGISTRY_ADDRESS="registry.az1.sysdocu.kr:5000"

- 89번째줄 : DOCKER_USERNAME="sysdocu"
- 90번째줄 : DOCKER_PASSWORD="12345678"

 

2) Buildpack 변경 (선택)

설치 스크립트에서는 기본 빌드팩이 'paketobuildpacks/build-jammy-base' 인데, 'paketobuildpacks/build-jammy-full' 로 변경시 PHP 와 Ruby 빌드팩 추가 사용이 가능해 집니다.

- base 지원 언어 : Java, Java Native Image, Go, Python, .NET, Node.js, Apache HTTPD, NGINX, Procfile

- full 지원 언어 : Java, Java Native Image, Go, Python, .NET, Node.js,  Apache HTTPD, NGINX, Procfile, PHP, Ruby

# vi deploy-on-kind.sh

- 179번째줄 : --set=kpackImageBuilder.clusterStackBuildImage="paketobuildpacks/build-jammy-full" \
- 180번째줄 : --set=kpackImageBuilder.clusterStackRunImage="paketobuildpacks/run-jammy-full" \

 

설치를 시작합니다.

# ./deploy-on-kind.sh korifi-cluster

 

* make 에러 발생시 --------------------

go 버전이 문제가 되어 설치가 중단되는 경우가 있습니다. 아래 절차대로 진행하면 해결 됩니다.

# cp -arp ../go.mod ../go.mod_1.20

# go mod tidy

# go mod vendor
# go clean -modcache
# go mod download

# cp -arp ../go.mod_1.20 ../go.mod

# ./deploy-on-kind.sh korifi-cluster

----------------------------------------------

 

설치가 완료되었으면 Cloud Foundry API 인증 작업을 진행합니다.
# cf api https://localhost --skip-ssl-validation
# cf auth cf-admin

조직과 공간을 생성합니다.
# cf create-org org1
# cf create-space -o org1 space1
# cf target -o org1 -s space1

 

 

3. 애플리케이션 배포

 

Java 샘플 애플리케이션을 배포해 봅니다.

# cd

# git clone https://github.com/sylvainkalache/sample-web-apps

# cd sample-web-apps/java

 

언어 종속성을 설치해야 하므로 이 명령을 처음 실행할 경우에만 시간이 좀 걸립니다.
# cf push my-java-app

 

애플리케이션이 Kubernetes 에 배포되었습니다. 상태 확인은 다음 명령을 사용하면 됩니다.

# cf app my-java-app

 

애플리케이션에 직접 접근 해봅니다.

# curl --insecure https://my-java-app.apps-127-0-0-1.nip.io
Hello, World!
Java Version: 17.0.9

 

 

4. 빌드팩 추가 설치 및 애플리케이션 배포

 

이번에는 PHP 소스를 배포해보도록 하겠습니다.

paketobuildpacks/build-jammy-full 빌드팩 사용하는 경우에만 PHP 를 올바르게 배포할 수 있습니다.

 

기본 제공하는 개발 언어 빌드팩은 5개 입니다.

# cf buildpacks
Getting buildpacks as cf-admin...

position   name                         stack                        enabled   locked   filename
2          paketo-buildpacks/java       io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/java@10.3.3
3          paketo-buildpacks/go         io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/go@4.6.1
4          paketo-buildpacks/nodejs     io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/nodejs@2.0.0
5          paketo-buildpacks/ruby       io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/ruby@0.41.1
6          paketo-buildpacks/procfile   io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/procfile@5.6.7

 

PHP 빌드팩을 추가해보겠습니다.

clusterstore 의 빌드팩 리스트를 갱신합니다. (PHP 추가)
# kubectl edit clusterstore cf-default-buildpacks

...

spec:
  sources:
  - image: gcr.io/paketo-buildpacks/java
  - image: gcr.io/paketo-buildpacks/nodejs
  - image: gcr.io/paketo-buildpacks/ruby
  - image: gcr.io/paketo-buildpacks/procfile
  - image: gcr.io/paketo-buildpacks/go
  - image: gcr.io/paketo-buildpacks/php

...

 

clusterbuilder 의 빌드팩 리스트를 갱신합니다. (PHP 추가)
# kubectl edit clusterbuilder cf-kpack-cluster-builder

...

spec:
  order:
  - group:
    - id: paketo-buildpacks/php
  - group:
    - id: paketo-buildpacks/java
  - group:
    - id: paketo-buildpacks/go
  - group:
    - id: paketo-buildpacks/nodejs
  - group:
    - id: paketo-buildpacks/ruby
  - group:
    - id: paketo-buildpacks/procfile


...

 

추가된 PHP 빌드팩이 확인되었습니다.

(빌드팩이 반영되기까지 시간이 소요될 수 있음)

# cf buildpacks
Getting buildpacks as cf-admin...

position   name                         stack                        enabled   locked   filename
1          paketo-buildpacks/php        io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/php@2.11.1
2          paketo-buildpacks/java       io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/java@10.3.3
3          paketo-buildpacks/go         io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/go@4.6.1
4          paketo-buildpacks/nodejs     io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/nodejs@2.0.0
5          paketo-buildpacks/ruby       io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/ruby@0.41.1
6          paketo-buildpacks/procfile   io.buildpacks.stacks.jammy   true      false    paketo-buildpacks/procfile@5.6.7

 

 

위에서 다운로드 받아놓은 PHP 소스 디렉토리로 이동합니다.
# cd ~/sample-web-apps/php

애플리케이션을 배포합니다.
# cf push php1

아래와 같이 PHP 페이지를 확인하였습니다.
# curl --insecure https://php1.apps-127-0-0-1.nip.io
Hello, World!
PHP Version: 8.1.24

 

 

5. 배포 옵션

 

1) CLI 명령

CF CLI 명령 옵션으로 메모리, 디스크, 인스턴스 수 등을 옵션으로 지정할 수 있습니다.

# cf push phptest -m 512M -k 1G -i 2

- 애플리케이션 이름 : phptest

- 메모리 제한 : 512Mi

- 디스크 크기 : 1Gi

- 인스턴스 수 : 2개

 

참고로, 인스턴스 수가 2개 이상일때 kubectl logs 로 확인해보면 도메인 연결시 라운드로빈 방식으로 Pod 에 분배 되는것이 확인됩니다.

 

2) Manifest

cf push 명령줄에 옵션을 추가하지 않고 파일에 미리 정의한 값을 불러와 적용할 수도 있습니다.

아래 예시로 제공한 옵션은 부분 생략 가능하며, 생략시 기본값으로 자동 설정됩니다.

# vi manifest.yaml

applications:
- name: phptest
  instances: 1
  memory: 512M
  disk_quota: 1G
  buildpacks:
  - paketo-buildpacks/php
  stack: cflinuxfs4
  routes:
  - route: phptest.apps-127-0-0-1.nip.io
  env: # 환경 변수 설정 부분

 

push 할때 -f 옵션을 사용하여 파일을 지정하면 미리 설정한 값에 맞추어 환경이 생성됩니다.

# cf push -f manifest.yaml

 

3) 운영중 환경 변경

배포시 뿐만 아니라 운영중인 Pod 에도 cf scale 명령을 통해 환경 변경 작업을 할 수 있습니다.

 

형식) cf scale APP_NAME [--process PROCESS] [-i INSTANCES] [-k DISK] [-m MEMORY] [-l LOG_RATE_LIMIT] [-f]

# cf scale phptest -i 2

이렇게 하면 phptest 라는 애플리케이션 인스턴스 (Pod) 의 수가 2개로 증가됩니다.

 

- CPU

Cloud Foundry 는 CPU 제한을 명시적으로 설정하는 옵션을 제공하지 않으며, 메모리 제한을 설정하는 -m 옵션만을 지원합니다. CPU 사용은 애플리케이션의 요구 사항에 따라 동적으로 조절됩니다. Cloud Foundry 의 핵심 아이디어는 개발자가 인프라 리소스 관리에 대해 걱정하지 않고 애플리케이션 코드에 집중할 수 있도록 하는 것입니다.

 

- 포트

Cloud Foundry 는 애플리케이션이 사용할 수 있는 포트 번호를 동적으로 할당하므로 포트 번호를 직접 변경하거나 설정하는 것은 일반적으로 지원되지 않습니다. 애플리케이션의 포트 번호를 변경하려면 환경 변수 또는 애플리케이션 코드 내에서 직접 변경해야 합니다.

 

반응형

댓글()