• DevOps
  • Защита информации
  • ИТ-поддержка
  • Настройка, установка, мониторинг, подключение Ceph к кластеру k8s

    Ceph - продукт, позволяющий построить распределенное хранилище данных с широким спектром возможностей подключения хранилища клиентам. Возможно подключение как в режиме блочных устройств (rbd), так и в режиме файловой системы (cephfs). В рамках данной инструкции рассмотрим установку на тестовый кластер последней на текущий момент версии ceph 15 octopus и подключение созданного кластера к кластеру k8s, c возможностью автоматического создания на основе технологии DP ( dynamic provisioning).

    За основу тестового кластера ceph взяты:

    • Три виртуальные машины в конфигурации 4gb ram, 2 ядра, диск под систему 20 gb, пустой диск sdb на 50 gb.
    • Операционная система - centos 8.

    Демоны ceph выполняют разные функции, например, через monitor подключаются клиенты, а osd отвечают за хранение данных и в продуктовых инсталляциях необходимо разносить роли по разным машинам, но в рамках нашего стенда все три сервера будут нести на себе все роли. Произведем предварительные настройки.

    Преднастройка кластера

    Шаг 1.

    В файлы /etc/hosts машин необходимо добавить следующие строки:

    192.168.66.161 ceph1
    192.168.66.162 ceph2
    192.168.66.163 ceph3
    

    Шаг 2.

    Необходимо установить корректные имена узлов командой hostnamectl set-hostname cephX, где x - 1,2,3 соответственно.

    Шаг 3.

    Установка ceph будет проводиться с вм ceph1, на ней следует выполнить команды для аутентификации по ключу на двух других нодах:

    :
    ssh-keygen
    ssh-copy-id -i ~/.ssh/id_rsa.pub ceph1
    ssh-copy-id -i ~/.ssh/id_rsa.pub ceph2
    ssh-copy-id -i ~/.ssh/id_rsa.pub ceph3
    

    Шаг 4.

    На все серверы необходимо установить sshpass:

    yum install sshpass

    Выполнить логин на все три сервера, ssh [email protected], ssh [email protected], ssh [email protected] с целью проверки, что все работает корректно.

    Шаг 5.

    Устанавливаем git, скачиваем плейбук установки ceph:

    yum install git
    git clone https://github.com/ceph/ceph-ansible.git
    git checkout stable-5.0
    cd ceph-ansible
    
    yum install python3-pip
    pip3 install -r requirements.txt
    echo "PATH=\$PATH:/usr/local/bin" >>~/.bashrc
    source ~/.bashrc
    

    Шаг 6.

    В файл group_vars/all.yml вносим следующее содержимое:

    ####################################
    
    ceph_origin: repository
    ceph_repository: community
    ceph_stable_release: octopus
    public_network: "192.168.66.0/24"
    cluster_network: "192.168.66.0/24"
    
    #ntp_service_enabled: true
    #ntp_daemon_type: ntpd
    
    ceph_release_num: 15
    cluster: ceph
    
    osd_objectstore: bluestore
    osd_scenario: lvm
    devices:
      - /dev/sdb
    
    ceph_conf_overrides:
      global:
        osd_pool_default_pg_num: 64
        osd_pool_default_pgp_num: 64
        osd_journal_size: 5120
        osd_pool_default_size: 3
        osd_pool_default_min_size:  2
    
    
    # Firewalld / NTP
    configure_firewall: True
    ntp_service_enabled: true
    ntp_daemon_type: chronyd
    
    
    # DASHBOARD
    dashboard_enabled: True
    dashboard_protocol: http
    dashboard_admin_user: admin
    dashboard_admin_password: [email protected]@ssw0rd
    
    grafana_admin_user: admin
    grafana_admin_password: [email protected]@ssw0rd
    ##############################################
    
    mkdir inventory
    nano inventory/hosts
    

    Шаг 7.

    Создаем файл hosts со следующим содержимым:

    [mons]
    ceph1 monitor_address=192.168.66.161
    ceph2 monitor_address=192.168.66.162
    ceph3 monitor_address=192.168.66.163
    
    [osds]
    ceph1
    ceph2
    ceph3
    
    [mgrs]
    ceph1
    ceph2
    ceph3
    
    [mdss]
    ceph1
    ceph2
    ceph3
    
    [grafana-server]
    ceph1
    ceph2
    ceph3
    
    ###################################
    

    Шаг 8.

    Выполняем:

    cp site.yml.sample site.yml

    Настраиваем подключение кластера k8s к кластеру ceph в варианте cephfs

    Шаг 1.

    На кластере ceph создаем пул:

    ceph osd pool create k8s 8 8
    
    ceph auth add client.k8s mon 'allow r' osd 'allow rwx pool=k8s'
    ceph auth get-key client.k8s
    

    Видим вывод:

    AQBOksZfOup7LxAAPSRCRxLPe2untxipYjHBuA==

    ceph auth get-key client.admin

    AQDLRcZfInoxGxAALugbHb0LYQPuwMho6KN0xw==

    Выполняем:

    ceph mon dump

    чтобы увидеть id нашего кластера и адреса мониторов.

    Шаг 2.

    Переходим в кластер k8s. устанавливаем csi драйвер для работы с ceph:

    helm repo add ceph-csi https://ceph.github.io/csi-charts
    helm inspect values ceph-csi/ceph-csi-cephfs >cephfs.yml
    

    Шаг 3.

    В файле cephfs.yaml меняем для нашего кластера:

    csiConfig:
       - clusterID: "52cb0d47-30e1-4d30-acd6-c2f51dc48505"
        monitors:
        - "192.168.66.161:6789"
        - "192.168.66.162:6789"
        - "192.168.66.163:6789"
    nodeplugin:
      httpMetrics:
        enabled: true
        containerPort: 8091
      podSecurityPolicy:
        enabled: true
    provisioner:
      replicaCount: 1
      podSecurityPolicy:
        enabled: true
    

    Шаг 4.

    Устанавливаем чарт:

    helm upgrade -i ceph-csi-cephfs ceph-csi/ceph-csi-cephfs -f cephfs.yml -n ceph-csi-cephfs --create-namespace

    Шаг 5.

    Создаем secret.yaml:

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: csi-cephfs-secret
      namespace: ceph-csi-cephfs
    stringData:
    # Required for dynamically provisioned volumes
      adminID: admin
      adminKey: AQDLRcZfInoxGxAALugbHb0LYQPuwMho6KN0xw==
    

    Выполняем:

    kubectl create –f secret.yaml

    Шаг 6.

    Создаем storageclass.yaml:

    ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-cephfs-sc
    provisioner: cephfs.csi.ceph.com
    parameters:
      clusterID: 52cb0d47-30e1-4d30-acd6-c2f51dc48505
      fsName: cephfs
      csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
      csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-cephfs
      csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
      csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-cephfs
      csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
      csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-cephfs
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    mountOptions:
    - debug
    
    kubectl create –f storageclass.yaml
    

    Шаг 7.

    Создаем pvc.yaml:

    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-cephfs-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
        storage: 1Gi
      storageClassName: csi-cephfs-sc
    
    
    kubectl create –f pvc.yaml
    

    Выводом команд убеждаемся что pvc связан с автоматически созданным pv:

    kubectl get pvc
    kubectl get pv
    

    Итого, получили возможность создавать pvc - provisioner создает pv на cephfs.

    Подключаем ceph в режиме rbd к кластеру kubernetes

    Теперь настроим тестовое подключение в режиме rbd.

    Шаг 1.

    На сервере ceph выполняем:

    ceph osd pool create kuberbd 32
    ceph osd pool application enable kuberbd rbd
    

    Так как у нас в кластер k8s уже установлен csi, для cephps, пропустим этап добавления репозитория (https://ceph.github.io/csi-charts) и сразу экспортим набор переменных чарта:

    helm inspect values ceph-csi/ceph-csi-rbd > rbd.yml

    В получившемся yaml вносим правки с данными нашего ceph кластера:

    csiConfig:
       - clusterID: "52cb0d47-30e1-4d30-acd6-c2f51dc48505"
        monitors:
        - "v2:192.168.66.161:3300/0,v1:192.168.66.161:6789/0"
        - "v2:192.168.66.162:3300/0,v1:192.168.66.162:6789/0"
        - "v2:192.168.66.163:3300/0,v1:192.168.66.163:6789/0"
    
    nodeplugin:
      podSecurityPolicy:
        enabled: true
    
    provisioner:
      podSecurityPolicy:
        enabled: true
    

    Шаг 2.

    Устанавливаем в кластер чарт:

    helm upgrade -i ceph-csi-rbd ceph-csi/ceph-csi-rbd -f rbd.yml -n ceph-csi-rbd --create-namespace

    Смотрим ключ доступа для юзера admin (в production правильно создавать отдельного юзера с правами на запись):

    ceph auth get-key client.admin

    Шаг 3.

    Создаем secret.yaml:

    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: csi-rbd-secret
      namespace: ceph-csi-rbd
    stringData:
      userID: admin
      userKey: AQDLRcZfInoxGxAALugbHb0LYQPuwMho6KN0xw==
    

    Выполняем команду:

    kubectl apply -f secret.yaml

    Шаг 4.

    Создаем storageclass.yaml:

     ---
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
       name: csi-rbd-sc
    provisioner: rbd.csi.ceph.com
    parameters:
       clusterID: 52cb0d47-30e1-4d30-acd6-c2f51dc48505
       pool: kuberbd
    
       imageFeatures: layering
    
       csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
       csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi-rbd
       csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
       csi.storage.k8s.io/controller-expand-secret-namespace: ceph-csi-rbd
       csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
       csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi-rbd
    
       csi.storage.k8s.io/fstype: ext4
    
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    mountOptions:
      - discard
    
      kubectl apply -f storageclass.yaml
    

    Шаг 5.

    Создаем pvc.yaml:

     apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: rbd-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
        storage: 2Gi
      storageClassName: csi-rbd-sc
    

    Выполняем:

    kubectl apply -f pvc.yaml

    Проверим в графическом интерфейсе ceph наличие созданных нами пулов:

    Пулы присутствуют, встроенный дашборд и grafana позволят в базовом варианте мониторить нагрузку на наш кластер. Более тонкая настройка мониторинга и алертинга - тема отдельных статей.

    В итоге мы получили пригодный для обучения и тестирования различных сценариев работы кластер ceph. Как клиента подключили кластер k8s в режиме cephfs и rbd, что дало возможность создавать pv на основе pvc в автоматическом режиме посредством dynamic provisioning.

    Возможно, для решения ваших задач подойдет наш DevOps-аутсорсинг.

    Не нашли ответа на свой вопрос?
    Содержание

    Есть вопросы?

    Закажите звонок специалиста!

    Есть вопросы?

    Закажите звонок специалиста!
    *нажимая на кнопку, Вы даете согласие на обработку персональных данных