Thank you for reading this post, don't forget to subscribe!
Minio – это S3-совместимое хранилище объектов с открытым исходным кодом, которое можно разместить на Linode.
Развертывание в кластере Kubernetes поддерживается как в автономном, так и в распределенном режимах.
В этом руководстве Kubespray используется для развертывания кластера Kubernetes на трех серверах под управлением Ubuntu 16.04.
Kubespray поставляется с Ansible playbooks, которые упрощают настройку в кластере.
Затем Minio мы установим в кластере в автономном режиме, чтобы продемонстрировать вам, как создать службу.
Перед тем, как начнем
В демонстрационных целях это руководство устанавливает etcd и мастер Kubernetes на одном узле.
Для кластеров высокой доступности потребуется другая конфигурация, которая выходит за рамки данного руководства.
Должен быть пользователь с привилегиями sudo.
Кластер можно моделировать локально, используя Minikube, чтобы освоиться Kubernetes.
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 для манипулирования сетевым адресом.
Установите Git:
sudo apt install git
Установите python-netaddr:
sudo apt install python-netaddr
Измените конфигурацию Kubespray
Kubespray поставляется с несколькими вариантами конфигурации, не показанными в этом руководстве.
Обратитесь к документации для получения дополнительной информации по таким темам, как сетевое взаимодействие с Flannel, установка Helm и крупномасштабные развертывания.
Клонируйте репозиторий 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].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[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-адреса.
Пример конфигурации для кластера в этом руководстве.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[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 |
Подготовьте хосты для Ansible
Прежде чем Ansible сможет правильно запустить Playbooks Kubespray, на хостах должен быть включен безпарольный вход для пользователя sudo и отключен swap.
Убедитесь, что указанный пользователь существует на каждом сервер до начала этих шагов.
В этом разделе показано, как скопировать ключи SSH на каждый сервер и изменить файл sudoers через SSH.
Создайте закрытый ключ, если у вас его нет:
1 |
ssh-keygen -b 4096 |
1 |
for IP in ${IPS[@]}; do ssh-copy-id username@$IP; done |
Создайте безпарольный sudo на нодах
Ниже приведен цикл, который добавляет строку username ALL = (ALL: ALL) NOPASSWD: ALL в последнюю строку файла sudoers.
Вам будет предложено ввести пароль для каждого сервера.
1 |
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.
1 2 3 4 5 6 7 8 |
- 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 на соответствующий путь.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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" |
Создайте развертывание
1 |
kubectl create -f minio-deployment.yaml |
Создайте сервис
1 |
kubectl get services |
1 2 3 |
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 |