documentation.suse.com / Documentação do SUSE Edge / Componentes / SUSE Storage

O SUSE Storage é um sistema de armazenamento em blocos distribuído, leve, confiável e amigável projetado para Kubernetes. Trata-se de um produto com base no Longhorn, um projeto de código-fonte aberto inicialmente desenvolvido pela Rancher Labs e que agora é incubado pela CNCF.

17.1 Pré-requisitos

Se você está seguindo este guia, já deve ter os seguintes itens disponíveis:

  • No mínimo, um host com o SUSE Linux Micro 6.1 instalado, que pode ser físico ou virtual

  • Um cluster Kubernetes instalado, K3s ou RKE2

  • Helm

17.2 Instalação manual do SUSE Storage

17.2.1 Instalando o Open-iSCSI

Um requisito essencial da implantação e do uso do SUSE Storage é a instalação do pacote open-iscsi e a execução do daemon iscsid em todos os nós Kubernetes. Isso é necessário porque o Longhorn conta com o iscsiadm no host para fornecer volumes persistentes ao Kubernetes.

Vamos instalá-lo:

transactional-update pkg install open-iscsi

Como o SUSE Linux Micro é um sistema operacional imutável, é importante notar que o pacote será instalado apenas em um novo instantâneo após a conclusão da operação. Para carregá-lo e para que o daemon iscsid seja executado, é necessário reinicializar no novo instantâneo que acabamos de criar. Execute o comando de reinicialização quando você estiver pronto:

reboot
Dica
Dica

Para obter mais ajuda na instalação do open-iscsi, consulte a documentação oficial do Longhorn.

17.2.2 Instalando o SUSE Storage

Há várias maneiras de instalar o SUSE Storage em clusters Kubernetes. Este guia adota a instalação pelo Helm, mas você poderá seguir a documentação oficial caso queira outra abordagem.

  1. Adicione o repositório de gráficos Helm do Rancher:

    helm repo add rancher-charts https://charts.rancher.io/
  2. Busque os gráficos mais recentes no repositório:

    helm repo update
  3. Instale o SUSE Storage no namespace longhorn-system:

    helm install longhorn-crd rancher-charts/longhorn-crd --namespace longhorn-system --create-namespace --version 106.2.0+up1.8.1
    helm install longhorn rancher-charts/longhorn --namespace longhorn-system --version 106.2.0+up1.8.1
  4. Confirme se a implantação foi bem-sucedida:

    kubectl -n longhorn-system get pods
    localhost:~ # kubectl -n longhorn-system get pod
    NAMESPACE         NAME                                                READY   STATUS      RESTARTS        AGE
    longhorn-system   longhorn-ui-5fc9fb76db-z5dc9                        1/1     Running     0               90s
    longhorn-system   longhorn-ui-5fc9fb76db-dcb65                        1/1     Running     0               90s
    longhorn-system   longhorn-manager-wts2v                              1/1     Running     1 (77s ago)     90s
    longhorn-system   longhorn-driver-deployer-5d4f79ddd-fxgcs            1/1     Running     0               90s
    longhorn-system   instance-manager-a9bf65a7808a1acd6616bcd4c03d925b   1/1     Running     0               70s
    longhorn-system   engine-image-ei-acb7590c-htqmp                      1/1     Running     0               70s
    longhorn-system   csi-attacher-5c4bfdcf59-j8xww                       1/1     Running     0               50s
    longhorn-system   csi-provisioner-667796df57-l69vh                    1/1     Running     0               50s
    longhorn-system   csi-attacher-5c4bfdcf59-xgd5z                       1/1     Running     0               50s
    longhorn-system   csi-provisioner-667796df57-dqkfr                    1/1     Running     0               50s
    longhorn-system   csi-attacher-5c4bfdcf59-wckt8                       1/1     Running     0               50s
    longhorn-system   csi-resizer-694f8f5f64-7n2kq                        1/1     Running     0               50s
    longhorn-system   csi-snapshotter-959b69d4b-rp4gk                     1/1     Running     0               50s
    longhorn-system   csi-resizer-694f8f5f64-r6ljc                        1/1     Running     0               50s
    longhorn-system   csi-resizer-694f8f5f64-k7429                        1/1     Running     0               50s
    longhorn-system   csi-snapshotter-959b69d4b-5k8pg                     1/1     Running     0               50s
    longhorn-system   csi-provisioner-667796df57-n5w9s                    1/1     Running     0               50s
    longhorn-system   csi-snapshotter-959b69d4b-x7b7t                     1/1     Running     0               50s
    longhorn-system   longhorn-csi-plugin-bsc8c                           3/3     Running     0               50s

17.3 Criando volumes do SUSE Storage

O SUSE Storage usa os recursos do Kubernetes chamados StorageClass para provisionar automaticamente os objetos PersistentVolume aos pods. Pense no StorageClass como um método para os administradores descreverem classes ou perfis do armazenamento que eles oferecem.

Vamos criar um StorageClass com algumas opções padrão:

kubectl apply -f - <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn-example
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880" # 48 hours in minutes
  fromBackup: ""
  fsType: "ext4"
EOF

Agora que temos um StorageClass, precisamos que um PersistentVolumeClaim faça referência a ele. Um PersistentVolumeClaim (PVC) é uma solicitação de armazenamento feita pelo usuário. Os PVCs consomem os recursos PersistentVolume. As declarações podem solicitar tamanhos e modos de acesso específicos (por exemplo, é possível montá-las como leitura/gravação uma vez ou como somente leitura várias vezes).

Vamos criar um PersistentVolumeClaim:

kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-volv-pvc
  namespace: longhorn-system
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn-example
  resources:
    requests:
      storage: 2Gi
EOF

Pronto! Com a criação do PersistentVolumeClaim, podemos prosseguir e anexá-lo a um Pod. Quando o Pod é implantado, o Kubernetes cria o volume do Longhorn e o vincula ao Pod quando há armazenamento disponível.

kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: volume-test
  namespace: longhorn-system
spec:
  containers:
  - name: volume-test
    image: nginx:stable-alpine
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: volv
      mountPath: /data
    ports:
    - containerPort: 80
  volumes:
  - name: volv
    persistentVolumeClaim:
      claimName: longhorn-volv-pvc
EOF
Dica
Dica

O conceito de armazenamento no Kubernetes é um tópico complexo, porém importante. Mencionamos rapidamente alguns do recursos mais comuns do Kubernetes, mas sugerimos que você se familiarize com a documentação de terminologia que o Longhorn oferece.

Neste exemplo, o resultado deve ter esta aparência:

localhost:~ # kubectl get storageclass
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
longhorn (default)   driver.longhorn.io   Delete          Immediate           true                   12m
longhorn-example     driver.longhorn.io   Delete          Immediate           true                   24s

localhost:~ # kubectl get pvc -n longhorn-system
NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
longhorn-volv-pvc   Bound    pvc-f663a92e-ac32-49ae-b8e5-8a6cc29a7d1e   2Gi        RWO            longhorn-example   54s

localhost:~ # kubectl get pods -n longhorn-system
NAME                                                READY   STATUS    RESTARTS      AGE
csi-attacher-5c4bfdcf59-qmjtz                       1/1     Running   0             14m
csi-attacher-5c4bfdcf59-s7n65                       1/1     Running   0             14m
csi-attacher-5c4bfdcf59-w9xgs                       1/1     Running   0             14m
csi-provisioner-667796df57-fmz2d                    1/1     Running   0             14m
csi-provisioner-667796df57-p7rjr                    1/1     Running   0             14m
csi-provisioner-667796df57-w9fdq                    1/1     Running   0             14m
csi-resizer-694f8f5f64-2rb8v                        1/1     Running   0             14m
csi-resizer-694f8f5f64-z9v9x                        1/1     Running   0             14m
csi-resizer-694f8f5f64-zlncz                        1/1     Running   0             14m
csi-snapshotter-959b69d4b-5dpvj                     1/1     Running   0             14m
csi-snapshotter-959b69d4b-lwwkv                     1/1     Running   0             14m
csi-snapshotter-959b69d4b-tzhwc                     1/1     Running   0             14m
engine-image-ei-5cefaf2b-hvdv5                      1/1     Running   0             14m
instance-manager-0ee452a2e9583753e35ad00602250c5b   1/1     Running   0             14m
longhorn-csi-plugin-gd2jx                           3/3     Running   0             14m
longhorn-driver-deployer-9f4fc86-j6h2b              1/1     Running   0             15m
longhorn-manager-z4lnl                              1/1     Running   0             15m
longhorn-ui-5f4b7bbf69-bln7h                        1/1     Running   3 (14m ago)   15m
longhorn-ui-5f4b7bbf69-lh97n                        1/1     Running   3 (14m ago)   15m
volume-test                                         1/1     Running   0             26s

17.4 Acessando a IU

Se você instalou o Longhorn com o kubectl ou o Helm, precisa configurar um controle de entrada para permitir o tráfego externo no cluster. A autenticação não está habilitada por padrão. Se o app de catálogo do Rancher foi usado, o Rancher criou automaticamente um controlador de entrada com controle de acesso (rancher-proxy).

  1. Obtenha o endereço IP do serviço externo do Longhorn:

    kubectl -n longhorn-system get svc
  2. Depois que você recuperar o endereço IP do longhorn-frontend, poderá começar a usar a IU navegando até ela pelo navegador.

17.5 Instalando com o Edge Image Builder

O SUSE Edge usa o Capítulo 11, Edge Image Builder para personalizar as imagens base do sistema operacional SUSE Linux Micro. Vamos demonstrar como fazer isso para provisionar um cluster RKE2 junto com o Longhorn.

Vamos criar o arquivo de definição:

export CONFIG_DIR=$HOME/eib
mkdir -p $CONFIG_DIR

cat << EOF > $CONFIG_DIR/iso-definition.yaml
apiVersion: 1.2
image:
  imageType: iso
  baseImage: SL-Micro.x86_64-6.1-Base-SelfInstall-GM.install.iso
  arch: x86_64
  outputImageName: eib-image.iso
kubernetes:
  version: v1.32.4+rke2r1
  helm:
    charts:
      - name: longhorn
        version: 106.2.0+up1.8.1
        repositoryName: longhorn
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
      - name: longhorn-crd
        version: 106.2.0+up1.8.1
        repositoryName: longhorn
        targetNamespace: longhorn-system
        createNamespace: true
        installationNamespace: kube-system
    repositories:
      - name: longhorn
        url: https://charts.rancher.io
operatingSystem:
  packages:
    sccRegistrationCode: <reg-code>
    packageList:
      - open-iscsi
  users:
  - username: root
    encryptedPassword: \$6\$jHugJNNd3HElGsUZ\$eodjVe4te5ps44SVcWshdfWizrP.xAyd71CVEXazBJ/.v799/WRCBXxfYmunlBO2yp1hm/zb4r8EmnrrNCF.P/
EOF
Nota
Nota

A personalização de qualquer um dos valores do gráfico Helm é possível com um arquivo separado fornecido em helm.charts[].valuesFile. Consulte a documentação upstream para obter detalhes.

Vamos criar a imagem:

podman run --rm --privileged -it -v $CONFIG_DIR:/eib registry.suse.com/edge/3.3/edge-image-builder:1.2.1 build --definition-file $CONFIG_DIR/iso-definition.yaml

Após a criação da imagem, você poderá usá-la para instalar o sistema operacional em um host físico ou virtual. Depois que o provisionamento é concluído, é possível fazer login no sistema usando o par de credenciais root:eib.

Verifique se o Longhorn foi implantado com sucesso:

localhost:~ # /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml -n longhorn-system get pods
NAME                                                READY   STATUS    RESTARTS        AGE
csi-attacher-5c4bfdcf59-qmjtz                       1/1     Running   0               103s
csi-attacher-5c4bfdcf59-s7n65                       1/1     Running   0               103s
csi-attacher-5c4bfdcf59-w9xgs                       1/1     Running   0               103s
csi-provisioner-667796df57-fmz2d                    1/1     Running   0               103s
csi-provisioner-667796df57-p7rjr                    1/1     Running   0               103s
csi-provisioner-667796df57-w9fdq                    1/1     Running   0               103s
csi-resizer-694f8f5f64-2rb8v                        1/1     Running   0               103s
csi-resizer-694f8f5f64-z9v9x                        1/1     Running   0               103s
csi-resizer-694f8f5f64-zlncz                        1/1     Running   0               103s
csi-snapshotter-959b69d4b-5dpvj                     1/1     Running   0               103s
csi-snapshotter-959b69d4b-lwwkv                     1/1     Running   0               103s
csi-snapshotter-959b69d4b-tzhwc                     1/1     Running   0               103s
engine-image-ei-5cefaf2b-hvdv5                      1/1     Running   0               109s
instance-manager-0ee452a2e9583753e35ad00602250c5b   1/1     Running   0               109s
longhorn-csi-plugin-gd2jx                           3/3     Running   0               103s
longhorn-driver-deployer-9f4fc86-j6h2b              1/1     Running   0               2m28s
longhorn-manager-z4lnl                              1/1     Running   0               2m28s
longhorn-ui-5f4b7bbf69-bln7h                        1/1     Running   3 (2m7s ago)    2m28s
longhorn-ui-5f4b7bbf69-lh97n                        1/1     Running   3 (2m10s ago)   2m28s
Nota
Nota

Essa instalação não funciona em ambientes totalmente air-gapped. Para esses casos, consulte a Seção 27.8, “Instalação do SUSE Storage”.

Documentation survey