Pull to refresh

Установка kubernetes через kubespray (local-storage, установка Elasticsearch + Fluentd + Kibana, prometheus)

Reading time4 min
Views24K

Как поднять High-Availability Kubernetes кластер и не взорвать мозг? Использовать Kubespray, конечно же.


Kubespray — это набор Ansible ролей для установки и конфигурации системы оркестрации контейнерами Kubernetes.


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


Осторожно, под катом 4 скриншота elasticsearch и 9 скриншотов prometheus!


Подготовка


Имеется 3 ноды Centos 7 с 8ГБ памяти.
Лучше использовать 16ГБ
На каждой ноде выполняем следующее.
Подключаем диски, размеры которых нам нужны.


Для elastic нужны 3 PV больше 30ГБ (data.persistence.size) и 2 PV больше 4ГБ (master.persistence.size).


Для этого на каждой ноде создадим 2 диска нужных нам размеров.
Размеры диска зависит от кол-ва ваших данных — нужно проверять экспериментально.


Disk /dev/vdb: 21.5 GB
Disk /dev/vdc: 53.7 GB

Через fdisk создаем на каждом 1 раздел


В /mnt/disks создаем папку с названием нашего нового диска


mkdir -p /mnt/disks/vdb1
mkdir -p /mnt/disks/vdc1

Создаем ФС на этих дисках


mkfs.xfs -f /dev/vdb1
mkfs.xfs -f /dev/vdc1

Примонтируем диски в эту папки


mount /dev/vdb1 /mnt/disks/vdb1
mount /dev/vdc1 /mnt/disks/vdc1

Проверяем


mount | grep mnt
/dev/vdb1 on /mnt/disks/vdb1 type xfs (rw,relatime,attr2,inode64,noquota)
/dev/vdc1 on /mnt/disks/vdc1 type xfs (rw,relatime,attr2,inode64,noquota)

Выключаем Firewall на всех нодах (я думаю это костыль, но пока так)


systemctl stop firewalld
iptables -F

Скачиваем kubespray и запускаем установку kubernetes


git clone https://github.com/kubernetes-incubator/kubespray.git
cd kubespray
git tags - смотрим теги
git checkout 'последний tag'
sudo pip install -r requirements.txt

Приводим inventory/sample/hosts.ini к следующему виду (названия нод замените на свои)


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

[all]
test-tools-kuber-apatsev-1 ansible_host=ip-первой-ноды ip=ip-первой-ноды
test-tools-kuber-apatsev-2 ansible_host=ip-второй-ноды ip=ip-второй-ноды
test-tools-kuber-apatsev-3 ansible_host=ip-третьей-ноды ip=ip-третьей-ноды

[kube-master]
test-tools-kuber-apatsev-1
test-tools-kuber-apatsev-2
test-tools-kuber-apatsev-3

[kube-node]
test-tools-kuber-apatsev-1
test-tools-kuber-apatsev-2
test-tools-kuber-apatsev-3

[etcd]
test-tools-kuber-apatsev-1
test-tools-kuber-apatsev-2
test-tools-kuber-apatsev-3

[calico-rr]

[vault]
test-tools-kuber-apatsev-1
test-tools-kuber-apatsev-2
test-tools-kuber-apatsev-3

Меняем значения ниже в файле inventory/sample/group_vars/k8s-cluster/addons.yml


helm_enabled: true # устанавливаем helm на ноды
local_volume_provisioner_enabled: true # активируем local volume provisioner
ingress_nginx_enabled: true # активируем ingress controller

Добавляем в конец файла inventory/sample/group_vars/k8s-cluster.yml


docker_dns_servers_strict: no # устанавливаем в 'no', если число DNS серверов больше 3

Запускаем установку
Перед установкой читаем документацию kubespray https://github.com/kubernetes-incubator/kubespray
ansible-playbook -u 'пользователь, который имеет sudo на нодах' -i inventory/sample/hosts.ini cluster.yml -b


Проверяем наличие StorageClass


kubectl get storageclass
NAME            PROVISIONER                    AGE
local-storage   kubernetes.io/no-provisioner   18m

Проверяем PV


kubectl get pv
local-pv-26b51a64  49Gi  RWO  Delete  Available  local-storage  11m
local-pv-5bec36e4  19Gi  RWO  Delete  Available  local-storage  14m
local-pv-81c889eb  49Gi  RWO  Delete  Available  local-storage  13m
local-pv-aa880f42  19Gi  RWO  Delete  Available  local-storage  10m
local-pv-b6ffa66b  19Gi  RWO  Delete  Available  local-storage  11m
local-pv-d465b035  49Gi  RWO  Delete  Available  local-storage  10m

Инициилизируем Helm


helm init --service-account tiller

Запускаем установку elasticsearch


helm install stable/elasticsearch --namespace logging --name elasticsearch --set data.persistence.storageClass=local-storage,master.persistence.storageClass=local-storage

Подождите 5 минут пока установиться elasticsearch


Находим сервис, которому будет подключаться kibana и fluentd. В своем названии обычно имеет elasticsearch-client


kubectl get services --namespace logging | grep elasticsearch
elasticsearch-client      ClusterIP   10.233.60.173   <none>        9200/TCP   19s
elasticsearch-discovery   ClusterIP   None            <none>        9300/TCP   19s

Название elasticsearch-client указываем при установке fluentd-elasticsearch


helm install stable/fluentd-elasticsearch --namespace logging --set elasticsearch.host=elasticsearch-client

Название elasticsearch-client указываем при установке kibana


helm install --namespace logging --set ingress.enabled=true,ingress.hosts[0]=kibana.mydomain.io --set env.ELASTICSEARCH_URL=http://elasticsearch-client:9200 stable/kibana

Смотрим что все поды имеют статус running


kubectl get pod --namespace=logging

Если есть ошибка — смотрим логи.


kubectl logs имя-пода  --namespace logging

Добавляем в DNS или в файл /etc/hosts


IP-первой-ноды kibana.mydomain.io
IP-второй-ноды kibana.mydomain.io
IP-третьей-ноды kibana.mydomain.io

Примечание: если вы хотите отправлять логи на внешний Elasticsearch, то следует запускает установку с elasticsearch.host=dns-имя-вашего-внешнего-elasticsearch


Переходим по адресу kibana.mydomain.io
Нажимаем Index Pattern



Вводим название index, чтобы он совпадал с index ниже



выбираем @ timestamp



И вот EFK работает



Запускаем установку kube-prometheus


Скачиваем prometheus-operator


git clone https://github.com/coreos/prometheus-operator.git

Переходим в папку kube-prometheus


cd prometheus-operator/contrib/kube-prometheus

Запускаем установку согласно инструкции на сайте


kubectl create -f manifests/ || true
until kubectl get customresourcedefinitions servicemonitors.monitoring.coreos.com ; do date; sleep 1; echo ""; done
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
kubectl create -f manifests/ 2>/dev/null || true

Создаем файл ingress-grafana-prometheus.yml


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  namespace: monitoring
spec:
  rules:
  - host: grafana.mydomain.io
    http:
      paths:
      - backend:
          serviceName: grafana
          servicePort: 3000

Создаем ingress ресурс


kubectl create -f ingress-grafana-prometheus.yml

добавляем в DNS или в файл /etc/hosts


IP-первой-ноды grafana.mydomain.io
IP-второй-ноды grafana.mydomain.io
IP-третьей-ноды grafana.mydomain.io

Переходим по адресу grafana.mydomain.io. Вводим стандартные логин/пароль: admin/admin
Скриншоты prometheus:











P.S.: Обо всех ошибках лучше сразу писать в приват.

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+5
Comments6

Articles