PHP 소스 코드가 있는 디렉토리에서 composer.json 파일을 아래 내용으로 작성합니다.
# vi composer.json
{ "require": { "php": "8.1.23" } }
composer.json 파일을 바탕으로 composer.lock 파일을 생성합니다.
# composer install --ignore-platform-reqs
이제 배포를 하면 원하는 PHP 버전의 컨테이너로 생성됩니다.
# cf push php-new-app
2. 빌드팩 버전 변경하기
위와 같이 빌드팩을 추가하면 항상 최신버전의 빌드팩이 자동 선택되어 집니다.
그래서 원하는 특정 빌드팩 버전으로 변경하고 싶을때는 아래와 같은 절차를 따르면 됩니다.
(또는 제공하는 서비스 버전을 고정하기 위해 사용)
아래 PHP 릴리즈 정보 페이지를 방문합니다.
현재 매뉴얼 작성일 기준으로 최신 PHP 빌드팩은 2.11.1 버전입니다. PHP 빌드팩 2.9.4 로 서비스하기 위해 2.9.4 버전 정보의 다이제스트값 (예: sha256:9b72bd475c4fdcbaf6d8b2c99508798af7fda4029a26022ab3e1c4b62e08c6cf) 을 복사합니다.
웹브라우저에서 아래와 같은 형태의 URL 로 Google Container Registry 에 접속합니다.
여기에서는 PHP 로 접속하였지만, 다른 언어의 버전 변경을 원할때는 URL 맨 뒤에 개발언어만 바꿔주면 됩니다. https://gcr.io/paketo-buildpacks/php 현재 매뉴얼 작성일 기준으로 최신 PHP 빌드팩은 2.11.1 버전입니다. PHP 빌드팩 2.9.4 로 서비스하기 위해 태그값이 2.9.4 로 되어 있는 항목의 이름을 클릭해 상세 페이지를 출력시킵니다.
출력된 내용에서 다이제스트값 (예: sha256:9b72bd475c4fdcbaf6d8b2c99508798af7fda4029a26022ab3e1c4b62e08c6cf) 을 복사합니다.
---------------------------
Kubernetes Cluster 에서 아래와 같이 space 네임스페이스의 ClusterStore 를 수정합니다.
기본적으로 Heroku 는 프로젝트의 루트 디렉터리에서 응용 프로그램을 서비스하기 위해 PHP 와 함께 Apache 웹 서버를 시작합니다. 아래 내용으로 Procfile 파일을 생성합니다. # echo "web: heroku-php-apache2 public/" > Procfile # git add . # git commit -m "Procfile for Heroku"
Push 할 수 있는 새로운 Heroku 애플리케이션을 만듭니다. (예 : php3) # heroku create php3
Laravel 암호화 키를 설정합니다. Larvel 은 애플리케이션의 암호화 키를 사용하여 사용자 세션 및 기타 정보를 암호화합니다. 구성에서 선택한 암호의 규칙을 준수해야 하므로 유효한 키를 생성하는 가장 쉬운 방법은 php artisan key:generate --show 명령어를 사용하는 것입니다. # php artisan --no-ansi key:generate --show
쉘스크립트를 작성할때 가장 다른 점이 주석하는 방법입니다. 한 줄은 쉽게 '#' 를 통해 주석이 가능하지만, 블록을 주석하기 위해서는 아래와 같은 방법을 사용해야 합니다. :<<'END' 이 구간부터 주석이 시작되는 블록입니다. END 로 주석이 끝나는 블록을 명시해 주면 됩니다.
[ 한줄 ]
# echo "please comment this line"
[ 여러줄 ]
:<<'END' if [ "$#" -ne 1 ]; then echo 'all' else VERSION=$1 echo "$VERSION" fi END
Ubuntu 22.04 서버 한대로 Kind Cluster 를 구성하고 Korifi 를 설치해 애플리케이션 배포하는 방법입니다. Korifi 를 경험해보거나 테스트가 필요한 경우에 간단히 구성하여 사용이 가능합니다.
여기에서는 서버 한대로 스크립트를 이용한 설치 방법이 기술되어 있어 세세하게 설정을 하거나 확장을 하고자 할때는 이전 포스팅 (https://sysdocu.tistory.com/1904) 을 기준으로 시스템을 구축, 운영해보면 스스로 시스템을 유지보수 하는데 도움이 될 것으로 보입니다.
- 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 관련 변수값을 변경하여 줍니다.
이렇게 하면 phptest 라는 애플리케이션 인스턴스 (Pod) 의 수가 2개로 증가됩니다.
- CPU
Cloud Foundry 는 CPU 제한을 명시적으로 설정하는 옵션을 제공하지 않으며, 메모리 제한을 설정하는 -m 옵션만을 지원합니다. CPU 사용은 애플리케이션의 요구 사항에 따라 동적으로 조절됩니다. Cloud Foundry 의 핵심 아이디어는 개발자가 인프라 리소스 관리에 대해 걱정하지 않고 애플리케이션 코드에 집중할 수 있도록 하는 것입니다.
- 포트
Cloud Foundry 는 애플리케이션이 사용할 수 있는 포트 번호를 동적으로 할당하므로 포트 번호를 직접 변경하거나 설정하는 것은 일반적으로 지원되지 않습니다. 애플리케이션의 포트 번호를 변경하려면 환경 변수 또는 애플리케이션 코드 내에서 직접 변경해야 합니다.
Kubernetes 버전 : Kubernetes 1.28 (master 1대, worker3대)
OS : Ubuntu 22.04
[Korifi - 소개글 일부]
Korifi 는 빌드, 테스트, 배포 및 모니터링 단계를 지원하는 DevOps 툴체인에 통합되어 애플리케이션 개발자의 배포 환경을 단순화합니다. 또한 팀이 기존 CI/CD, 로깅 및 관찰 가능 도구를 확장할 수 있도록 하는 동시에 Provile, Kpack 과 같은 Kubernetes 네이티브 도구가 포함되어 있습니다. 소프트웨어 엔지니어링 팀은 Korifi 를 통해 포괄적인 Kubernetes 전략을 수립하고 개발, 테스트 및 배포 단계 전반에 걸쳐 모범 사례를 채택할 수 있습니다.
Korifi 는 단일 cf push 명령으로 모든 언어나 프레임워크로 작성된 앱을 배포할 수 있는 기존의 Cloud Foundry 경험을 그대로 유지하고 있습니다. Pak to build pack 을 사용하여 OCI 호환 컨테이너로 앱을 배포함으로써 앱 개발자 경험을 더욱 향상시킵니다. 앱 개발자들은 더 이상 Kubernetes 에 컨테이너화된 배포를 위해 복잡한 YAML 이나 Dockerfile 과 씨름할 필요가 없습니다.
Creating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.27.3) 🖼 ✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 Set kubectl context to "kind-kind" You can now use your cluster with:
kubectl cluster-info --context kind-kind
Thanks for using kind! 😊
* 참고 : 클러스터 생성 오류
클러스터 재설치 등의 작업으로 아래와 같은 에러가 출력된 경우 기존의 클러스터를 삭제해야 다시 생성이 가능합니다.
ERROR: failed to create cluster: node(s) already exist for a cluster with the name "kind" 클러스터 재설치 전에 'kind delete cluster --name kind' 명령으로 삭제를 먼저 한 뒤에 클러스터 생성 명령을 실행해 주세요.
클러스터가 잘 설치 되었는지 확인합니다.
# kubectl cluster-info --context kind-kind Kubernetes control plane is running at https://127.0.0.1:40321 CoreDNS is running at https://127.0.0.1:40321/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
3. 환경 변수 설정
설치가 편리하도록 자주 사용하는 이름은 변수에 입력합니다.
# ROOT_NAMESPACE="cf" // CF 네임스페이스 #KORIFI_NAMESPACE="korifi-system" // Korifi 네임스페이스 #ADMIN_USERNAME="kubernetes-admin" // Admin 계정 아이디 #BASE_DOMAIN="az1.sysdocu.kr" // 기본 도메인
4. CF 설치
Cloud Foundry 는 개발자가 애플리케이션 코드를 작성하고 구축한 후 애플리케이션을 클라우드 환경에 배포하고 실행하는 데 도움이 되는 플랫폼입니다.
# kubectl get pods -n cert-manager NAME READY STATUS RESTARTS AGE cert-manager-cainjector-65c7bff89d-kjwpr 1/1 Running 0 24s cert-manager-cbcf9668d-7gd8w 1/1 Running 0 24s cert-manager-webhook-594cb9799b-b48w2 1/1 Running 0 24s
7. Kpack 설치
Kpack 은 Cloud Foundry 컨테이너 빌드 도구로, Kubernetes 에서 컨테이너 이미지를 빌드하고 관리하는 오픈 소스 프로젝트입니다. Kpack 은 애플리케이션을 컨테이너 이미지로 변환하는 작업을 자동화하고 단순화하는 데 사용됩니다. # kubectl apply -f https://github.com/buildpacks-community/kpack/releases/download/v0.12.2/release-0.12.2.yaml
설치를 확인합니다.
# kubectl get pods -n kpack NAME READY STATUS RESTARTS AGE kpack-controller-7d544645c8-4h92h 1/1 Running 0 19s kpack-webhook-77c465c879-lmkx6 1/1 Running 0 19s
8. Contour 설치
Contour 는 Ingress 컨트롤러입니다. Ingress 컨트롤러는 클러스터 외부에서 클러스터 내의 서비스로의 HTTP 및 HTTPS 트래픽을 관리하고 라우팅하는 역할을 합니다.
--set=global.containerRepositoryPrefix 옵션에는 업로드 할 수 있는 Repository 주소를 적어야 합니다.
--set=kpack-image-builder.builderRepository 옵션에도 동일한 Repository 주소를 적어주고 뒤에 kpack-builder 디렉토리 하나 더 추가해주세요.
여기에서 약간의 시간이 소요됩니다.
설치를 확인합니다.
# kubectl get pods -n korifi-system NAME READY STATUS RESTARTS AGE korifi-api-deployment-5c747f489d-rc4dd 1/1 Running 0 49s korifi-controllers-controller-manager-6b7cdd98c-4h59q 1/1 Running 0 49s korifi-job-task-runner-controller-manager-f799b99fc-d26vb 1/1 Running 0 49s korifi-kpack-build-controller-manager-7cdc7fcc9-4r9rv 1/1 Running 0 49s korifi-statefulset-runner-controller-manager-c49c9997d-ccfvk 1/1 Running 0 49s
참고로 helm 으로 설치된 Korifi 삭제는 helm uninstall korifi -n $KORIFI_NAMESPACE 입니다.
14. 조직 및 공간 생성
조직과 공간 생성 후 그 안에서 애플리케이션이 배포 됩니다.
아래와 같이 Cloud Foundry API 를 통해 조직과 공간을 생성하고 타겟 (작업공간으로 적용) 설정을 합니다.
Cloud Foundry API 인증 작업을 진행합니다.
# cf api https://api.$BASE_DOMAIN --skip-ssl-validation # cf login API endpoint: https://api.az1.sysdocu.kr
1. kind-kind 2. kubernetes-admin
Choose your Kubernetes authentication info (enter to skip):1
Authenticating... OK
Warning: The client certificate you provided for user authentication expires at 2024-12-07T02:35:20Z which exceeds the recommended validity duration of 168h0m0s. Ask your platform provider to issue you a short-lived certificate credential or to configure your authentication to generate short-lived credentials automatically. API endpoint: https://api.az1.sysdocu.kr API version: 3.117.0+cf-k8s user: kubernetes-admin No org or space targeted, use 'cf target -o ORG -s SPACE'
API endpoint: https://api.az1.sysdocu.kr API version: 3.117.0+cf-k8s Not logged in. Use 'cf login' or 'cf login --sso' to log in. Unable to authenticate. FAILED
Kubernetes 환경 변수를 불러오지 않았을 경우가 있으므로 아래 명령을 통해 KUBECONFIG 환경 변수를 설정합니다.