Ubuntu 22.04 단일 서버 K3S Cluster 에서 Korifi 설치하기
K3S 는 경량 Kubernetes (클러스터 형태의 컨테이너 오케스트레이션) 구현체로, 리소스 사용이 적고 더 빠르게 구동됩니다.
때문에 Korifi 를 테스트 해보기 위한 사용자는 K3S 에서 구현해보고, 실제 서비스 구현 또는 대규모 분산 시스템을 원할 경우 다른 포스팅 (https://sysdocu.tistory.com/1904) 을 참고하여 구축하시기 바랍니다.
여기에서는 Korifi 0.7.1 / 0.10.0 / 0.11.0 세가지 방법으로 구분하여 작성하였으며, 꼭 필요한 명령어만 기술하고 설명을 최소화 하였습니다.
1. 사전 작업
Korifi 설치 및 사용에 필요한 명령어와 운영환경 K3S 를 우선 설치 합니다.
1) Kubectl
# curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
2) 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
3) Helm
# wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
# tar xvzf helm-v3.12.0-linux-amd64.tar.gz
# mv linux-amd64/helm /usr/local/bin/
4) K3S 설치
# curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode 644
# export KUBECONFIG="/etc/rancher/k3s/k3s.yaml"
앞으로 SSH 접속시마다 자동으로 환경이 로드 되도록 하면 편리합니다.
# echo 'export KUBECONFIG="/etc/rancher/k3s/k3s.yaml"' >> ~/.bashrc
2. 설치 진행
1) 환경변수 설정
# export ROOT_NAMESPACE="cf"
# export KORIFI_NAMESPACE="korifi"
# export ADMIN_USERNAME="cf-admin"
# export BASE_DOMAIN="az1.sysdocu.kr"
2) Cert Manager 설치
# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.2/cert-manager.yaml
3) Kpack 설치
# kubectl apply -f https://github.com/buildpacks-community/kpack/releases/download/v0.13.2/release-0.13.2.yaml
4) 네임스페이스 생성
# 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
5) Contour 설치
(Korifi 0.7.1 / 0.10.0 설치시)
# kubectl apply -f https://projectcontour.io/quickstart/contour.yaml
(Korifi 0.11.0 설치시)
정적 프로비저닝 방법으로 contour 를 설치합니다.
# export GATEWAY_CLASS_NAME="contour"
# kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/experimental-install.yaml
# kubectl apply -f - <<EOF
kind: GatewayClass
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: $GATEWAY_CLASS_NAME
spec:
controllerName: projectcontour.io/gateway-controller
EOF
# kubectl apply -f https://projectcontour.io/quickstart/contour-gateway.yaml
마지막 파일에 사용하지 않는 example 등의 이름으로 설치되는 요소가 있지만, 동작 여부만 확인할 예정이므로 그대로 설치하였습니다.
6) DNS 설정
본 매뉴얼은 서버 한대로 구성하는 것이므로 DNS 에서 아래 사용할 도메인의 IP 를 현재 서버 IP 로 셋팅해주어야 합니다.
- API 서버 도메인 : api.az1.sysdocu.kr - 115.68.248.245
- 애플리케이션이 사용할 도메인 : *.apps.az1.sysdocu.kr - 115.68.248.245
7) Secret 생성
여기에서는 실제 사용 가능한 Repository 정보를 입력해야 합니다.
# 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"
8) Korifi 설치
여기에서도 실제 사용 가능한 Repository 정보를 입력해야 합니다.
(Korifi 0.7.1 설치시)
# helm install korifi https://github.com/cloudfoundry/korifi/releases/download/v0.7.1/korifi-0.7.1.tgz \
--namespace="$KORIFI_NAMESPACE" \
--set=global.generateIngressCertificates=true \
--set=global.rootNamespace="$ROOT_NAMESPACE" \
--set=global.containerRegistrySecret="image-registry-credentials" \
--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=kpackImageBuilder.builderRepository="registry.az1.sysdocu.kr:5000/kpack-builder" \
--wait
(Korifi 0.10.0 설치시)
# helm install korifi https://github.com/cloudfoundry/korifi/releases/download/v0.10.0/korifi-0.10.0.tgz \
--namespace="$KORIFI_NAMESPACE" \
--set=generateIngressCertificates=true \
--set=rootNamespace="$ROOT_NAMESPACE" \
--set=containerRegistrySecret="image-registry-credentials" \
--set=adminUserName="$ADMIN_USERNAME" \
--set=api.apiServer.url="api.$BASE_DOMAIN" \
--set=defaultAppDomainName="apps.$BASE_DOMAIN" \
--set=containerRepositoryPrefix="registry.az1.sysdocu.kr:5000/" \
--set=kpackImageBuilder.builderRepository="registry.az1.sysdocu.kr:5000/kpack-builder" \
--wait
(Korifi 0.11.0 설치시)
# helm install korifi https://github.com/cloudfoundry/korifi/releases/download/v0.11.0/korifi-0.11.0.tgz \
--namespace="$KORIFI_NAMESPACE" \
--set=adminUserName="$ADMIN_USERNAME" \
--set=defaultAppDomainName="apps.$BASE_DOMAIN" \
--set=generateIngressCertificates="true" \
--set=api.apiServer.url="api.$BASE_DOMAIN" \
--set=containerRepositoryPrefix="registry.az1.sysdocu.kr:5000/" \
--set=kpackImageBuilder.clusterStackBuildImage="paketobuildpacks/build-jammy-full" \
--set=kpackImageBuilder.clusterStackRunImage="paketobuildpacks/run-jammy-full" \
--set=kpackImageBuilder.builderRepository="registry.az1.sysdocu.kr:5000/kpack-builder" \
--set=networking.gatewayClass="$GATEWAY_CLASS_NAME" \
--wait
9) CF 관리자 계정 생성
CF 관리자 계정 cf-admin 을 추가합니다.
생성 명령 절차가 길어 명령어 앞에 프롬프트를 제거하였습니다. 아래 명령을 전체 복사하여 실행하면 됩니다.
cf-admin 이 아닌 계정명으로 변경하고 싶을 경우 아래 내용에서 cf-admin 문자열을 다른 계정 ID 로 치환하여 실행하면 됩니다.
openssl genrsa -out cf-admin.key 2048
openssl req -new -key cf-admin.key -out cf-admin.csr -subj "/CN=cf-admin"
tmp=`cat cf-admin.csr | base64 | tr -d "\n"`
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: cf-admin
spec:
request: $tmp
signerName: kubernetes.io/kube-apiserver-client
#expirationSeconds: 604800 # 1주일 (옵션 미사용시 : 1년 유효)
usages:
- client auth
EOF
kubectl certificate approve cf-admin
kubectl get csr cf-admin -o jsonpath='{.status.certificate}'| base64 -d > cf-admin.crt
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
kubectl create rolebinding developer-binding-cf-admin --role=developer --user=cf-admin
kubectl config set-credentials cf-admin --client-key=cf-admin.key --client-certificate=cf-admin.crt --embed-certs=true
kubectl config set-context cf-admin --cluster=kubernetes --user=cf-admin
3. 애플리케이션 배포
1) Cloud Foundry API 로그인
# cf api https://api.$BASE_DOMAIN --skip-ssl-validation
# cf auth cf-admin
2) 조직 및 공간 생성
# cf create-org org1
# cf create-space -o org1 space1
# cf target -o org1 -s space1
3) 애플리케이션 배포
준비된 소스 코드가 없다면, 공개된 샘플 소스 코드를 다운로드하고 배포해 봅니다.
# git clone https://github.com/sylvainkalache/sample-web-apps
# cd sample-web-apps/java
# cf push java1
배포할때 특이점은, Korifi 0.7.1 의 경우 동작 프로세스가 화면에 잘 출력되는 반면, 0.10.0 부터는 처리과정 출력 없이 마지막에 인스턴스를 시작하는 단계에서부터 출력되므로, 중간에 멈춘것 같은 느낌이 들지만 인내를 가지고 기다려 보시기 바랍니다. timeout 시간이 15분으로, 그 전까지 배포되지 않을 경우 에러가 출력됩니다.
4) 애플리케이션 확인
배포된 애플리케이션에 접근합니다.
# curl --insecure https://java1.apps.az1.sysdocu.kr
Hello, World!
Java Version: 17.0.10
'리눅스 > PaaS' 카테고리의 다른 글
gitlab-runner 설치 및 GitLab CI/CD Pipeline 사용하기 (0) | 2024.02.08 |
---|---|
Ubuntu 22.04 에서 Gogs 설치 및 설정하기 (0) | 2024.02.05 |
GitLab CLI Tool (GLab) 설치 및 사용하기 (0) | 2024.01.23 |
Ubuntu 22.04 에서 GitLab CE (Community Edition) 설치 및 사용하기 (0) | 2024.01.19 |
Kind Cluster + Korifi 설치 스크립트로 환경 구성시 CF 로 배포되는 앱 CPU Limit 제한 설정하기 (0) | 2024.01.16 |