주:
- 이 사용지침서에서는 Oracle Cloud에 액세스해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마치면 이러한 값을 자신의 클라우드 환경과 관련된 값으로 대체합니다.
OKE에 Kubernetes용 Longhorn 배치
소개
Oracle Cloud Infrastructure Container Engine for Kubernetes(OKE)는 확장 가능한 완전 관리형 고가용성 서비스로, 컨테이너형 애플리케이션을 클라우드에 배치하는 데 사용할 수 있습니다. 애플리케이션에 필요한 컴퓨트 리소스를 지정하면 OKE가 기존 OCI 테넌시의 OCI(Oracle Cloud Infrastructure)에서 해당 리소스를 프로비저닝합니다. Container Engine for Kubernetes는 호스트 클러스터 전반에서 컨테이너화된 애플리케이션의 배치, 크기 조정 및 관리를 자동화하는 데 사용하는 오픈 소스 시스템인 Kubernetes를 사용합니다.
OCI Block Volume 서비스는 데이터에 영구적이고 내구성이 뛰어난 고성능 블록 스토리지를 제공하며 OKE는 블록 볼륨을 Kubernetes 환경에 대한 영구 디스크로 활용할 수 있으며 OKE에서 전담 관리합니다. 영구 스토리지 솔루션을 완벽하게 제어하려는 경우 Longhorn을 OKE에 배포하여 스토리지 클래스로 사용할 수 있습니다. 영구 볼륨, 확장, 백업 및 스케줄링을 완벽하게 제어할 수 있습니다.
목표
- OKE에서 Longhorn을 저장 솔루션으로 배치하고 사용합니다.
필요 조건
-
Oracle Cloud 테넌시에 액세스합니다.
-
테넌시에 설정된 가상 클라우드 네트워크입니다.
-
OKE에 대해 설정된 모든 필수 정책입니다.
작업 1: OKE 클러스터 만들기
-
OCI 콘솔에 로그인하여 Oracle Container Engine for Kubernetes로 이동하고 생성을 누릅니다.
-
클러스터 생성 마법사에서 사용자정의 생성을 누릅니다.
-
클러스터 이름을 지정하고 사용할 Kubernetes 버전을 선택하고 마법사 하단에서 다음을 누릅니다.
주: 클러스터 생성부터 시작하기 전에 VCN, 서브넷 및 경로를 설정해야 합니다.
-
네트워킹 유형 중 하나를 선택할 수 있습니다. VCN 네이티브 네트워킹은 더 나은 성능을 제공합니다. VCN 고유 네트워킹을 선택할 경우 서브넷에 사용 가능한 IP 주소가 충분한지 확인하십시오.
-
노드 풀을 구성하고 원하는 컴퓨트 리소스를 선택합니다. 고급 옵션에서 아래 사용자정의
cloud-init
스크립트를 붙여 넣습니다. -
OKE는 노드 템플리트를 수정하는 옵션을 제공하지 않으므로 블록 볼륨을 연결하려면 노드 초기화 시
cloud-init
스크립트를 실행해야 합니다. 스크립트는 지정된 크기 및 성능의 블록 볼륨을 생성하여 초기화 시 노드에 연결합니다. -
필요에 따라 스크립트에서
size_in_gbs
(init 시 연결할 블록 스토리지 크기),vpus_per_gb
(블록 스토리지 연결의 경우 gb당 vpu) 및mode
(첨부 모드, PARA 또는 ISCSI) 변수를 수정해야 합니다.
동적 그룹을 생성하고 이 그룹이 블록 스토리지에 대한 액세스 관리를 제공해야 하므로 스크립트에서 인스턴스 주체 인증을 사용할 수 있습니다.
cloud-init
스크립트:#!/bin/bash curl --fail -H "Authorization: Bearer Oracle" -L0 http://169.254.169.254/opc/v2/instance/metadata/oke_init_script | base64 --decode >/var/run/oke-init.sh bash /var/run/oke-init.sh echo "installing python3-pip , oci sdk\n" sudo yum install python3 -y sudo yum install python3-pip -y pip3 install oci pip3 install requests cat << EOF > pyscript.py #!/usr/bin/python import oci import requests size_in_gbs = 200 vpus_per_gb = 10 mode = 'PARA' device_path = "/dev/oracleoci/oraclevdb" signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() compute_client = oci.core.ComputeClient({}, signer = signer) block_storage_client = oci.core.BlockstorageClient({}, signer = signer) def get_current_instance_details(): r = requests.get(url= 'http://169.254.169.254/opc/v1/instance') return r.json() def create_volume(block_storage, compartment_id, availability_domain, display_name: str): print("--- creating block volume ---") result = block_storage.create_volume( oci.core.models.CreateVolumeDetails( compartment_id=compartment_id, availability_domain=availability_domain, display_name=display_name, size_in_gbs = size_in_gbs, vpus_per_gb = vpus_per_gb ) ) volume = oci.wait_until( block_storage, block_storage.get_volume(result.data.id), 'lifecycle_state', 'AVAILABLE' ).data print('--- Created Volume ocid: {} ---'.format(result.data.id)) return volume def attach_volume(instance_id, volume_id,device_path): volume_attachment_response = "" if mode == 'ISCSI': print("--- Attaching block volume {} to instance {}---".format(volume_id,instance_id)) volume_attachment_response = compute_client.attach_volume( oci.core.models.AttachIScsiVolumeDetails( display_name='IscsiVolAttachment', instance_id=instance_id, volume_id=volume_id, device= device_path ) ) elif mode == 'PARA': volume_attachment_response = compute_client.attach_volume( oci.core.models.AttachParavirtualizedVolumeDetails( display_name='ParavirtualizedVolAttachment', instance_id=instance_id, volume_id=volume_id, device= device_path ) ) oci.wait_until( compute_client, compute_client.get_volume_attachment(volume_attachment_response.data.id), 'lifecycle_state', 'ATTACHED' ) print("--- Attaching complete block volume {} to instance {}---".format(volume_id,instance_id)) print(volume_attachment_response.data) # Call instance metadata uri to get current instace details instanceDetails = get_current_instance_details() print(instanceDetails) volume = create_volume(block_storage= block_storage_client, compartment_id= instanceDetails['compartmentId'], availability_domain=instanceDetails['availabilityDomain'], display_name= instanceDetails['displayName']) attach_volume(instance_id=instanceDetails['id'], volume_id=volume.id, device_path= device_path) EOF echo "running python script\n" chmod 755 pyscript.py ./pyscript.py echo "creating file system on volume\n" sudo /sbin/mkfs.ext4 /dev/oracleoci/oraclevdb echo "mounting volume\n" sudo mkdir /mnt/volume sudo mount /dev/oracleoci/oraclevdb /mnt/volume echo "adding entry to fstab\n" echo "/dev/oracleoci/oraclevdb /mnt/volume ext4 defaults,_netdev,nofail 0 2" | sudo tee -a /etc/fstab
-
-
클러스터 만들기를 검토하고 클러스터가 사용 가능해질 때까지 기다립니다.
-
클러스터를 사용할 수 있게 되면 노드 풀, 노드 순으로 이동합니다. 노드가 준비 상태인지 확인하고 노드를 누르면 인스턴스 세부정보 페이지가 열리고 연결된 블록 볼륨으로 이동하여 블록 볼륨(
cloud-init
스크립트에서 언급한 크기 및 vpu)이 인스턴스에 연결되어 있는지 확인할 수 있습니다.
작업 2: Longhorn 설정
-
클러스터를 사용할 수 있게 되면 클라우드 셸을 사용하여 클러스터에 액세스하고 클러스터 액세스를 누른 다음 클라우드 셸에서 명령을 복사하여 실행할 수 있습니다.
-
kubectl get node
를 실행하여 예약 가능한 노드 목록을 가져옵니다. -
Longhorn이 연결된 디스크를 인식하려면 Longhorn 기본 디스크 설정에 설명된 대로 노드에 레이블 및 주석을 추가해야 합니다. 이를 위해
patch.yaml
파일을 만들어 노드에 패치를 적용하려고 합니다.metadata: labels: node.longhorn.io/create-default-disk: "config" annotations: node.longhorn.io/default-disks-config: '[ { "path":"/var/lib/longhorn", "allowScheduling":true }, { "path":"/mnt/volume", "allowScheduling":true } ]'
-
각 노드에 대해 다음 명령을 실행합니다.
kubectl patch node <node name> --patch-file patch.yaml
-
describe node 명령을 실행하여 노드가 패치되었는지 확인합니다.
kubectl describe node <node name>
작업 3: Longhorn 설치
-
이 자습서에서는 Helm을 사용하여 OKE 클러스터에 Longhorn을 배치합니다. Install with Helm 문서에 언급된 지침을 따릅니다.
-
다음 명령을 실행하여 Longhorn을 배치합니다.
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.3.2 --set defaultSettings.createDefaultDiskLabeledNodes=true
주: 배치하는 동안
defaultSettings.createDefaultDiskLabeledNodes
속성을 true로 설정합니다. 이렇게 하면 longhorn이 앞에서 제공한 연결 블록 볼륨 구성을 사용하도록 지시합니다. -
포드가 만들어지고 실행 중인지 확인합니다.
-
UI가 Longhorn 및 해당 관리를 더 잘 볼 수 있도록 하려면 다음 문서에 설명된 대로 수신 컨트롤러를 설치합니다. 예: 클러스터에서 수신 컨트롤러 설정.
-
ingress.yaml
파일을 생성하여 Longhorn UI를 표시합니다.apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: longhorn-ingress namespace: longhorn-system annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: longhorn-frontend port: number: 80
-
kubectl apply -f ingress.yaml
를 실행하여 수신 게이트웨이를 사용하여 Longhorn UI를 표시합니다. -
다음 명령을 실행하여 게이트웨이 URL을 가져옵니다.
kubectl get ingress -n longhorn-system
. -
브라우저에서 IP 주소를 열어 Longhorn 콘솔에 액세스하고 라이브 상태인지 확인합니다.
사용 가능한 스토리지가 있고 사용할 준비가 된 것을 확인할 수 있습니다.
작업 4: 롱혼 배율 조정
Longhorn은 쿠버네티스 배포를 위한 스토리지 솔루션의 완전한 제어를 제공하지만, longhorn을 확장하는 것은 여전히 수동 프로세스이며, Longhorn 설정을 확장하는 3가지 방법이 있습니다.
-
연결된 블록 볼륨의 크기 또는 성능 단위 증가: 수동 프로세스이므로 각 블록 볼륨을 개별적으로 확장하고 노드에서 일부 스크립트를 실행하여 스토리지를 확장해야 합니다. 자세한 내용은 Resizing a Volume을 참조하십시오.
-
더 많은 볼륨 연결: 수동으로 볼륨을 만들어 노드에 연결해야 합니다.
-
노드를 늘려 클러스터를 확장합니다.
cloud-init
스크립트를 이미 제공했으므로 블록 볼륨을 만들어 노드에 연결합니다. Longhorn이 연결된 스토리지를 인식하려면 작업 2.3에 설명된 대로 노드를 패치해야 합니다.
주: 단일 노드에 원하는 수의 블록 볼륨을 연결하도록 스크립트를 수정할 수 있습니다.
관련 링크
확인
- 작가 - Mayank Kakani(OCI 클라우드 아키텍트)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Deploy Longhorn for Kubernetes on OKE
F76576-02
December 2023
Copyright © 2023, Oracle and/or its affiliates.