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

от автора

Как поднять High-Availability Kubernetes кластер и не взорвать мозг?
Использовать Kubespray, конечно же.
Kubespray — это набор Ansible ролей для установки и конфигурации системы оркестрации контейнерами Kubernetes.
Kubernetes является проектом с открытым исходным кодом, предназначенным для управления кластером контейнеров Linux как единой системой. Kubernetes управляет и запускает контейнеры на большом количестве хостов, а так же обеспечивает совместное размещение и репликацию большого количества контейнеров.
Осторожно, под катом 4 скриншота elasticsearch и 9 скриншотов prometheus!

Подготовка

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

Для 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)

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

git clone https://github.com/kubernetes-incubator/kubespray.git cd kubespray 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

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

Запускаем установку 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:

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


ссылка на оригинал статьи https://habr.com/post/426959/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *