Este documento ha sido traducido utilizando tecnología de traducción automática. Si bien nos esforzamos por proporcionar traducciones precisas, no ofrecemos garantías sobre la integridad, precisión o confiabilidad del contenido traducido. En caso de discrepancia, la versión original en inglés prevalecerá y constituirá el texto autorizado.

Uso de un controlador Ceph externo

Estas instrucciones son sobre el uso del controlador Ceph externo en un clúster RKE2. Si utiliza RKE, se requieren pasos adicionales. Para más detalles, consulte esta sección.

Requisitos

Asegúrese de que los paquetes ceph-common y xfsprogs estén instalados en los nodos trabajadores de SLE.

Uso del controlador Ceph con RKE

Los recursos a continuación son totalmente compatibles con clústeres basados en RKE, pero es necesario realizar una configuración adicional del kubelet para RKE.

En los clústeres RKE, el componente kubelet se ejecuta en un contenedor Docker y no tiene acceso a los módulos del kernel del host como rbd y libceph por defecto.

Para solucionar esta limitación, puede ejecutar modprobe rbd en los nodos trabajadores, o configurar los contenedores kubelet para montar automáticamente el directorio /lib/modules del host en el contenedor.

Para la configuración del kubelet, coloque las siguientes líneas en el archivo cluster.yml antes de la provisión del clúster RKE. También puede modificar el cluster.yml más tarde en la interfaz de usuario de Rancher haciendo clic en Editar clúster  Editar como YAML y reiniciando los nodos trabajadores.

services:
  kubelet:
    extra_binds:
      - '/lib/modules:/lib/modules:ro'

Para más información sobre la directiva extra_binds, consulte esta sección.

Instalación del controlador ceph-csi en un clúster SUSE® Rancher Prime: RKE2

Estos pasos son necesarios solo para la provisión dinámica de RBD.

Para más información sobre el gráfico ceph-csi-rbd, consulte esta página.

Para obtener detalles sobre su clúster SES, ejecute:

ceph mon dump

Lea su salida:

dumped monmap epoch 3
epoch 3
fsid 79179d9d-98d8-4976-ab2e-58635caa7235
last_changed 2021-02-11T10:56:42.110184+0000
created 2021-02-11T10:56:22.913321+0000
min_mon_release 15 (octopus)
0: [v2:10.85.8.118:3300/0,v1:10.85.8.118:6789/0] mon.a
1: [v2:10.85.8.123:3300/0,v1:10.85.8.123:6789/0] mon.b
2: [v2:10.85.8.124:3300/0,v1:10.85.8.124:6789/0] mon.c

Más tarde necesitará los valores de fsid y direcciones mon.

Instalar el controlador ceph-csi usando Helm

Ejecute estos comandos:

helm repo add ceph-csi https://ceph.github.io/csi-charts
helm repo update
helm search repo ceph-csi -l
helm inspect values ceph-csi/ceph-csi-rbd > ceph-csi-rbd-values.yaml

Modifique el archivo ceph-csi-rbd-values.yaml y mantenga allí únicamente los cambios requeridos:

# ceph-csi-rbd-values.yaml
csiConfig:
  - clusterID: "79179d9d-98d8-4976-ab2e-58635caa7235"
    monitors:
      - "10.85.8.118:6789"
      - "10.85.8.123:6789"
      - "10.85.8.124:6789"
provisioner:
  name: provisioner
  replicaCount: 2

Asegúrate de que los monitores de ceph sean accesibles desde el clúster RKE2, por ejemplo, mediante ping.

kubectl create namespace ceph-csi-rbd
helm install --namespace ceph-csi-rbd ceph-csi-rbd ceph-csi/ceph-csi-rbd --values ceph-csi-rbd-values.yaml
kubectl rollout status deployment ceph-csi-rbd-provisioner -n ceph-csi-rbd
helm status ceph-csi-rbd -n ceph-csi-rbd

En caso de que desee modificar la configuración directamente a través de Helm, puede adaptar el archivo ceph-csi-rbd-values.yaml y llamar a:

helm upgrade \
  --namespace ceph-csi-rbd ceph-csi-rbd ceph-csi/ceph-csi-rbd --values ceph-csi-rbd-values.yaml

Creando recursos RBD Ceph

# Cree un pool de ceph:
ceph osd pool create myPool 64 64

# Cree un pool de dispositivos de bloques:
rbd pool init myPool

# Cree una imagen de dispositivo de bloques:
rbd create -s 2G myPool/image

# Cree un usuario de dispositivo de bloques y registre la clave:
ceph auth get-or-create-key client.myPoolUser mon "allow r" osd "allow class-read object_prefix rbd_children, allow rwx pool=myPool" | tr -d '\n' | base64 QVFDZ0R5VmdyRk9KREJBQTJ5b2s5R1E2NUdSWExRQndhVVBwWXc9PQ==

# Codifique el usuario ceph myPoolUser en un hash base64:
echo "myPoolUser" | tr -d '\n' | base64
bXlQb29sVXNlcg==

# Cree un usuario administrador de dispositivo de bloques y registre la clave:
ceph auth get-or-create-key client.myPoolAdmin mds 'allow *' mgr 'allow *' mon 'allow *' osd 'allow * pool=myPool' | tr -d '\n' | base64 QVFCK0hDVmdXSjQ1T0JBQXBrc0VtcVhlZFpjc0JwaStIcmU5M3c9PQ==

# Codifique el usuario ceph myPoolAdmin en un hash base64:
echo "myPoolAdmin" | tr -d '\n' | base64 bXlQb29sQWRtaW4=

Configura los secretos de acceso RBD Ceph

Cuenta de Usuario

Para la provisión estática de RBD (la imagen dentro del pool ceph debe existir), ejecuta estos comandos:

cat > ceph-user-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: ceph-user
  namespace: default
type: kubernetes.io/rbd
data:
  userID: bXlQb29sVXNlcg==
  userKey: QVFDZ0R5VmdyRk9KREJBQTJ5b2s5R1E2NUdSWExRQndhVVBwWXc9PQ==
EOF

kubectl apply -f ceph-user-secret.yaml

Cuenta de Administrador

Para la provisión dinámica de RBD (utilizada para la creación automática de imágenes dentro de un pool ceph dado), ejecuta estos comandos:

cat > ceph-admin-secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
  name: ceph-admin
  namespace: default
type: kubernetes.io/rbd
data:
  userID: bXlQb29sQWRtaW4=
  userKey: QVFCK0hDVmdXSjQ1T0JBQXBrc0VtcVhlZFpjc0JwaStIcmU5M3c9PQ==
EOF

kubectl apply -f ceph-admin-secret.yaml

Crear Recursos de Prueba de RBD

Usando RBD en Pods

# pod
cat > ceph-rbd-pod-inline.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-pod-inline
spec:
  containers:
  - name: ceph-rbd-pod-inline
    image: busybox
    command: ["sleep", "infinity"]
    volumeMounts:
    - mountPath: /mnt/ceph_rbd
      name: volume
  volumes:
  - name: volume
    rbd:
      monitors:
      - 10.85.8.118:6789
      - 10.85.8.123:6789
      - 10.85.8.124:6789
      pool: myPool
      image: image
      user: myPoolUser
      secretRef:
        name: ceph-user
      fsType: ext4
      readOnly: false
EOF

kubectl apply -f ceph-rbd-pod-inline.yaml
kubectl get pod
kubectl exec pod/ceph-rbd-pod-inline -- df -k | grep rbd

Usando RBD en Volúmenes Persistentes

# pod-pvc-pv
cat > ceph-rbd-pod-pvc-pv-allinone.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ceph-rbd-pv
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  rbd:
    monitors:
    - 10.85.8.118:6789
    - 10.85.8.123:6789
    - 10.85.8.124:6789
    pool: myPool
    image: image
    user: myPoolUser
    secretRef:
      name: ceph-user
    fsType: ext4
    readOnly: false
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-pod-pvc-pv
spec:
  containers:
  - name: ceph-rbd-pod-pvc-pv
    image: busybox
    command: ["sleep", "infinity"]
    volumeMounts:
    - mountPath: /mnt/ceph_rbd
      name: volume
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: ceph-rbd-pvc
EOF

kubectl apply -f ceph-rbd-pod-pvc-pv-allinone.yaml
kubectl get pv,pvc,pod
kubectl exec pod/ceph-rbd-pod-pvc-pv -- df -k | grep rbd

Usando RBD en Clases de Almacenamiento

Este ejemplo es para la provisión dinámica. Se necesita el controlador ceph-csi.

# pod-pvc-sc
cat > ceph-rbd-pod-pvc-sc-allinone.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd-sc
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: 79179d9d-98d8-4976-ab2e-58635caa7235
   pool: myPool
   imageFeatures: layering
   csi.storage.k8s.io/provisioner-secret-name: ceph-admin
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/controller-expand-secret-name: ceph-admin
   csi.storage.k8s.io/controller-expand-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: ceph-admin
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-rbd-sc-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: ceph-rbd-sc
---
apiVersion: v1
kind: Pod
metadata:
  name: ceph-rbd-pod-pvc-sc
spec:
  containers:
  - name:  ceph-rbd-pod-pvc-sc
    image: busybox
    command: ["sleep", "infinity"]
    volumeMounts:
    - mountPath: /mnt/ceph_rbd
      name: volume
  volumes:
  - name: volume
    persistentVolumeClaim:
      claimName: ceph-rbd-sc-pvc
EOF

kubectl apply -f ceph-rbd-pod-pvc-sc-allinone.yaml
kubectl get pv,pvc,sc,pod
kubectl exec pod/ceph-rbd-pod-pvc-sc -- df -k | grep rbd

SUSE® Rancher Prime: RKE2 Provisión de Servidor/Maestro

sudo su
curl -sfL https://get.rke2.io | sh -
systemctl enable -- now rke2-server

cat > /root/.bashrc << EOF
export PATH=$PATH:/var/lib/rancher/rke2/bin/
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
EOF

cat /var/lib/rancher/rke2/server/node-token
token: K10ca0c38d4ff90d8b80319ab34092e315a8b732622e6adf97bc9eb0536REDACTADO::server:ec0308000b8a6b595da000efREDACTADO

SUSE® Rancher Prime: RKE2 Provisión de Agente/Trabajador

mkdir -p /etc/rancher/rke2/

cat > /etc/rancher/rke2/config.yaml << EOF
server: https://10.100.103.23:9345
token: K10ca0c38d4ff90d8b80319ab34092e315a8b732622e6adf97bc9eb0536REDACTADO::server:ec0308000b8a6b595da000efREDACTADO
EOF

curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh -
systemctl enable -- now rke2-agent.service

Para importar el clúster en Rancher, haga clic en ☰ > Gestión de Clústeres. Luego, en la página de Clústeres, haga clic en Importar Existente. A continuación, ejecute el comando kubectl proporcionado en el servidor/nodo maestro.

Versiones probadas

Sistema Operativo para ejecutar nodos RKE2: JeOS SLE15-SP2 con el kernel-default-5.3.18-24.49 instalado

kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.4", GitCommit:"c96aede7b5205121079932896c4ad89bb93260af", GitTreeState:"clean", BuildDate:"2020-06-22T12:00:00Z", GoVersion:"go1.13.11", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.7+rke2r1", GitCommit:"1dd5338295409edcfff11505e7bb246f0d325d15", GitTreeState:"clean", BuildDate:"2021-01-20T01:50:52Z", GoVersion:"go1.15.5b5", Compiler:"gc", Platform:"linux/amd64"}

helm version
version.BuildInfo{Version:"3.4.1", GitCommit:"c4e74854886b2efe3321e185578e6db9be0a6e29", GitTreeState:"clean", GoVersion:"go1.14.12"}

Versión de Kubernetes en el clúster RKE2: v1.19.7+rke2r1

Solución de problemas

En caso de que utilice ceph-rook de SUSE basado en SES7, puede ser útil exponer los monitores en hostNetwork editando rook-1.4.5/ceph/cluster.yaml y configurando spec.network.hostNetwork=true.

También, para operar el clúster ceph-rook, es útil desplegar una caja de herramientas en el clúster de Kubernetes donde se provisiona ceph-rook mediante kubectl apply -f rook-1.4.5/ceph/toolbox.yaml. Luego, todos los comandos relacionados con ceph se pueden ejecutar en el pod de la caja de herramientas, por ejemplo, ejecutando kubectl exec -it -n rook-ceph rook-ceph-tools-686d8b8bfb-2nvqp — bash.

Operando con ceph - comandos básicos:

ceph osd pool stats
ceph osd pool delete myPool myPool --yes-i-really-really-mean-it
rbd list -p myPool
> csi-vol-f5d3766c-7296-11eb-b32a-c2b045952d38
> image

Elimine la imagen: rbd rm csi-vol-f5d3766c-7296-11eb-b32a-c2b045952d38 -p myPool.

Comandos de CephFS en la caja de herramientas de rook:

ceph -s
ceph fs ls
ceph fs fail cephfs
ceph fs rm cephfs --yes-i-really-mean-it
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it

Para preparar un sistema de archivos cephfs, ejecute este comando en un clúster rook:

kubectl apply -f rook-1.4.5/ceph/filesystem.yaml