Bench your ceph cluster

ceph osd pool create scbench 128 128
ceph osd pool set scbench size 2
ceph osd pool set scbench min_size 2

Wait for pool to be created : ceph -s

Write bench

rados bench -p scbench 30 write --no-cleanup
Total time run:         31.1058
Total writes made:      1362
Write size:             4194304
Object size:            4194304
Bandwidth (MB/sec):     175.144
Stddev Bandwidth:       52.2186
Max bandwidth (MB/sec): 264
Min bandwidth (MB/sec): 64
Average IOPS:           43
Stddev IOPS:            13.0546
Max IOPS:               66
Min IOPS:               16
Average Latency(s):     0.363668
Stddev Latency(s):      0.637756
Max latency(s):         3.09566
Min latency(s):         0.00890222

Sequential Read bench

rados bench -t 32 -p scbench 30 seq
Total time run:       10.9908
Total reads made:     1362
Read size:            4194304
Object size:          4194304
Bandwidth (MB/sec):   495.686
Average IOPS:         123
Stddev IOPS:          40.8533
Max IOPS:             166
Min IOPS:             23
Average Latency(s):   0.254922
Max latency(s):       3.49567
Min latency(s):       0.0197077

Random read bench

Total time run:       30.399
Total reads made:     4396
Read size:            4194304
Object size:          4194304
Bandwidth (MB/sec):   578.439
Average IOPS:         144
Stddev IOPS:          17.1076
Max IOPS:             176
Min IOPS:             103
Average Latency(s):   0.220395
Max latency(s):       3.1157
Min latency(s):       0.0121758

Cluster of 3 OVH INFRA – 1 node.

Bench your rbd

Create disk

rbd -p kube create -s 10G bench
fio -ioengine=rbd -name=test -bs=4k -iodepth=32 -rw=randread -runtime=60  -pool=kube -rbdname=bench
READ: bw=33.5MiB/s (35.1MB/s), 33.5MiB/s-33.5MiB/s (35.1MB/s-35.1MB/s), io=2008MiB (2105MB), run=60012-60012msec
fio -ioengine=rbd -name=test -bs=4k -iodepth=32 -rw=randwrite -runtime=60  -pool=kube -rbdname=bench
  WRITE: bw=5555KiB/s (5689kB/s), 5555KiB/s-5555KiB/s (5689kB/s-5689kB/s), io=326MiB (341MB), run=60024-60024msec

Ceph – tips

Speed up backfill

ceph tell 'osd.*' injectargs '--osd-max-backfills 16'
ceph tell 'osd.*' injectargs '--osd-recovery-max-active 4'

reweight-by-utilization

ceph osd reweight-by-utilization

show status

ceph osd df tree 

Tester disque pour ceph

fio -ioengine=libaio -name=test -bs=4k -iodepth=1 -direct=1 -fsync=1 -rw=randwrite -runtime=60 -filename=/dev/sda4
WRITE: bw=107MiB/s (112MB/s), 107MiB/s-107MiB/s (112MB/s-112MB/s), io=6401MiB (6712MB), run=60001-60001msec
fio -ioengine=libaio -name=test -bs=4k -iodepth=1 -direct=1 -fsync=1 -rw=randread -runtime=60 -filename=/dev/sda4
READ: bw=36.8MiB/s (38.6MB/s), 36.8MiB/s-36.8MiB/s (38.6MB/s-38.6MB/s), io=2208MiB (2315MB), run=60001-60001msec

OVH SSD (EG16) : 184MiB/s READ / 46.9MiB WRITE
OVH NVME (AD 2) : 32.6MB/s READ / 10.5MiB WRITE
OVH NVME (INFRA 1): 43.9MB/s READ / 238MB/s WRITE

k8s – 2 – ceph helm on minikube

Pour installer ceph sur minikube il faut faire quelques modification sur la vm. D’abord l’éteindre :

minikube stop

Avec virt-manager ajouter autant de disk que d’osd voulu. Moi je suis parti sur 6 disk de 5G en qcow2. Obligé de les mettre en SATA pour que ca fonctionne. Dommage.

Pour fabriquer les disques :

for i in 1 2 3 4 5 6; do qemu-img create -f qcow2 osd$i.qcow2 5G; done

Ensuite on relance minikube, et le dashboard

minikube start --memory 4096 --disk-size 40g --cpus 4 --vm-driver kvm2
minikube dashboard

Pour ceph.

#install helm
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash
helm init

Installation de ceph et astuce pour faire fonctionner avec minikube

#install ceph
helm serve &
helm repo add local http://localhost:8879/charts
git clone https://github.com/ceph/ceph-helm
cd ceph-helm/ceph

Editer le fichier ceph-helm/ceph/ceph/values.yaml et remplacer:

diff --git a/ceph/ceph/values.yaml b/ceph/ceph/values.yaml
index 5831c53..72a74b7 100644
--- a/ceph/ceph/values.yaml
+++ b/ceph/ceph/values.yaml
@@ -254,8 +254,8 @@ ceph:
     mgr: true
   storage:
     # will have $NAMESPACE/{osd,mon} appended
-    osd_directory: /var/lib/ceph-helm
-    mon_directory: /var/lib/ceph-helm
+    osd_directory: /data/ceph-helm
+    mon_directory: /data/lib/ceph-helm
     # use /var/log for fluentd to collect ceph log
     # mon_log: /var/log/ceph/mon
     # osd_log: /var/log/ceph/osd

make
cd -

Créer un fichier ./ceph/ceph-overrides.yaml avec :

network:
  public:  192.168.122.0/24
  cluster: 192.168.122.0/24

osd_devices:
  - name: sda
    device: /dev/sda
    zap: "1"
  - name: sdb
    device: /dev/sdb
    zap: "1"
  - name: sdc
    device: /dev/sdc
    zap: "1"
  - name: sdd
    device: /dev/sdd
    zap: "1"
  - name: sde
    device: /dev/sde
    zap: "1"
  - name: sdf
    device: /dev/sdf
    zap: "1"

storageclass:
  name: ceph-rbd
  pool: rbd
  user_id: k8s

Et lancer l’installation :

kubectl create namespace ceph
kubectl create -f ceph-helm/ceph/rbac.yaml
kubectl label --overwrite node minikube ceph-mon=enabled ceph-mgr=enabled ceph-rgw=enabled ceph-mds=enabled
kubectl label --overwrite node minikube ceph-osd=enabled ceph-osd-device-sda=enabled ceph-osd-device-sdb=enabled ceph-osd-device-sdc=enabled ceph-osd-device-sdd=enabled ceph-osd-device-sde=enabled ceph-osd-device-sdf=enabled
helm install --name=ceph local/ceph --namespace=ceph -f ceph/ceph-overrides.yaml

On attend que tout les pods soient running :

watch -n1 "kubectl -n ceph get pods"

On vérifie que tout est ok coté ceph :

kubectl -n ceph exec -ti ceph-mon-cppdk -c ceph-mon -- ceph -s

k8s – 1 – Installation de minikube

Minikube permet de tester en local un cluster k8s dans une vm. L’installation se fera sur une debian buster avec un user dans le group sudo.

sudo apt-get update && sudo apt-get install -y apt-transport-https curl vim qemu-kvm libvirt-clients libvirt-daemon-system
sudo adduser $USER libvirt
sudo adduser $USER libvirt-qemu
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo cp minikube /usr/local/bin/ && rm minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-kvm2 && chmod +x docker-machine-driver-kvm2 && sudo mv docker-machine-driver-kvm2 /usr/bin/
minikube start --memory 4096 --cpus 4 --vm-driver kvm2

 

Passage à kubernetes

J’ai un peu lâché l’affaire avec les vm. Kubernetes à l’air sec. Je vais tester ça en local. Le but est d’avoir un cluster k8s fonctionnel avec ceph, un ingress et le monitoring de tout ça.

16 – Installation de la vm ceph mon

La première étape pour installer un serveur ceph est de créer une machine virtuelle sur laquelle tournera le monitor. Le monitor permet de surveiller le cluster ceph et donne accès aux clients du cluster.

Pour installer une machine virtuelle :

virt-install --connect qemu+ssh://root@hv010/system --name cephA-mon001 --memory 512 -lhttp://ftp.fr.debian.org/debian/dists/stretch/main/installer-amd64/ --disk size=2,bus=virtio --network network=admin,model=virtio --accelerate --nographics -v --extra-args "console=ttyS0 hostname=cephA-mon001 domain=hv.internal" --os-type=linux --virt-type=kvm --os-variant=debian9

Les plus attentifs auront remarqués qu’on se connecte à l’hyperviseur avec la commande

--connect qemu+ssh://root@hv010/system

car on exécute cette commande depuis notre machine d’admin.

On met notre vm au carré avec notre playbook base :

ansible-playbook -u root base.yml -l smobe-cephA-mon001

On ajoute nos deux interfaces cephA-front et cephA-back

virsh --connect qemu+ssh://root@hv010/system attach-interface smobe-cephA-mon001 network cephA-front --model virtio --persistent
virsh --connect qemu+ssh://root@hv010/system attach-interface smobe-cephA-mon001 network cephA-back --model virtio --persistent

15 – préparation du réseau pour ceph

Pour installer le cluster ceph nous avons besoin de deux réseaux. Un réseau par lequel le cluster pourra discuter avec ses membres et un réseau sur par lequel passeront les clients.

– vlan 111 pour le réseau cephA-front

– vlan 112 pour le réseau cephA-back

Nous avons déjà vu une configuration similaire précédemment. Je ne la détaille pas. Vous retrouverez les playbook ici : https://github.com/oaudry/cloud/tree/master/ansible/stretch/hyperviseur/004-ceph

14 – Testons l’installation d’une première machine virtuelle

J’aime bien avoir une vm que j’appelle admin. Elle est mon point d’entré sur l’architecture et ma base arrière.

Elle aura une interface sur le réseau d’admin pour discuter avec toute les vm., et une interface publique par laquelle se connecter. Cette machine aura aussi comme particularité d’être la seule à pouvoir se connecter en ssh aux vm. Les autres vm ne pourront pas passer par le réseau d’admin pour discuter entre elle.  Mais nous verrons ça par la suite.

Pour le moment créons notre machine d’admin sur le réseau d’admin pour valider que tout fonctionne comme attendu.

Que nous réussissons à avoir une ip sur le réseau d’admin servi par notre dhcp et que depuis cette ip nous pouvons accéder au web pour faire l’installation.

Ensuite nous ajouterons une interface wan et nous couperons l’accès ssh sur l’ip wan du firewall.

Nous avons fait déjà toute ces étapes. Je vous laisse les retrouver et configurer tout ça correctement.