Kubernetes 1.28, Kind 에서 Korifi 설치 및 PHP 애플리케이션 배포하기
Kubernetes 및 MetalLB 가 구축되어 있다는 전제 하에 Korifi 설치하는 방법을 설명합니다.
준비되지 않으신 분은 아래 포스팅을 참고하세요.
- Kubernetes 설치 : https://sysdocu.tistory.com/1851
- MetalLB 설치 : https://sysdocu.tistory.com/1854
본 매뉴얼은 아래 URL 을 참고하여 재작성 하였습니다.
- CF 8 CLI 가이드 : https://cli.cloudfoundry.org/en-US/v8/
- Korifi 공식 문서 : https://github.com/cloudfoundry/korifi/
[환경]
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 과 씨름할 필요가 없습니다.
1. Docker 설치
패키지 목록을 최신화하고 업데이트를 진행합니다.
# apt -y update
# apt -y upgrade
# apt -y install apt-transport-https ca-certificates curl gnupg lsb-release
Docker 공식 GPG 를 설치합니다.
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg |gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Docker 공식 저장소를 추가합니다.
# echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" |tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker 를 설치하고 확인합니다.
# apt -y update
# apt -y install docker-ce docker-ce-cli containerd.io
# docker --version
Docker version 24.0.7, build afdd53b
2. Kind 설치
Kind 는 도커 컨테이너 nodes 를 사용하여 로컬 Kubernetes Cluster 를 실행하기 위한 도구입니다.
# wget https://github.com/kubernetes-sigs/kind/releases/download/v0.20.0/kind-linux-amd64
# chmod +x kind-linux-amd64
# mv kind-linux-amd64 /usr/local/bin/kind
# kind version
kind v0.20.0 go1.20.4 linux/amd64
클러스터를 생성합니다.
# cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 80
hostPort: 80
protocol: TCP
- containerPort: 443
hostPort: 443
protocol: TCP
EOF
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 는 개발자가 애플리케이션 코드를 작성하고 구축한 후 애플리케이션을 클라우드 환경에 배포하고 실행하는 데 도움이 되는 플랫폼입니다.
Ubuntu 계열이 아닐 경우 아래 공식 문서를 참고 하시기 바랍니다.
https://docs.cloudfoundry.org/cf-cli/install-go-cli.html
Korifi 에서는 CF 8.5 이상의 버전이 필요합니다. Ubuntu 계열에서 CF 설치 방법은 아래와 같습니다.
# wget -q -O - https://packages.cloudfoundry.org/debian/cli.cloudfoundry.org.key | sudo apt-key add -
# echo "deb https://packages.cloudfoundry.org/debian stable main" | sudo tee /etc/apt/sources.list.d/cloudfoundry-cli.list
# apt -y update
# apt -y install cf8-cli
설치된 CF 8 버전을 확인합니다.
# cf version
cf version 8.7.4+db5d612.2023-10-20
5. Helm 설치
Helm 은 Kubernetes Cluster 에서 Kubernetes 애플리케이션을 관리하기 위한 패키지 관리 도구입니다.
Helm 공식 웹사이트에서 운영 체제에 맞는 Helm 바이너리 파일을 다운로드하여 설치를 쉽게 진행할 수 있습니다.
다음 링크를 사용하면 최신 버전의 helm을 다운로드할 수 있습니다.
URL : https://github.com/helm/helm/releases
페이지 중간부에 Download 섹션이 있고, 64bit 리눅스 OS 를 사용하기 때문에 'Linux arm64' 항목의 주소를 복사하여 리눅스 쉘에서 다운로드 하였습니다.
# wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
# tar xvzf helm-v3.12.0-linux-amd64.tar.gz
실행파일을 PATH 경로에 포함된 디렉토리로 이동시킵니다.
# mv linux-amd64/helm /usr/local/bin/
버전을 확인합니다.
# helm version
version.BuildInfo{Version:"v3.12.0", GitCommit:"c9f554d75773799f72ceef38c51210f1842a1dea", GitTreeState:"clean", GoVersion:"go1.20.3"}
6. cert-manager 설치
cert-manager는 Kubernetes 클러스터에서 SSL/TLS 인증서를 관리하기 위한 오픈 소스 도구입니다. 이 도구는 Let's Encrypt 와 같은 인증 기관에서 인증서를 자동으로 발급하고 갱신하는 작업을 단순화합니다.
# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml
설치를 확인합니다.
# 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 트래픽을 관리하고 라우팅하는 역할을 합니다.
설치를 진행합니다.
# kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
설치를 확인합니다.
# kubectl get pods -n projectcontour
NAME READY STATUS RESTARTS AGE
contour-6775896b98-scqgb 1/1 Running 0 46s
contour-6775896b98-tt7v9 1/1 Running 0 46s
contour-certgen-v1-26-1-6jtws 0/1 Completed 0 46s
envoy-2zql9 1/2 Running 0 46s
envoy-dqjbj 1/2 Running 0 46s
envoy-xbrqw 1/2 Running 0 46s
9. Metrics-server 설치
메트릭 서버는 Kubernetes 클러스터 내에서 리소스 사용 및 성능 메트릭을 수집, 저장 및 쿼리하는 데 사용되는 중요한 구성 요소입니다.
여기에서는 간단히 설치하고 넘어가므로, 자세한 내용응 아래 URL 을 참고하시기 바랍니다.
https://github.com/kubernetes-sigs/metrics-server
설치할 메트릭 서버 버전은 Kubernetes 의 버전에 따라 달라집니다.
Kubernetes 가 1.19 이상의 버전이라면 아래와 같이 실행하여 Metrics 를 설치하면 되고, 그 이하일 경우 또는 고가용성 (HA) 을 위한 이중화 구성은 위에 안내된 URL 에서 해당 버전을 확인하여 설치합니다.
# kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
설치를 확인합니다.
# kubectl get pods -A |grep metrics-server
kube-system metrics-server-fbb469ccc-fwmsn 0/1 Running 0 73s
이상태로 사용해도 문제가 없으나 kubectl top nodes 등 Metrics 를 이용한 자원 사용량 등을 확인하고 싶은 경우 Running 중인 Pod 가 1개 이상 있어야 합니다. 아래 추가 포스팅을 참고하여 진행하시면 됩니다.
https://sysdocu.tistory.com/1890
10. Namespace 생성
root 및 korifi 네임스페이스를 생성합니다.
# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: $ROOT_NAMESPACE
labels:
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/enforce: restricted
EOF
# cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Namespace
metadata:
name: $KORIFI_NAMESPACE
labels:
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/enforce: restricted
EOF
11. Secret 생성
Korifi 와 Kpack 이 컨테이너 레지스트리에 연결할 수 있도록 secret 을 생성합니다.
Registry 서비스를 이용하지 않거나 새로 구축해야 하는 경우 별도 포스팅 (https://sysdocu.tistory.com/1855) 을 참고하고,
도커 허브를 사용하는 경우 --docker-server 는 생략하고 --docker-username 에 사용자 이름, --docker-password 에 암호 또는 개인 액세스 토큰을 입력합니다.
# kubectl --namespace "$ROOT_NAMESPACE" create secret docker-registry image-registry-credentials \
--docker-username="sysdocu" \
--docker-password="12345678" \
--docker-server="https://registry.az1.sysdocu.kr:5000"
12. 네임서버 도메인 설정
Korifi API 및 Korifi 에서 실행할 앱에 대한 DNS 등록을 해야 합니다.
아래 내용을 참고하여 네임서버에 master node IP 로 설정해주세요.
- Korifi API 서버 : api.az1.sysdocu.kr / 115.68.142.120
- Apps : *.apps.az1.sysdocu.kr / 115.68.142.120
- 추후 서비스로 제공할 경우 {app_name}.apps.az1.sysdocu.kr 과 같은 개별 도메인은 배포되는 worker node IP 로 연결되도록 하는것도 방법입니다. (하지만 Cluster 구성이기 때문에 master node 에서도 응답은 합니다)
13. Korifi 설치
Korifi 는 빌드, 테스트, 배포 및 모니터링 단계를 지원하는 DevOps 툴체인입니다.
설치는 Helm 명령어로 합니다.
# helm install korifi https://github.com/cloudfoundry/korifi/releases/download/v0.5.0/korifi-0.5.0.tgz \
--namespace="$KORIFI_NAMESPACE" \
--set=global.generateIngressCertificates=true \
--set=global.rootNamespace="$ROOT_NAMESPACE" \
--set=adminUserName="$ADMIN_USERNAME" \
--set=api.apiServer.url="api.$BASE_DOMAIN" \
--set=global.defaultAppDomainName="apps.$BASE_DOMAIN" \
--set=global.containerRepositoryPrefix=registry.az1.sysdocu.kr:5000 \
--set=kpack-image-builder.builderRepository=registry.az1.sysdocu.kr:5000/kpack-builder
--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'
위 명령은 'cf auth kind-kind' 로 대체할 수 있습니다.
조직과 공간을 생성하고 타겟 설정을 합니다.
# cf create-org org1
# cf create-space -o org1 space1
# cf target -o org1 -s space1
15. 빌드팩 추가
처음 cf 를 설치하고나서 기본적으로 제공되는 빌드팩은 아래와 같습니다.
# cf buildpacks
Getting buildpacks as kubernetes-admin...
position name stack enabled locked filename
1 paketo-buildpacks/java io.buildpacks.stacks.jammy true false paketo-buildpacks/java@10.3.0
2 paketo-buildpacks/go io.buildpacks.stacks.jammy true false paketo-buildpacks/go@4.6.0
3 paketo-buildpacks/nodejs io.buildpacks.stacks.jammy true false paketo-buildpacks/nodejs@2.0.0
4 paketo-buildpacks/ruby io.buildpacks.stacks.jammy true false paketo-buildpacks/ruby@0.41.1
5 paketo-buildpacks/procfile io.buildpacks.stacks.jammy true false paketo-buildpacks/procfile@5.6.7
여기에 PHP Buildpack 을 추가해 보겠습니다. 아래 위치에 내용 추가 후 저장합니다.
# 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 Buildpack 을 추가합니다. 추가 위치에 따라 빌드팩 순번이 결정됩니다.
# 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 ... |
추가된 빌드팩을 확인합니다.
# cf buildpacks
Getting buildpacks as kubernetes-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.0
3 paketo-buildpacks/go io.buildpacks.stacks.jammy true false paketo-buildpacks/go@4.6.0
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
16. 애플리케이션 배포
위에서 추가한 PHP Buildpack 을 이용해 애플리케이션을 배포해 보도록 하겠습니다.
간단한 소스를 만듭니다.
# mkdir php-source
# cd php-source
# vi index.php
<?php echo "Hello, World!\n"; echo "PHP Version: " . phpversion() ."\n"; ?> |
PHP 소스를 배포 합니다.
# cf push php1
...
* 참고 (소스 디렉토리 지정)
소스를 배포할때는 해당 소스 디렉토리에서 cf push 명령을 실행해야 하지만, 디렉토리가 다를 경우 -p 옵션 (-p {소스 경로}) 을 추가하면 됩니다.
배포된 애플리케이션 정보는 아래 명령으로 확인됩니다.
# cf app php1
정상 동작하는지 curl 명령으로 접근해 봅니다.
# curl --insecure https://php1.apps.az1.sysdocu.kr
Hello, World!
PHP Version: 8.1.24
* Laravel 프로젝트 배포
Laravel 소스를 배포하기 위한 Composer 설치 및 Laravel 프로젝트 생성 방법은 아래 포스팅을 참고해 주세요.
https://sysdocu.tistory.com/1874
위 포스팅에서와 같이 Laravel 프로젝트 생성 준비가 되었다면, 다음과 같은 과정을 거쳐 배포가 가능합니다.
Laravel 프로젝트를 생성합니다. (예 : laravel-app)
# composer create-project laravel/laravel --prefer-dist laravel-app
생성된 Laravel 프로젝트 디렉토리로 이동 후, 배포를 위해 꼭 필요한 설정파일 2개를 생성합니다. (project.toml, extentions.ini)
# cd laravel-app
# vi project.toml
[ build ] [[ build.env ]] name='BP_PHP_SERVER' value='nginx' [[ build.env ]] name='BP_PHP_WEB_DIR' value="public" [[ build.env ]] name='BP_PHP_ENABLE_HTTPS_REDIRECT' value='false' |
* 설명
- 웹서버를 httpd 로 사용하고 싶은 경우 nginx 대신 httpd 를 입력합니다.
- nginx 의 추가 설정이 필요한 경우 (예: DirectoryIndex) .nginx.conf.d/location-server.conf 파일을 생성하고 아래와 같이 필요한 설정을 넣으면 됩니다.
location / {
try_files $uri $uri/index.html;
}
# mkdir .php.ini.d# vi .php.ini.d/extentions.ini
extension = curl extension = fileinfo extension = openssl |
* 참고
다른 PaaS 서비스를 제공하는 사이트에서는 소스코드가 어떤 모듈을 사용하는지 모르기 때문에, 모든 모듈을 추가하여 제공합니다. CF 환경에서 테스트 결과 아래 모듈이 사용 가능했습니다.
Laravel 프로젝트를 배포합니다.
# cf push laravel-app
간단히 curl 명령으로 확인이 가능하며,
# curl --insecure https://laravel-app.apps.az1.sysdocu.kr
위에서 네임서버 설정을 미리 해두었으므로 웹브라우저에서도 출력된 도메인으로 접속하여 Laravel 초기 페이지 확인이 가능합니다.
> https://laravel-app.apps.az1.sysdocu.kr
* 참고
새로운 세션에서 API 연결은 되었지만, CloudFoundry 로그인 시도 할때 아래와 같이 인증 실패 메세지가 출력되었다면
# cf api https://api.az1.sysdocu.kr--skip-ssl-validation
Setting API endpoint to https://api.az1.sysdocu.kr...
OK
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.
root@master:~# cf login
API endpoint: https://api.az1.sysdocu.kr
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 환경 변수를 설정합니다.
# export KUBECONFIG=/etc/kubernetes/admin.conf
'리눅스 > PaaS' 카테고리의 다른 글
Heroku 에 PHP 애플리케이션 배포하는 2가지 방법 (Web, CLI), Laravel 배포 방법 (0) | 2023.11.24 |
---|---|
CF (Cloud Foundry) Paketo Buildpack 의 개발언어 제공 버전 확인하기 (0) | 2023.11.21 |
Ubuntu 22.04 Kind Cluster 에서 Korifi 설치하기 (스크립트를 이용한 간단 설치) (0) | 2023.11.02 |
오픈 클라우드 플랫폼 K-PaaS (구 PaaS-TA) 6.5 Container Platform Portal 사용하기 (0) | 2023.08.09 |
오픈 클라우드 플랫폼 K-PaaS (구 PaaS-TA) 6.5 Container Platform 설치 (on Openstack) (0) | 2023.07.07 |