☸️ Установка Minio на Kubernetes, используя Kubespray и Ansible |

☸️ Установка Minio на Kubernetes, используя Kubespray и Ansible

Мануал

Что такое Minio?

Minio – это S3-совместимое хранилище объектов с открытым исходным кодом, которое можно разместить на Linode.

Развертывание в кластере Kubernetes поддерживается как в автономном, так и в распределенном режимах.

В этом руководстве Kubespray используется для развертывания кластера Kubernetes на трех серверах под управлением Ubuntu 16.04.

Kubespray поставляется с Ansible playbooks, которые упрощают настройку в кластере.

Затем Minio мы установим в кластере в автономном режиме, чтобы продемонстрировать вам, как создать службу.

Перед тем, как начнем

В демонстрационных целях это руководство устанавливает etcd и мастер Kubernetes на одном узле.

Для кластеров высокой доступности потребуется другая конфигурация, которая выходит за рамки данного руководства.

Должен быть пользователь с привилегиями sudo.

Кластер можно моделировать локально, используя Minikube, чтобы освоиться Kubernetes.

☸️ Kubectl Шпаргалка всех необходимых команд Kubernetes часть 1

IP-адреса каждого узла в кластере и их роли будут представлены как kubernetes-master-ip, etcd-ip и slave-ip

 Если вы не хотите устанавливать Ansible и другое программное обеспечение локально, рассмотрите возможность использования другого сервера в качестве переключателя, который будет использоваться для соединения с главным узлом.

Установка Ansible

Обновитесь при необходимости.

sudo apt-get update
sudo apt-get install software-properties-common
Добавьте Ansible PPA; нажмите Enter
sudo apt-add-repository ppa:ansible/ansible
Обновитесь снова, затем установите Ansible.
sudo apt-get update
sudo apt-get install ansible

Дополнительная установка

Kubespray существует как репозиторий Git и требует python-netaddr для манипулирования сетевым адресом.

  1. Установите Git:
    sudo apt install git
    
  2. Установите python-netaddr:
    sudo apt install python-netaddr
    

Измените конфигурацию Kubespray

Kubespray поставляется с несколькими вариантами конфигурации, не показанными в этом руководстве.

Обратитесь к документации для получения дополнительной информации по таким темам, как сетевое взаимодействие с Flannel, установка Helm и крупномасштабные развертывания.

☸️ Разверните готовый кластер Kubernetes с помощью Ansible & Kubespray

Клонируйте репозиторий Kubespray из Github, затем перейдите в репо.
git clone https://github.com/kubernetes-incubator/kubespray.git
cd kubespray
Проверьте тег для желаемой версии Kubespray.
Это руководство написано для версии 2.4.0.
git checkout -b tag/v.2.4.0
Измените ~/kubespray/ansible.cfg, чтобы запускать playbook Ansible на хостах от имени данного пользователя.
Замените имя пользователя на имя вашей учетной записи Unix в remote_user = username в [defaults].
[ssh_connection]
pipelining=True
ssh_args = -o ControlMaster=auto -o ControlPersist=30m -o ConnectionAttempts=100 -o UserKnownHostsFile=/dev/null
#control_path = ~/.ssh/ansible-%%r@%%h:%%p
[defaults]
host_key_checking=False
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp
stdout_callback = skippy
library = ./library
callback_whitelist = profile_tasks
roles_path = roles:$VIRTUAL_ENV/usr/local/share/kubespray/roles:$VIRTUAL_ENV/usr/local/share/ansible/roles:/usr/share/kubespray/roles
deprecation_warnings=False
remote_user=username
Скопируйте каталог inventory  и переименуйте его:
cp -r inventory/sample inventory/minio
Используйте генератор Kubespray, чтобы создать список узлов для Ansible.
Объявите список IP-адресов для каждого сервера.
declare -a IPS=(kubernetes-master-ip etcd-ip slave-ip)
CONFIG_FILE=inventory/minio/hosts.ini python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Не используйте имена хостов при объявлении $IPS. В настоящее время генератор инвентаризации поддерживает только IP-адреса.
Пример конфигурации для кластера в этом руководстве.
[all]
node1    ansible_host=kubernetes-master-ip ip=kubernetes-master-ip
node2    ansible_host=etcd-ip ip=etcd-ip
node3    ansible_host=slave-ip ip=slave-ip

[kube-master]
node1

[kube-node]
node2
node3

[etcd]
node1

[k8s-cluster:children]
kube-node
kube-master

[calico-rr]

[vault]
node1
node2
node3
Раскомментируйте строку docker_dns_servers_strict: false в ~ /kubernetes/inventory/minio/group_vars/all.yml

Подготовьте хосты для Ansible

Прежде чем Ansible сможет правильно запустить Playbooks Kubespray, на хостах должен быть включен безпарольный вход для пользователя sudo и отключен swap.

Убедитесь, что указанный пользователь существует на каждом сервер до начала этих шагов.

В этом разделе показано, как скопировать ключи SSH на каждый сервер и изменить файл sudoers через SSH.

Создайте закрытый ключ, если у вас его нет:

ssh-keygen -b 4096
Скопируйте ключ SSH на каждый IP-адрес, указанный в перечне, с помощью объявленной ранее переменной $IPS и замените имя пользователя для каждого из хостов.
for IP in ${IPS[@]}; do ssh-copy-id username@$IP; done

Создайте безпарольный sudo на нодах

Ниже приведен цикл, который добавляет строку username ALL = (ALL: ALL) NOPASSWD: ALL в последнюю строку файла sudoers.

Вам будет предложено ввести пароль для каждого сервера.

for IP in ${IPS[@]}; do ssh -t username@$IP "echo 'username ALL=(ALL:ALL) NOPASSWD: ALL' | sudo EDITOR='tee -a' visudo"; done

Отключите swap

Добавьте этот фрагмент ниже в конец ~/kubespray/role/bootstrap-os/tasks/main.yml, чтобы отключить swap с помощью Ansible.

- name: Remove swapfile from /etc/fstab
  mount:
    name: swap
    fstype: swap
    state: absent

- name: Disable swap
  command: swapoff -a

Запустите Ansible Playbook

Перед запуском Ansible playbook убедитесь, что брандмауэры отключены, чтобы избежать непредвиденных ошибок.

Запустите cluster.yml.

Если ваш закрытый ключ назван по-другому или находится в другом месте, добавьте –private-key = /path/to/id_rsa

ansible-playbook -i inventory/minio/hosts.ini cluster.yml -b -v

Это может занять до 20 минут.

Как добавить или удалить узлы

Перейдите в ~/kubespray/inventory/minio/hosts.ini и добавьте IP-адрес нового узла.

Запустите ssh-copy-id, чтобы скопировать ваш SSH-ключ на новый узел:

ssh-copy-id username@new-node-ip

Запустите scale.yml:

ansible-playbook -i inventory/minio/hosts.ini scale.yml -b -v
Перейдите по SSH на главный узел Kubernetes, чтобы вывести список всех доступных узлов:
kubectl get nodes

Чтобы удалить узел, просто выключите сервер и очистите мастер-узел с помощью:

kubectl delete node <ip-of-node>

Minio на Kubernetes

Команды в этом разделе должны быть выполнены на узле kubernetes-master

Создайте постоянный том

Постоянные тома (PV) – это абстракция в Kubernetes, представляющая единицу хранения, выделенную в кластере.

PersistentVolumeClaim (PVC) позволит модулю использовать хранилище, выделенное PV.

Этот раздел создает PV 15Gi (гибибайт), а затем позволяет Minio затребовать 10Gi пространства.

На главном узле Kubernetes создайте файл с именем minio-volume.yaml со следующим YAML, отображенным ниже.

Замените имя пользователя на hostPath на соответствующий путь.

kind: PersistentVolume
apiVersion: v1
metadata:
  name: minio-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 15Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/username"
Создайте PV:
kubectl create -f minio-volume.yaml
Создайте PVC с помощью minio-pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pv-claim
  labels:
    app: minio-storage-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
Создайте PVС:
kubectl create -f minio-pvc.yaml

Создайте развертывание

Создайте конфигурацию развертывания в minio-deploy.yaml и подставьте имя пользователя в последнюю строку.

Доступ и секретный ключ находятся в файле YAML.

apiVersion: apps/v1 #  for k8s versions before 1.9.0 use apps/v1beta2  and before 1.8.0 use extensions/v1beta1
kind: Deployment
metadata:
  # This name uniquely identifies the Deployment
  name: minio-deployment
spec:
  selector:
    matchLabels:
      app: minio
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        # Label is used as selector in the service.
        app: minio
    spec:
      # Refer to the PVC created earlier
      volumes:
      - name: storage
        persistentVolumeClaim:
          # Name of the PVC created earlier
          claimName: minio-pv-claim
      containers:
      - name: minio
        # Pulls the default Minio image from Docker Hub
        image: minio/minio:latest
        args:
        - server
        - /storage
        env:
        # Minio access key and secret key
        - name: MINIO_ACCESS_KEY
          value: "minio"
        - name: MINIO_SECRET_KEY
          value: "minio123"
        ports:
        - containerPort: 9000
          hostPort: 9000
        # Mount the volume into the pod
        volumeMounts:
        - name: storage # must match the volume name, above
          mountPath: "/home/username"

Создайте развертывание

kubectl create -f minio-deploy.yaml

Создайте сервис

vim Minio-svc.yml

Добавьте в файл следующие строки:

vim Minio-svc.yml

Add the lines below to the file.

apiVersion: v1
kind: Service
metadata:
  # This name uniquely identifies the service
  name: minio-service
spec:
  type: LoadBalancer
  ports:
    - name: http
      port: 9000
      targetPort: 9000
      protocol: TCP
  selector:
    # Looks for labels `app:minio` in the namespace and applies the spec
    app: minio
Установим сервис:
kubectl create -f Minio-svc.yml
Посмотрите список запущенных сервисов.
Под столбцом PORT (S) вы можете увидеть, что служба Minio работает внутри по порту 9000, а 30593 – это внешний порт через LoadBalancer.
kubectl get services
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes      ClusterIP      10.233.0.1              443/TCP          1d
minio-service   LoadBalancer   10.233.28.163        9000:30593/TCP   20m
В браузере перейдите по общедоступному IP-адресу с любого сервера в кластере по порту (30593 в приведенном выше примере).
Введите креды, которые писали ранее.
Minio имеет схожую функциональность с S3: загрузка файлов, создание сегментов и хранение других данных.

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий

  1. Константин

    Добрый день, я так понимаю команду создания сервиса пропустили?
    Создайте сервис
    а команды нет.

    И еще есть ошибка:
    Создайте конфигурацию развертывания в minio-deploy.yaml
    Создайте развертывание kubectl create -f minio-deployment.yaml
    те имена файлов не совпадают

    Ответить
    1. cryptoparty автор

      Добрый день, спасибо поправили

      Ответить
  2. Константин

    UPD ну и соответственно нет config файла для service

    Ответить
    1. cryptoparty автор

      configmap?

      Ответить
      1. Константин

        Спасибо за оперативность) с k8s только знакомлюсь поэтому точно сказать не могу, видимо да configmap.

        Ответить