Kubernetes 1.28, Kind 에서 Korifi 설치 및 PHP 애플리케이션 배포하기

리눅스/PaaS|2023. 10. 24. 16:09
반응형

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/

- 참고 : https://deep75.medium.com/korifi-api-cloud-foundry-v3-exp%C3%A9rimentale-dans-kubernetes-b759ddd38443

 

[환경]

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 환경에서 테스트 결과 아래 모듈이 사용 가능했습니다.

extentions.ini
0.00MB

 

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

 

반응형

댓글()