附註:
- 此教學課程需要存取 Oracle Cloud。若要註冊免費帳戶,請參閱開始使用 Oracle Cloud Infrastructure Free Tier 。
- 它使用 Oracle Cloud Infrastructure 憑證、租用戶及區間的範例值。完成實驗室時,請以雲端環境特有的值取代這些值。
在 OKE 上部署 Longhorn for Kubernetes
簡介
Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE) 是一項完全受管理、可擴展且高可用性的服務,可用來將容器化應用系統部署至雲端。您可以指定應用程式所需的運算資源,OKE 則會在現有 OCI 租用戶的 Oracle Cloud Infrastructure (OCI) 上佈建這些資源。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(要連附於起始位置的區塊儲存體大小)、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 -
-
複查並按一下建立叢集,然後等待叢集變成可用。
-
叢集可用之後,請依序前往節點集區和節點。您可以查看節點處於就緒狀態、按一下任何節點、開啟執行處理詳細資訊頁面、前往連附的區塊磁碟區,以及確認已將區塊磁碟區 (大小和 vpu,如
cloud-init命令檔中所述) 連附至執行處理。
作業 2:設定 Longhorn
-
叢集可用之後,您就可以使用 Cloud Shell 存取叢集,按一下存取叢集,然後在 Cloud Shell 中複製並執行命令。

-
執行
kubectl get node以取得可排程節點的清單。
-
為了讓 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
-
執行描述節點命令以確認已修正節點。
kubectl describe node <node name>
作業 3:安裝 Longhorn
-
在此教學課程中,我們使用 Helm 在 OKE 叢集上部署 Longhorn。請依照本文件中提及的指示進行:使用 Helm 安裝。
-
請執行下列命令來部署 Longhorn。
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.3.2 --set defaultSettings.createDefaultDiskLabeledNodes=true
注意:部署時,將
defaultSettings.createDefaultDiskLabeledNodes特性設為 true。這會讓冗長使用先前提供的連附區塊磁碟區組態。 -
確認 Pod 已建立並在執行中。

-
若要讓 UI 能夠更進一步檢視 Longhorn 及其管理,請依照本文件所述安裝 Ingress Controller:範例:設定叢集上的 Ingress Controller 。
-
建立
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 可讓您完全控制 Kubernetes 部署的儲存解決方案,但擴展 Longhorn 仍是手動流程,有 3 種方法可以擴展 Longhorn 設定。
-
增加連附區塊磁碟區的大小或效能單位:這是手動處理作業,您必須個別調整每個區塊磁碟區,並且在節點上執行部分命令檔以擴充儲存。如需詳細資訊,請參閱調整磁碟區大小。
-
連附更多磁碟區:您必須手動建立磁碟區並將其連附至節點。
-
增加節點以調整叢集:因為我們已經提供
cloud-init命令檔,所以會建立區塊磁碟區並將其連附至節點。節點準備就緒之後,就必須進行修正 (如 Task 2.3 中所述),Longhorn 才能辨識連附的儲存體。
注意:您可以修改命令檔,將想要的區塊磁碟區數目附加到單一節點。
相關連結
認可
- 作者 - 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.