Ceph S3

Ceph S3

Suite de l’article sur l’installation d’un cluster CEPH avec l’ajout du stockage compatible S3…

Pour consommer du stockage S3 sur un cluster CEPH, il faut ajouter des rados gateway et mettre en place un peu de failover et du loadbalancing avec le traditionnel couple HAProxy/KEEPALIVED. L’objectif à terme est d’utiliser le S3 en backend de stockage notamment pour Nextcloud.

Détail de l’infra déployée

host role IP OS
ceph-0 admin 10.0.212.210 openSUSE LEAP 15.1
ceph-1 OSD,MON,MGR,RGW 10.0.212.211 openSUSE LEAP 15.1
ceph-2 OSD,MON,MGR,RGW 10.0.212.212 openSUSE LEAP 15.1
ceph-2 OSD,MON,MGR,RGW 10.0.212.213 openSUSE LEAP 15.1
lb-1 HAProxy,KEEPALIVED 10.0.212.214 Debian BUSTER
lb-2 HAProxy,KEEPALIVED 10.0.212.215 Debian BUSTER
vip-lb VIP VRRP 10.0.212.216 N/A
nc-s3 NEXTCLOUD 10.0.212.217 Debian BUSTER

Schéma de l’infra

Installation des Rados Gateway

En partant du cluster précédemment installé, j’utilise DeepSea pour ajouter le rôle “rados gateway” (RGW) sur chacun des noeuds de stockages.

  • modifier le fichier policy.cfg sur le noeud d’administration (ceph-0)
1$ cat /srv/pillar/ceph/proposals/policy.cfg
2# RGW
3role-rgw/cluster/ceph-[1-3].exemple.com.sls
  • exécuter le stage 2 and 4
1$ sudo deepsea salt-run state.orch ceph.stage.2
2$ sudo deepsea salt-run state.orch ceph.stage.4
  • Créer un utilisateur S3 dans le dasboard Web

utilisateur S3

Pour obtenir l’access key et le secret pour l’accès S3, il faut éditer ce compte et cliquer sur l’oeil dans la section “Keys”

edit utilisateur S3

Ensuite, vous pouvez créer un bucket S3 pour cet utilisateur

bucket S3

Installer un client S3

Il existe de nombreux clients S3 comme s3cmd, je vous recommande toutefois l’outil proposé par MinIO

  • installation du client MinIO:
1$ sudo curl -L https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc
2$ sudo chmod +x /usr/local/bin/mc
  • créer un alias pour permettre au client de se connecter à votre stockage S3
1$ mc alias set <alias> [SERVER_URL] [YOUR-ACCESS-KEY] [YOUR-SECRET-KEY]
2$ mc alias set my-s3 ceph-1.exemple.com Y2V691YHS1NWSMBSSX08 FE7gOaJ73SG2LDMR4tLJ7g2bD87XgOrIkqxnxQ1v
  • cette commande permet de créer le fichier ~/.mc/config.json
 1{
 2        "version": "10",
 3        "aliases": {
 4                "my-s3": {
 5                        "url": "http://ceph-1.exemple.com",
 6                        "accessKey": "Y2V691YHS1NWSMBSSX08",
 7                        "secretKey": "FE7gOaJ73SG2LDMR4tLJ7g2bD87XgOrIkqxnxQ1v",
 8                        "api": "s3v4",
 9                        "path": "auto"
10                },
  • obtenir la liste des buckets et des fichiers
1$ mc ls <alias>
2$ mc ls my-s3
3[2020-12-05 15:29:57 CET]     0B nextcloud/
  • copier des fichiers
1$ mc cp /path/to/file <alias>/<bucket>
2$ mc cp demo.pdf my-s3/nextcloud
3demo.pdf:       108.47 KiB / 108.47 KiB  ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓  45.37 KiB/s 2s
4
5$ mc ls my-s3/nextcloud
6[2020-12-05 16:10:30 CET] 108KiB demo.pdf

A ce stade, les rados gateways fonctionnent sur chacun des noeuds. Il est temps d’ajouter le loadbalancing avec HAProxy.

Installation HAProxy (lb-1 et lb-2)

1$ sudo apt install haproxy
  • modifier la configuration HAProxy en ajoutant à la fin du fichier:
 1$ cat /etc/HAProxy/HAProxy.cfg
 2frontend http_web
 3    bind *:80
 4    mode http
 5    default_backend rgw
 6
 7backend rgw
 8    balance source
 9    mode http
10    server  ceph-1 10.0.212.211:80 check
11    server  ceph-2 10.0.212.212:80 check
12    server  ceph-3 10.0.212.213:80 check
  • activer et démarrer le service HAProxy
1$ sudo systemctl enable haproxy && systemctl restart haproxy
  • modifier le fichier /etc/ceph/ceph.conf sur les noeuds de stockages ( ceph-[1-3] ) pour faire fonctionner les RGWs derrière HAProxy:
 1[client.rgw.ceph-1]
 2rgw frontends = "beast port=80"
 3#rgw dns name = ceph-1.exemple.com
 4rgw enable usage log = true
 5
 6[client.rgw.ceph-2]
 7rgw frontends = "beast port=80"
 8#rgw dns name = ceph-2.exemple.com
 9rgw enable usage log = true
10
11[client.rgw.ceph-3]
12rgw frontends = "beast port=80"
13#rgw dns name = ceph-3.exemple.com
14rgw enable usage log = true
  • redémarer les Rados Gateway
1$ systemctl restart  ceph-radosgw.target

Tester le stockage S3 avec HAProxy

  • modifier la configuration du client MinIO avec l’adresse du 1er loadbalancer ( lb-1.exemple.com)
1$ cat ~/.mc/config.json
2"my-s3": {
3                        "url": "http://lb-1.exemple.com",
  • tester la connexion S3
1 mc ls my-s3
2[2020-12-05 15:29:57 CET]     0B nextcloud/

Les loadbalancer fonctionnent, on peut maintenant ajouter le failover avec KeepAlived.

KeepAlived

KeepAlived permet d’avoir une IP flotante (VIP) entre 2 serveurs avec bascule automatique en cas de panne.

1$ sudo apt install haproxy pmisc

sur lb-1.exemple.com:

  • modifier /etc/keepalived/keepalived.conf
 1vrrp_script chk_haproxy {
 2  script "/usr/bin/killall -0 haproxy" # check the HAProxy process
 3  interval 2 # every 2 seconds
 4  weight 2 # add 2 points if OK
 5}
 6
 7vrrp_instance RGW {
 8  interface ens192 # interface to monitor
 9  state MASTER # MASTER on lp-1, BACKUP on lp-2
10  virtual_router_id 51
11  priority 101 # 101 on lp-1, 100 on lp-2
12  virtual_ipaddress {
13    10.0.212.216 # virtual ip address
14  }
15  unicast_peer {
16    10.0.212.215 # ip lp-2
17  }
18
19  track_script {
20    chk_haproxy
21  }
22}
1systemctl enable keepalived && systemctl restart keepalived`

sur lb-2.exemple.com:

 1vrrp_script chk_HAProxy {
 2  script "/usr/bin/killall -0 HAProxy" # check the HAProxy process
 3  interval 2 # every 2 seconds
 4  weight 2 # add 2 points if OK
 5}
 6
 7vrrp_instance RGW {
 8  interface ens192 # interface to monitor
 9  state BACKUP # MASTER on lp-1, BACKUP on lp-2
10  virtual_router_id 51
11  priority 101 # 101 on lp-1, 100 on lp-2
12  virtual_ipaddress {
13    10.0.212.216 # virtual ip address
14  }
15  unicast_peer {
16    10.0.212.214 # ip lp-1
17  }
18
19  track_script {
20    chk_HAProxy
21  }
22}
1systemctl enable keepalived && systemctl restart keepalived`

Test de failover

On débranche successivement les interfaces réseaux des 2 loadbalancer et on s’assure que la VIP répond correctement au ping. On peut également suivre le fonctionnement de Keepalived avec systemd

 1journalctl -xe
 2nov. 06 10:33:50 lb-1 Keepalived_vrrp[8578]: Netlink reports ens192 down
 3nov. 06 10:33:50 lb-1 kernel: vmxnet3 0000:0b:00.0 ens192: NIC Link is Down
 4nov. 06 10:33:50 lb-1 Keepalived_vrrp[8578]: (RGW) Entering FAULT STATE
 5nov. 06 10:33:50 lb-1 Keepalived_vrrp[8578]: (RGW) sent 0 priority
 6nov. 06 10:34:00 lb-1 kernel: vmxnet3 0000:0b:00.0 ens192: NIC Link is Up 10000 Mbps
 7nov. 06 10:34:00 lb-1 Keepalived_vrrp[8578]: Netlink reports ens192 up
 8nov. 06 10:34:00 lb-1 Keepalived_vrrp[8578]: (RGW) Entering BACKUP STATE
 9nov. 06 10:34:01 lb-1 Keepalived_vrrp[8578]: (RGW) received lower priority (52) advert from 10.0.212.215 - discarding
10nov. 06 10:34:02 lb-1 Keepalived_vrrp[8578]: (RGW) received lower priority (52) advert from 10.0.212.215 - discarding
11nov. 06 10:34:03 lb-1 Keepalived_vrrp[8578]: (RGW) received lower priority (52) advert from 10.0.212.215 - discarding
12nov. 06 10:34:04 lb-1 Keepalived_vrrp[8578]: (RGW) Entering MASTER STATE

Test de failover pendant un tranfer S3

  • modifier la configuration du client MinIO avec l’adresse de la VIP
1$ cat  ~/.mc/config.json
2  "my-s3": {
3              http://vip-lb.exemple.com",

copie d’une ISO pendant que je connecte / déconnecte l’interface réseau du lb-1 puis du lb-2

1mc cp debian-10.6.0-amd64-netinst.iso my-s3/nextcloud
2...tinst.iso:  6.97 MiB / 349.00 MiB  ▓ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  765.48 KiB/s

Le stockage S3 est maintenant résiliant, on peut y adosser des services comme Nextcloud.

Modifier la configuration Nextcloud pour utiliser S3 en stockage primaire

https://docs.nextcloud.com/server/15/admin_manual/configuration_files/primary_storage.html

  • modifier : /var/www/html/nextcloud/config/config.php
 1'objectstore' => array(
 2        'class' => '\\OC\\Files\\ObjectStore\\S3',
 3        'arguments' => array(
 4                'bucket' => 'nextcloud',
 5                'autocreate' => false,
 6                'key'    => 'Y2V691YHS1NWSMBSSX08',
 7                'secret' => 'FE7gOaJ73SG2LDMR4tLJ7g2bD87XgOrIkqxnxQ1v',
 8                'hostname' => 'vip.exemple.com',
 9                'port' => 80,
10                'use_ssl' => false,
11                'region' => 'optional',
12                // required for some non Amazon S3 implementations
13                'use_path_style'=>true
14        ),
15),

Références