附註:

在 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 上,然後將其用作儲存類別。您可以完全控制永久磁碟區、調整規模、備份及排程。

目標

必要條件

作業 1:建立 OKE 叢集

  1. 登入 OCI 主控台,瀏覽至 Oracle Container Engine for Kubernetes ,然後按一下建立

  2. 建立叢集精靈中,按一下自訂建立

    自訂建立

  3. 指定叢集名稱,選取您要使用的 Kubernetes 版本,然後按一下精靈底部的下一步

    建立叢集

    注意:您必須先設定 VCN、子網路和路由,才能開始建立叢集

    • 您可以選擇其中一個網路類型。VCN 原生網路可提供更好的效能。如果您選擇 VCN 原生網路,請確定您的子網路有足夠的可用 IP 位址。

      網路類型

    • 設定節點集區,選擇所需的運算資源。在進階選項中,貼上下列自訂 cloud-init 指令碼。

      cloud-init script,雲端初始化命令檔

    • 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
    
  4. 複查並按一下建立叢集,然後等待叢集變成可用。

  5. 叢集可用之後,請依序前往節點集區節點。您可以查看節點處於就緒狀態、按一下任何節點、開啟執行處理詳細資訊頁面、前往連附的區塊磁碟區,以及確認已將區塊磁碟區 (大小和 vpu,如 cloud-init 命令檔中所述) 連附至執行處理。

    區塊磁碟區

作業 2:設定 Longhorn

  1. 叢集可用之後,您就可以使用 Cloud Shell 存取叢集,按一下存取叢集,然後在 Cloud Shell 中複製並執行命令。

    存取叢集

  2. 執行 kubectl get node 以取得可排程節點的清單。

    取得節點

  3. 為了讓 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
        }
    ]'
    
  4. 針對每個節點執行下列命令。

    kubectl patch node <node name> --patch-file patch.yaml

    修正程式節點

  5. 執行描述節點命令以確認已修正節點。

    kubectl describe node <node name>

    描述節點

作業 3:安裝 Longhorn

  1. 在此教學課程中,我們使用 Helm 在 OKE 叢集上部署 Longhorn。請依照本文件中提及的指示進行:使用 Helm 安裝

  2. 請執行下列命令來部署 Longhorn。

    helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.3.2 --set defaultSettings.createDefaultDiskLabeledNodes=true

    部署 Longhorn

    注意:部署時,將 defaultSettings.createDefaultDiskLabeledNodes 特性設為 true。這會讓冗長使用先前提供的連附區塊磁碟區組態。

  3. 確認 Pod 已建立並在執行中。

    檢查 Pod

  4. 若要讓 UI 能夠更進一步檢視 Longhorn 及其管理,請依照本文件所述安裝 Ingress Controller:範例:設定叢集上的 Ingress Controller

  5. 建立 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
    
  6. 執行 kubectl apply -f ingress.yaml 以使用傳入閘道顯示 Longhorn UI。

    傳入閘道

  7. 執行下列命令來取得閘道 URL。

    kubectl get ingress -n longhorn-system.

    進入 IP

  8. 從瀏覽器開啟 IP 位址以存取 Longhorn 主控台並確認其為即時狀態。

    Longhorn UI

    您會看到儲存已可供使用且已可供使用。

任務 4:縮放長角

Longhorn 可讓您完全控制 Kubernetes 部署的儲存解決方案,但擴展 Longhorn 仍是手動流程,有 3 種方法可以擴展 Longhorn 設定。

  1. 增加連附區塊磁碟區的大小或效能單位:這是手動處理作業,您必須個別調整每個區塊磁碟區,並且在節點上執行部分命令檔以擴充儲存。如需詳細資訊,請參閱調整磁碟區大小

  2. 連附更多磁碟區:您必須手動建立磁碟區並將其連附至節點。

  3. 增加節點以調整叢集:因為我們已經提供 cloud-init 命令檔,所以會建立區塊磁碟區並將其連附至節點。節點準備就緒之後,就必須進行修正 (如 Task 2.3 中所述),Longhorn 才能辨識連附的儲存體。

注意:您可以修改命令檔,將想要的區塊磁碟區數目附加到單一節點。

認可

其他學習資源

瀏覽 docs.oracle.com/learn 的其他實驗室,或前往 Oracle Learning YouTube 頻道存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center