preloader
  • Início
  • Integração OpenShift com Storage HP Primera - Erros e Soluções

O software do sistema operacional (SO) HPE Primera fornece gerenciamento de armazenamento e provisionamento de volumes, porém sua configuração nem sempre funciona na primeira tentativa. Neste artigo irei apresentar os problemas que encontrei durante a integração de um storage HP Primera com um cluster OpenShift.

blog-thumb

Este artigo abordará dicas e soluções de como integrar o storage HP Primera com o OpenShift.

No cenário analisado, os servidores do cluster Red Hat OpenShift consomem volumes de disco através do protocolo Fibre Channel (FC). Já o Red Hat OpenShift como plataforma, utiliza o Operator HPE CSI para criar Persistent Volume Claims (PVCs) do tipo Block via FC (RWO), e do tipo File via NFS (RWX).

Eu não sou afiliado à HP, nem tampouco tenho interesses particulares no assunto. Também não sou especialista em produtos HP. Minha opinião sobre o tema supracitado é neutra, e neste material estou apenas apresentando uma visão técnica dos fatos.

De forma alguma este artigo tem a intenção de manipular opiniões, beneficiar ou denegrir produtos, ou ainda afetar decisões relacionadas a compra de insumos.


Ambiente utilizado

Neste laboratório foram utilizadas as seguintes versões de software:

* Red Hat OpenShift 4.14.30

* HPE CSI Operator 2.4.2

* HPE Primera Operating System 4.5.21


Documentação e material de apoio

A documentação da HP pode ser encontrada aqui. No entanto, já aviso que ela possui inconsistências e gaps, o que dependendo da implementação a ser realizada, podem gerar problemas. Desculpe se isso gera algum desconforto em alguém, mas é a verdade até a presente data.

Para saber mais sobre o Operator HPE CSI, visite sua página.

A propósito, o GIT do projeto pode ser encontrado aqui. Não deixe de ler as ISSUES deste projeto, pois elas contém dicas importantes.


Inconsistências na documentação

Existem algumas, onde o que mais me incomodou foi a falta de explicações claras sobre determinados itens, além dos erros. Vou citar apenas 1 exemplo de erro, para que esta parte do material não fique muito enfadonha.

Na documentação oficial HP, está escrito para usarmos a porta TCP 8080:

HPE CSI Documentation

Porém, em outra parte da mesma documentação, está escrito para usar TCP 443:

HPE CSI Documentation

Curioso, não?


Eu compreendo que nem sempre as pessoas envolvidas em um produto tem tempo de atualizar documentos ou criar KBs (knowledge bases) públicos. Porém, documentação errada é uma questão que atrapalha bastante quem trabalha como arquiteto, consultor ou sysadmin. Especialmente quando tempo disponível é um fator crítico.


A divergência de informação citada acima foi fácil de resolver, bastando apenas analisar como foi feito o deploy do serviço primera3par-csp-svc, identificando assim a porta TCP em uso no POD.


# oc get services -n hpe-storage

NAME                                                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
hpe-csi-operator-controller-manager-metrics-service   ClusterIP   XX.YY.ZZ.KK   <none>        8443/TCP   10d
primera3par-csp-svc                                   ClusterIP   XX.YY.ZZ.KK   <none>        8080/TCP   10d
 

Mas nem tudo é simples assim…


Como o operator HPE CSI funciona

Antes de seguir com as soluções para problemas comuns, vamos dar uma olhada no operator. Na versão utilizada, ao ser instalado, o operator prepara o ambiente e carrega um Helm Chart, onde este último faz toda a implementação dos recursos necessários.

HPE CSI Heml Chart


# oc get all -n hpe-storage

NAME                                                       READY   STATUS    RESTARTS        AGE
pod/hpe-csi-controller-746d8f6748-6j68d                    9/9     Running   3 (4d23h ago)   4d23h
pod/hpe-csi-node-677tk                                     2/2     Running   0               4d23h
pod/hpe-csi-node-bwklp                                     2/2     Running   0               4d23h
pod/hpe-csi-node-f2fdb                                     2/2     Running   9 (36h ago)     4d23h
pod/hpe-csi-node-f7n8m                                     2/2     Running   0               4d23h
pod/hpe-csi-node-kbc6d                                     2/2     Running   0               4d23h
pod/hpe-csi-node-l6nx5                                     2/2     Running   0               4d23h
pod/hpe-csi-node-m6k78                                     2/2     Running   0               4d23h
pod/hpe-csi-node-n75z2                                     2/2     Running   0               4d23h
pod/hpe-csi-node-qv8df                                     2/2     Running   0               4d23h
pod/hpe-csi-node-r6msx                                     2/2     Running   0               4d23h
pod/hpe-csi-node-stj5w                                     2/2     Running   0               4d23h
pod/hpe-csi-node-wm5fb                                     2/2     Running   0               4d23h
pod/hpe-csi-node-zzftk                                     2/2     Running   0               4d23h
pod/hpe-csi-operator-controller-manager-585f579bb9-mzwnd   2/2     Running   0               10d
pod/primera3par-csp-55d5db7dcf-s76jp                       1/1     Running   0               10d

NAME                                                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/hpe-csi-operator-controller-manager-metrics-service   ClusterIP   172.XX.YY.ZZ   <none>        8443/TCP   10d
service/primera3par-csp-svc                                   ClusterIP   172.XX.YY.ZZ   <none>        8080/TCP   10d

NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/hpe-csi-node   13        13        13      13           13          <none>          10d

NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hpe-csi-controller                    1/1     1            1           10d
deployment.apps/hpe-csi-operator-controller-manager   1/1     1            1           10d
deployment.apps/primera3par-csp                       1/1     1            1           10d

NAME                                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/hpe-csi-controller-746d8f6748                    1         1         1       4d23h
replicaset.apps/hpe-csi-controller-76f8c46d98                    0         0         0       10d
replicaset.apps/hpe-csi-operator-controller-manager-585f579bb9   1         1         1       10d
replicaset.apps/primera3par-csp-55d5db7dcf                       1         1         1       10d
 

Por sua vez, quando o serviço NFS é ativado em um segundo momento, seus recursos são outros, e utilizam um namespace diferente.


# oc get all -n hpe-nfs

NAME                                                                READY   STATUS    RESTARTS   AGE
pod/hpe-nfs-6ccb97de-wwxlc   1/1     Running   0          5d2h
pod/hpe-nfs-cfa86445-7rdg9   1/1     Running   0          5d3h

NAME                                                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                                                                          AGE
service/hpe-nfs-6ccb97de-7100-439e   ClusterIP   XX.YY.ZZ.KK   <none>        49000/TCP,2049/TCP,2049/UDP,32803/TCP,32803/UDP,20048/TCP,20048/UDP,111/TCP,111/UDP,662/TCP,662/UDP,875/TCP,875/UDP   5d2h
service/hpe-nfs-cfa86445-46ee-42cf   ClusterIP   XX.YY.ZZ.KK   <none>        49000/TCP,2049/TCP,2049/UDP,32803/TCP,32803/UDP,20048/TCP,20048/UDP,111/TCP,111/UDP,662/TCP,662/UDP,875/TCP,875/UDP   5d3h

NAME                                                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hpe-nfs-6ccb97de-7100-439e-8d05-355724b2b844   1/1     1            1           5d2h
deployment.apps/hpe-nfs-cfa86445-46ee-42cf-bf4b-74a3208f3fb8   1/1     1            1           5d3h

NAME                                                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/hpe-nfs-6ccb97de-7100-439e-8d05-355724b2b844-6cc696b949   1         1         1       5d2h
replicaset.apps/hpe-nfs-cfa86445-46ee-42cf-bf4b-74a3208f3fb8-ccc694958    1         1         1       5d3h
 

É importante saber quais componentes foram criados durante a instalação do operator, pois isso é fundamental para análise dos problemas.


Erros comuns

Agora a parte que provavelmente você estava esperando. Irei listar aqui todos os erros que encontrei, até finalmente conseguir utilizar com sucesso o Storage HP Primera.


Erros na fase de Block Storage

StorageClass:

failed to provision volume with StorageClass "hpe-standard": rpc error: code = Aborted desc = There is already an operation pending for the specified id CreateVolume:pvc-ec2b



Storage Authentication:

level=error msg="Allowing panic to escape" file="csp_manager.go:50" level=info msg="[ REQUEST-ID 100177 ] -- <<<<< createArraySession" file="panic.go:884" http: panic serving X.X.X.X:51022: &{[] 1000 unable to connect to X.X.X.X: dial tcp X.X.X.X:22: connect: connection timed out



Service Account:

level=error msg="Failed to delete node yyyyyyyyyy - hpenodeinfos.storage.hpe.com \"yyyyyyyyyy\" is forbidden: User \"system:serviceaccount:hpe-storage:hpe-csi-node-sa\" cannot delete resource \"hpenodeinfos\" in API group \"storage.hpe.com\" at the cluster scope" file="flavor.go:321"

level=error msg="Error obtaining node info by uuid xceg7621- Get \"https://XX.XX.XX.XX:443/apis/storage.hpe.com/v1/hpenodeinfos\": dial tcp XX.XX.XX.XX:443: i/o timeout\n" file="flavor.go:193"



Erros na fase de File Storage

Antes de qualquer coisa, é importante informar algo neste ítem. Diferentemente de outras soluções NFS enterprise que utilizei, onde o storage em si fornecia um serviço NFS centralizado, aqui isso não acontece.

Volumes NFS fornecidos pelo HPE CSI são entregues através de um POD standalone que executa um contêiner NFS Server, criado especificamente para a entrega do volume RWX solicitado.

Ou seja, cada volume RWX criado terá seu próprio POD rodando um serviço NFS. Este POD por sua vez, possuirá um volume RWO de uso exclusivo.

Dependendo da carga de trabalho, talvez esta não seja a solução mais escalável e redundante possível, porém é assim que o produto HP Primera funciona.


🟢 Dica: Para expandir um volume NFS do HPE CSI, será necessário expandir o volume RWO referente ao POD que está fornecendo o serviço NFS para o namespace, e não o volume NFS diretamente.


🔴 AVISO: No momento em que escrevi este material, existia um limite de 32 volumes NFS por node do cluster OpenShift/Kubernetes. É importante considerar esta informação, pois este detalhe pode causar impactos quando múltiplas aplicações estiverem solicitando volumes RWX.


HPE CSI NFS Limit


Agora vamos aos erros comuns referentes à volumes NFS:


Internal Server Error:

connection.go:252] GRPC error: rpc error: code = Internal desc = Failed to add ACL to volume pvc-fd1xxx for node &{ yyyyyyyyyy fcef9324-dbcb-186f-709a-ca1834942843 [0xc0005a3840] [0xc0005a3880 0xc0005a3890 0xc0005a38a0 0xc0005a38b0] [0xc0005a38c0 0xc0005a38d0] } via CSP, err: Request failed with status code 500 and errors Error code (Internal Server Error) and message (VLUN creation error: failed to find any ready target port on array XX.XX.XX.XX)

csi_handler.go:234] Error processing "csi-12f7d8c840b4759988": failed to attach: rpc error: code = Internal desc = Failed to add ACL to volume pvc-fd1xxx for node &{ yyyyyyyyyy fd1xxx-2843 [0xc0005a3840] [0xc0005a3880 0xc0005a3890 0xc0005a38a0 0xc0005a38b0] [0xc0005a38c0 0xc0005a38d0] } via CSP, err: Request failed with status code 500 and errors Error code (Internal Server Error) and message (VLUN creation error: failed to find any ready target port on array XX.XX.XX.XX)



FailedAttachVolume:

Warning FailedAttachVolume pod/hpe-nfs-e13575db-zdv4v AttachVolume.Attach failed for volume "pvc-8ebf57-c9f6" : rpc error: code = Internal desc = Failed to add ACL to volume pvc-8ebf57-c9f6 for node &{ yyyyyyyyyy 0bd8957e-9323 [0xc000f26a00] [0xc000f26a40 0xc000f26a50 0xc000f26a60 0xc000f26a70] [0xc000f26a80 0xc000f26a90] } via CSP, err: Request failed with status code 500 and errors Error code (Internal Server Error) and message (VLUN creation error: failed to find any ready target port on array XX.XX.XX.XX)



FailedMount:

Warning FailedMount pod/hpe-nfs-e13575db-zzdln Unable to attach or mount volumes: unmounted volumes=[hpe-nfs-e13575d-d21042f], unattached volumes=[hpe-nfs-e13575d-d21042f], failed to process volumes=[]: timed out waiting for the condition



ProvisioningFailed:

Warning ProvisioningFailed persistentvolumeclaim/my-rwx-nfs failed to provision volume with StorageClass "hpe-nfs": rpc error: code = DeadlineExceeded desc = context deadline exceeded



ProvisionStorage:

Warning ProvisionStorage persistentvolumeclaim/my-rwx-nfs gave up waiting for deployment hpe-nfs-e13575d-3d21042f to be available

Warning ProvisionStorage persistentvolumeclaim/my-rwx-nfs rollback of an existing pvc hpe-nfs-e13575d-3d21042f is under progress



Permission denied:

Volume NFS monta, mas dá acesso negado ao tentar gravar arquivos.

HPE CSI NFS Mounted


sh-4.4$ echo 1 > /my-first-nfs/ok
sh: /my-first-nfs/ok: Permission denied
 

😓 Como você pode perceber, foram muitos os problemas enfrentados. Será mesmo que o storage funciona? Estaria quebrado?


HPE CSI Broken?



Entendendo os problemas

O primeiro passo para solucionar qualquer problema, é obter o máximo de informação possível nos logs disponíveis.


Obtendo logs

A HP sugere a utilização de comandos como os abaixo para obtenção de logs.


 $ kubectl logs daemonset.apps/hpe-csi-node  hpe-csi-driver -n hpe-storage

 $ kubectl logs deployment.apps/hpe-csi-controller hpe-csi-driver -n hpe-storage
 

Embora estas sugestões ajudem, serão necessárias ainda mais informações.


Script para coleta de logs

Este script não é nada elegante, ou algo que eu possa me orgulhar. São apenas alguns comandos empilhados, para obter de uma só vez todas as informações necessárias para análise dos problemas. Use ele como base, e faça as alterações que forem pertinentes a seu ambiente.


#!/bin/bash

echo "--------------------"
echo "| HPE-STORAGE LOGS |"
echo "--------------------"
oc logs -n hpe-storage daemonset.apps/hpe-csi-node --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage deployment.apps/hpe-csi-controller --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage deployment.apps/hpe-csi-operator-controller-manager --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage deployment.apps/nimble-csp --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage deployment.apps/primera3par-csp --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage service/alletra6000-csp-svc --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage service/alletra9000-csp-svc --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage service/alletrastoragemp-csp-svc --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage service/hpe-csi-operator-controller-manager-metrics-service --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage service/nimble-csp-svc --all-containers=true
echo; echo; echo; echo
oc logs -n hpe-storage service/primera3par-csp-svc --all-containers=true
echo; echo; echo; echo
PODs=$(oc get pods -n hpe-storage -o custom-columns=POD:.metadata.name --no-headers)
for X in $PODs
do
 oc logs -n hpe-storage pod/$X --all-containers=true
done
echo; echo; echo; echo
RSs=$(oc get replicaset -n hpe-storage -o custom-columns=POD:.metadata.name --no-headers)
for Y in $RSs
do
 oc logs -n hpe-storage replicaset.apps/$Y
done
echo; echo; echo; echo
echo "CSI LOGS FROM NODE:"
ssh -i /root/xxxxx/id_rsa_xxxxx core@yyyyy "cat /var/log/hpe-csi-node.log"
echo; echo; echo; echo
echo "----------------"
echo "| HPE-NFS LOGS |"
echo "----------------"
oc get pv | grep hpe-nfs
echo
oc get pvc -n hpe-nfs
echo
oc get pvc -ntesting
echo
PODs=$(oc get pods -n hpe-nfs -o custom-columns=POD:.metadata.name --no-headers)
for X in $PODs
do
 oc logs -n hpe-nfs pod/$X --all-containers=true
done
echo; echo; echo; echo
oc get events -n hpe-nfs
echo; echo; echo; echo
oc -n testing get pvc my-rwx-nfs -o yaml
echo; echo; echo; echo
oc get events -n testing
 

Ao coletar todos estes logs de uma vez, ficou um pouco mais clara a correlação dos eventos, e quais processos estavam acontecendo nas operações de solicitação de volumes persistentes.

Eu não sou nenhum especialista em produtos HP, então talvez tenha um jeito mais simples de fazer o debug. Esta foi apenas a forma que encontrei para conseguir os dados que eu precisava.


Integrando com sucesso OpenShift com HPE CSI

Neste tópico irei apresentar os templates YAML que utilizei para fazer a inegração com sucesso, pontuando nos mesmos alguns itens importantes que fizeram com que os volumes de storage pudessem efetivamente ser utilizados.

Em alguns momentos precisei fazer a leitura dos códigos .golang com a finalidade de entender se um item específico estava mal documentado, ou para descobrir como parametrizar algumas configurações adequadamente. Por isso, talvez meus templates sejam um pouco diferentes dos encontrados nos canais tradicionais.

Também irei mostrar alguns comandos que podem ser utilizados para rastrear os privilégios que uma Service Account (SA) necessita, e como ajustar as Security Context Constraints (SCC) para esta SA.

⚠️ Não tenho a intenção aqui de dizer que a forma com a qual obtive sucesso é a mais correta ou algo nesse sentido. O que apresento aqui é uma solução que funcionou para o meu caso específico. Minha recomendação é que sempre procure o suporte oficial de qualquer produto, antes de implementar soluções encontradas na internet. No meu caso, o SLA do suporte da HP não atendia os requisitos de tempo do projeto, então precisei colocar a mão na massa para encontrar soluções.


Backend

A configuração de backend se refere a como o OpenShift irá se comunicar com o storage HPE Primera.

Um exemplo do template completo pode ser visualizado abaixo.


# cat hpe-backend-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: hpe-backend
  namespace: hpe-storage
stringData:
  serviceName: primera3par-csp-svc
  servicePort: "8080"
  backend: YOUR_STORAGE_IP
  username: YOUR_STORAGE_LOGIN
  password: YOUR_STORAGE_PASSWORD
    

HPE CSI Driver

Na configuração do driver, deixe ativado apenas o modelo de storage que está em uso (no caso, o modelo é Primera).

No meu cenário, também foi necessário declarar backendType: primera.

Um exemplo do template completo pode ser visualizado abaixo.


# cat hpe-csi-driver.yaml

apiVersion: storage.hpe.com/v1
kind: HPECSIDriver
metadata:
  name: hpecsidriver
  namespace: hpe-storage
spec:
  csp:
    affinity: {}
    labels: {}
    nodeSelector: {}
    tolerations: []
  node:
    affinity: {}
    labels: {}
    nodeSelector: {}
    tolerations: []
  disable:
    alletra6000: true      <--- SUPPORT DISABLED
    alletra9000: true      <--- SUPPORT DISABLED
    alletraStorageMP: true <--- SUPPORT DISABLED
    nimble: true           <--- SUPPORT DISABLED
    primera: false
  iscsi:
    chapPassword: ''
    chapUser: ''
  controller:
    affinity: {}
    labels: {}
    nodeSelector: {}
    tolerations: []
  disableNodeConfiguration: false
  disableNodeConformance: false
  disableNodeGetVolumeStats: false
  imagePullPolicy: IfNotPresent
  kubeletRootDir: /var/lib/kubelet/
  logLevel: warn
  registry: quay.io
  backendType: primera
    

Storage Class Fibre Channel

Os parâmetros a seguir precisaram ser ajustados:

- cpg: “SSD_r6”

- hostSeesVLUN: “true”

- reclaimPolicy: Delete

- allowVolumeExpansion: true

- allowOverrides: description,accessProtocol


O CPG pode ser consultado direto no storage Primera.


$ primera cli% showvv
                                                                            -Rsvd(MiB)- --(MiB)--
Id Name               Prov Compr Dedup Type CopyOf BsId Rd -Detailed_State-  Snp    Usr     VSize
2 .mgmtdata          full NA    NA    base ---       2 RW normal              0 524288    524288
3 .shared.SSD_r6_0   dds  NA    NA    base ---       3 RW normal              0   1024  67108864
(...)
  

Um exemplo do template completo pode ser visualizado abaixo.


# cat hpe-sc-fc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
  name: hpe-standard
provisioner: csi.hpe.com
parameters:
  csi.storage.k8s.io/fstype: xfs
  csi.storage.k8s.io/controller-expand-secret-name: hpe-backend
  csi.storage.k8s.io/controller-expand-secret-namespace: hpe-storage
  csi.storage.k8s.io/controller-publish-secret-name: hpe-backend
  csi.storage.k8s.io/controller-publish-secret-namespace: hpe-storage
  csi.storage.k8s.io/node-publish-secret-name: hpe-backend
  csi.storage.k8s.io/node-publish-secret-namespace: hpe-storage
  csi.storage.k8s.io/node-stage-secret-name: hpe-backend
  csi.storage.k8s.io/node-stage-secret-namespace: hpe-storage
  csi.storage.k8s.io/provisioner-secret-name: hpe-backend
  csi.storage.k8s.io/provisioner-secret-namespace: hpe-storage
  description: "Volume created by the HPE CSI Driver for Kubernetes"
  accessProtocol: fc
  cpg: "SSD_r6"
  hostSeesVLUN: "true"
reclaimPolicy: Delete
allowVolumeExpansion: true
allowOverrides: description,accessProtocol
  

Storage Class NFS

Este foi um dos itens mais problemáticos, pois ao passo que um problema se resolvia, outro aparecia. Por fim, foi possível obter uma combinação funcional de parâmetros de configuração.

A HP recomenda usar formatação EXT4 para volumes NFS.

HPE CSI NFS EXT4


Feitas as devidas ressalvas, os parâmetros a seguir precisaram ser ajustados:

- csi.storage.k8s.io/fstype: ext4

- cpg: “SSD_r6”

- accessProtocol: fc

- hostSeesVLUN: “true”

- nfsResources: “true”

- fsMode: “775”

- allowOverrides: description,nfsNamespace

- allowMutations: description,nfsNamespace

- reclaimPolicy: Delete

- volumeBindingMode: Immediate

- allowVolumeExpansion: false


Um exemplo do template completo pode ser visualizado abaixo.


# cat hpe-sc-nfs.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: hpe-nfs
  annotations:
    storageclass.kubernetes.io/is-default-class: "no"
provisioner: csi.hpe.com
parameters:
  csi.storage.k8s.io/controller-expand-secret-name: hpe-backend
  csi.storage.k8s.io/controller-expand-secret-namespace: hpe-storage
  csi.storage.k8s.io/controller-publish-secret-name: hpe-backend
  csi.storage.k8s.io/controller-publish-secret-namespace: hpe-storage
  csi.storage.k8s.io/node-publish-secret-name: hpe-backend
  csi.storage.k8s.io/node-publish-secret-namespace: hpe-storage
  csi.storage.k8s.io/node-stage-secret-name: hpe-backend
  csi.storage.k8s.io/node-stage-secret-namespace: hpe-storage
  csi.storage.k8s.io/provisioner-secret-name: hpe-backend
  csi.storage.k8s.io/provisioner-secret-namespace: hpe-storage
  description: "NFS backend volume created by the HPE CSI Driver for Kubernetes"
  csi.storage.k8s.io/fstype: ext4
  cpg: "SSD_r6"
  accessProtocol: fc
  hostSeesVLUN: "true"
  nfsResources: "true"
  fsMode: "775"
  allowOverrides: description,nfsNamespace
  allowMutations: description,nfsNamespace
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: false
  

Se tudo correr bem, volumes NFS RWX poderão ser utilizados para suas aplicações.

HPE CSI NFS PVC RWX




Service Account SCC

Tipicamente, um deployment de um serviço, igualmente utiliza uma conta de serviço.


⛔️ AVISO: Caso nos seus logs não existam erros do tipo is forbidden: User, NÃO EXECUTE OS PASSOS ABAIXO.


Quais privilégios são necessários?

Para encontrar os privilégios necessários para um determinado deployment, utilize os passos a seguir.


⚠️ Nota: O ideal é criar uma política customizada, que contenha exatamente os privilégios necessários, nos componentes onde se fizer necessário. Caso isso não seja possível, siga com os exemplos abaixo.



Deployment Primera 3PAR CSP

1) Utilize o scc-subject-review para encontrar o nível de privilégio necessário que a conta de serviço utilizada no deployment precisa para realizar suas funções.


$ oc get deployment primera3par-csp -o yaml | oc adm policy scc-subject-review -f -
  RESOURCE                     ALLOWED BY
  Deployment/primera3par-csp   privileged
 

2) Verifique qual a conta de serviço está sendo utilizada neste deployment:


$ oc describe deployment primera3par-csp | grep Account
  Service Account:  hpe-csp-sa
   

3) Atribua o privilégio necessário para a conta de serviço.


$ oc adm policy add-scc-to-user privileged -z hpe-csp-sa
  clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "hpe-csp-sa"
 

Caso os erros ainda persistam nos logs e os volumes não possam ser utilizados, siga investigando outros deployments realizados pelo operator HPE CSI.

Exemplo:


$ oc get deployment hpe-csi-controller -o yaml | oc adm policy scc-subject-review -f -
  RESOURCE                        ALLOWED BY
  Deployment/hpe-csi-controller   privileged
 

$ oc describe deployment hpe-csi-controller | grep Account
  Service Account:  hpe-csi-controller-sa
   

$ oc get deployment hpe-csi-operator-controller-manager -o yaml | oc adm policy scc-subject-review -f -
  RESOURCE                                         ALLOWED BY
  Deployment/hpe-csi-operator-controller-manager   anyuid
 

Deployment do serviço NFS

1) Seguindo a mesma lógica, utilize o scc-subject-review para encontrar o nível de privilégio necessário que a conta do serviço NFS precisa.


$ oc -n hpe-nfs get deployment.apps/hpe-nfs-9e44f5e6-2c43-4863-95f6-298f30cb1149 -o yaml | oc adm policy scc-subject-review -f -
  RESOURCE                                                  ALLOWED BY
  Deployment/hpe-nfs-9e44f5e6-2c43-4863-95f6-298f30cb1149   privileged
 

2) Encontre a conta de serviço que executa o serviço NFS:


$ oc -n hpe-nfs get deployment.apps/hpe-nfs-9e44f5e6-2c43-4863-95f6-298f30cb1149 -o yaml | grep -i account
      serviceAccount: hpe-csi-nfs-sa
      serviceAccountName: hpe-csi-nfs-sa
       

3) Atribua o privilégio necessário a conta de serviço:


$ oc adm policy add-scc-to-user privileged -z hpe-csi-nfs-sa
 


Finalizando

Espero que estas dicas ajudem a quem estiver passando pelas mesmas dificuldades que passei a resolverem seus problemas, e assim evitar atrasos em seus projetos. O Storage HP Primera é um produto interessante e flexível, que possui um jeito peculiar de trabalhar algumas funções. Isso pode causar alguma estranheza em sysadmins mais conservadores, porém nada que não possa ser aprendido e aproveitado.



Gostou do conteúdo? Dê uma olhada nesses outros artigos interessantes! 🔥



Você poderia ajudar?

Apoie este conteúdo clicando em um dos banners de nossos anunciantes. ❤️

comments powered by Disqus