Всем привет!
Продолжаем освещать вас жизненными примерами по разворачиванию сервиса Exchange Listener. Если вы пропустили прошлую публикацию, то рекомендуем также с ней ознакомиться - https://community.terrasoft.ru/articles/1-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes.
На этот раз поделился подробной инструкцией с нами пользователь Еремеев Игорь Юрьевич (ссылка на профиль - https://community.terrasoft.ru/user/196420). Данная инструкция полезна тем, что в ней предоставлены наглядные скриншоты и решение по ошибкам, которые могут возникнуть в процессе развертывания.
(!) Данная инструкция процитирована и зафиксирована в таком виде, в каком нам передали с небольшими изменениями.
Задача поднять Кластер (Cluster) Kubernetes
Kubernetes — нишевое решение под конкретные проекты.
Kubernetes средство оркестрации (управления) контейнерами Docker. Это инструмент для их автоматического запуска, выделения ресурсов, контроля состояния, обновления.
Системные требования
Устанавливаем на виртуальных машинах:
- мастер нода – 1 виртуальная машина - 2 cpu и 4 gb ram
- рабочие ноды – 2 виртуальные машины - 2 cpu и 4 gb ram
Структура кластера
Примечание:
- Виртуальная машина 1 Поколение;
- Образ CentOS-7-x86_64-NetInstall-2003;
- Пользователь root, 123456qQ;
Необходимые условия:
- Установлена ВМ (прим. виртуальная машина) Centos 8;
- Отключён Firewall, своппинг, SELinux;
- Для дальнейших шагов необходим неограниченный доступ в Интернет.
Подготовим 1 образа, далее просто его скопируем под 3 ВМ (см инструкцию 0. Kubernetes преднастройка VM CentOS)
Далее делаем на всех нодах
- Приведем имена в порядок
hostnamectl set-hostname master-node
hostnamectl set-hostname node-1
hostnamectl set-hostname node-2
- Пропишем внутренний DNS
задайте имя хоста системы и обновите DNS в файле / etc / hosts
cat <<EOF>> /etc/hosts
192.168.25.182 master-node
192.168.25.30 node-1 worker-node-1
192.168.25.170 node-2 worker-node-2
EOF
- Установите Docker-CE на CentOS 8
- Сначала необходимо добавить репозиторий Docker.
- Также установите пакет containerd.io , который доступен в качестве демона, который управляет полным жизненным циклом контейнера его хост-системы, от передачи и хранения образа до выполнения и контроля контейнера, до низкоуровневого хранилища, сетевых вложений и далее.
- Команды под учетной записью root запускаю сразу весь пакет, Ставим на всех ВМ
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm -y
dnf install docker-ce -y
systemctl enable docker
systemctl start docker
4. Установите Kubernetes (Kubeadm)
4.1. Необходимо добавить репозитории Kubernetes вручную
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
4.2. Установить пакет kubeadm
dnf install kubeadm -y
systemctl enable kubelet
systemctl start kubelet
Все что выше делаем на всех ВМ.
5. на мастере выполняем команды:
5.1.
kubeadm init --pod-network-cidr=10.244.0.0/16
(!) Важно сохраняем результат
kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad \ --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8
если потеряли токен то можно запросить
kubeadm token list
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ 5.2
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
5.3. Устанавливаем Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml
5.4. . Вводим команду для возможности запуска контейнеров на текущей машине:
kubectl taint nodes --all node-role.kubernetes.io/master-
Делаем reboot – много всего поставлено
6. Проверяю состояние подов:
kubectl -n kube-system get pods
Все работает
7. Устанавливаем Helm:
wget https://get.helm.sh/helm-v3.3.0-rc.1-linux-amd64.tar.gz
tar xzvf helm-v3.3.0-rc.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
И подключаем репозиторий (возьмем самый популярный) и делаем update
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm repo update
Делаем бэкап своих виртуальных машин.
Результат у нас создан кластер из 1 ВМ, созданы ВМ на которой установлен только Докер.
8. Устанавливаем Redis:
helm repo update
helm install --namespace default --set usePassword=false --set=slave.persistence.enabled=false --set master.persistence.enabled=false --set cluster.enabled=false redis bitnami/redis
используем --namespace default
Получили:
To connect to your Redis server:
1. Run a Redis pod that you can use as a client:
kubectl run --namespace default redis-client --rm --tty -i --restart='Never' \
--image docker.io/bitnami/redis:5.0.7-debian-10-r32 -- bash
2. Connect using the Redis CLI:
redis-cli -h redis-master
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/redis-master 6379:6379 &
redis-cli -h 127.0.0.1 -p 6379
Результат.
9. Устанавливаем Exchange Listener.
Нам потребуется ip-адрес redis-master: XX.XXX.233.155 (см. скриншоты)
Качаем последний актуальный дистрибутив (на данный момент 0.6.9):
wget http://ftp.bpmonline.com/support/downloads/Exchangelistener/exchangelistener-0.6.9.tgz
helm install --set env.host=XX.XXX.233.155 --set service.type=NodePort --set service.nodePort=30001 --set apiVersion=apps/v1 --namespace default elistener exchangelistener-0.6.9.tgz
--set env.host - указать IP мастер Redis
default - namespace, который использовался в пункте 11.
elistener - произвольное название нашего сервиса.
exchangelistener-0.6.9.tgz - путь к скачанному дистрибутиву.
Порт не обязательно должен быть 30001. Допустимый диапазон 30000-32767.
На этом минимальная настройка сервиса на стороне сервера завершена.
10. Проверяем поды сервиса
kubectl get pods
Проверяем доступность сервиса Exchange Listener.
telnet: -
telnet 192.168.25.182 30001
Где:
192.168.25.182 - ip-адрес нашей linux-машины,
30001 - порт сервиса Exchange Listener, выбранный при установке на 12 шаге.
Если соединение проходит - открываем веб-браузер (желательно сразу на машине с Creatio) и вводим в адресную строку http://192.168.25.182:30001/api/listeners/status
Включим в кластер еще 2 ВМ
(команду kubeadm init --pod-network-cidr=10.244.0.0/16 не вводим)
- Node-1
Вводим ключ-команду
kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8
если потеряли токен то можно запросить
kubeadm token list
- Проверяем поды на master-машине (их должно стать больше):
kubectl -n kube-system get pods
- Node-2
Вводим ключ-команду
kubeadm join 192.168.25.182:6443 --token z86i8r.u6mmy6adnkmp4iad --discovery-token-ca-cert-hash sha256:8104a99fe76b167b65d5d450467ec14fd60b973db9f97a40e81c90cc7ade73b8
- На мастере проверяем
kubectl get node
kubectl get svc
kubectl get pods
Какие команды могут помочь при решении проблем:
Почему-то не было доступа из внешнего IP к порту 30001, где развернут сервис. и были выполнены следующие команды:
ufw allow 30001 - команда конкретно firewall ubuntu. К другим дистрибутивам вероятнее всего не подойдет (возможно только если к Mint, т.к. ядро тоже самое).
iptables -I INPUT -p tcp --dport 30001 -j ACCEPT - уже более распространенный вариант.
Команды для просмотра логов. Примеры:
kubectl logs POD_NAME
kubectl logs REDIS_NAME-api-0
kubectl logs elistener-api-0
kubectl logs elistener-api-1
kubectl logs redis-master-0
log4net:ERROR Could not create Appender [ExchangeListenerGelfAmqpAppender] of type [Gelf4Net.Appender.GelfAmqpAppender, Gelf4Net.AmqpAppender]. Reported error follows.
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed --->
Означает, что он не может Rabbit не может достучаться до Graylog (мониторинг логов). В данном случае у вас не настроен Graylog. Но это не должно блокировать работу. Можно ориентировать на вот это Gelf4Net (он пишет в Rabbit).
Но ниже по логу должно быть видно следующее:
Hosting environment: Production Content root path: /app Now listening on: http://[::]:80 Application started. Press Ctrl+C to shut down.
Если это так, то значить сервис запущен и теперь вам нужно проверить доступность и статус сервиса.
А после провести настройку на стороне Creatio.