#1 Реальный пример по развертыванию сервиса Exchange Listener с использованием KUBERNETES
Всем привет!
В данной статье описан один из возможных сценариев как можно развернуть сервис в On-Site, с которым поделился наш партнер "Baso-IT" в лице Александра Горчакова. Данная инструкция процитирована и зафиксирована в таком виде, в каком партнер нам передал.
Характеристики (из расчета ~70 почтовых ящиков):
- одна виртуальная машина (Ubuntu без предустановленных настроек с root-доступ)
- 2 ядра по 2 Гц
- с оперативной памятью 4gb
Шаги, которые были предприняты для разворачивания сервиса (текущую машину будем считать master-машиной):
(!) за основу брать инструкцию по разворачиванию сервиса на Академии - https://academy.terrasoft.ru/documents?product=administration&ver=7&id=2075
1. На "чистой" Ubuntu (версия 20.04) создаем нового пользователя
adduser username
и добавляем его в группу sudo:
usermod -a -G sudo username
ssh-доступ он получит по умолчанию.
(!) Далее если система где-то будет ругаться на root-доступ или отсутствие прав - просто добавляем в начале команды sudo
2. Логинимся под созданным пользователем и устанавливаем Midnight Commander, для более удобного пользования каталогами:
apt install mc
При установке система может задать вопрос - выбираем Y
3. Обновляемся и ставим Docker:
apt-get update apt-get install -y docker.io
Стоит его так же сразу перезапустить:
service docker restart
4. Устанавливаем kubeadm, kubelet и kubectl:
apt-get update && apt-get install -y apt-transport-https curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
ИЛИ (нужно знать как работать в редакторе VIM (https://help.ubuntu.ru/wiki/vim)
apt-get update && apt-get install -y apt-transport-http curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - sudo vim /etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main
Здесь может оказаться так, что система не даст создать файл kubernetes.list ввиду отсутствующего каталога sources.list.d
Если так случится - сначала используем mkdir и создаем каталог:
mkdir /etc/apt/sources.list.d
Далее повторяем последние 3 команды из пункта 4:
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
Устанавливаем Kubernetes:
apt-get update apt-get install -y kubelet kubeadm kubectl kubernetes-cni
5. Далее выполняем команду:
kubeadm init --pod-network-cidr=10.244.0.0/16
Именно 10.244.0.0/16! Вводим ровно то что написано.
Процесс может занять минуту или более в зависимости от вашего интернет-соединения.
Результат выполнения команды
В процессе установки могут быть Warning и Error. Последние сначала придется устранить.
Самый популярный Error - жалоба на swap. Замечу что банальной команды отключения swap (swapoff -a) недостаточно, т.к. даже в случае успешной установки - после перезагрузки системы придется повторно ее вводить каждый раз, что не очень удобно (иначе просто ничего не будет работать).
Рекомендую запустить тот же MobyXTerm или Midnight Commander (mc), найти файл fstab ("/etc/fstab"), расположенный в каталоге etc и просто закомментировать (поставить в начале строки #) строку, в которой содержится слово swap и перезагрузить машину.
Так же можно просто не создавать swap-раздел при установке ubuntu.
В случае успешного выполнения система предоставит команду для подключения других машин к текущей для создания кластера (выдуманный пример):
kubeadm join 192.168.101.199:6443 --token selist.zho8rggai807dtsr \ --discovery-token-ca-cert-hash sha256:8250d1a19e1c9bc7ab32ef43811f143f1c658ccc476383e9260d133a2988666c
Сохраните полученную команду и используйте при необходимости собрать кластер.
Так же в процессе выполнения могут быть Warning'и вида:
docker service is not enabled, please run 'systemctl enable docker.service'
Собственно вводим то что написано:
#Как вылечить сообщение [WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service' systemctl enable docker.service
Или же такие:
detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd"
В таком случае создаем\редактируем файл daemon.json, расположенный по пути etc/docker (можно вручную отредактировать через cat или vim):
{ "exec-opts": ["native.cgroupdriver=systemd"] }
Но можно и командой, которая все делает:
#Как вылечить [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF
И перезапускаем Docker:
service docker restart
Но в целом это скорее просто рекомендация. Работать будет и так.
6. Вводим команды:
sudo mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
7. Вводим команду для возможности запуска контейнеров на текущей машине:
kubectl taint nodes --all node-role.kubernetes.io/master-
8. Устанавливаем 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
9. Проверяем состояние подов:
kubectl -n kube-system get pods
Должны быть статусы Running
10. Устанавливаем 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
Название дистрибутива может меняться. В данный момент это текущая актуальная версия.
И подключаем репозиторий (возьмем самый популярный):
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
11. Устанавливаем 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 k8s по умолчанию (default). Как и название Redis'а (redis).
12. Устанавливаем Exchange Listener.
Качаем последний актуальный дистрибутив (на данный момент 0.6.9):
wget http://ftp.bpmonline.com/support/downloads/Exchangelistener/exchangelistener-0.6.9.tgz
Находим ip-адрес redis-master:
kubectl get service
В выводе в столбце ClusterIP будут ip-адреса. Нас интересует redis-master
Допустим это 10.104.17.189
В таком случае следующая команда будет выглядеть:
helm install --set env.host=10.104.17.189 --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.
На этом минимальная настройка сервиса на стороне сервера завершена.
Пункты 1 и 2 тоже не могу назвать обязательными. Это скорее рекомендация для личного удобства.
Проверяем состояние сервисов:
kubectl get pods
Должны быть состоянии Running.
Проверяем доступность сервиса Exchange Listener.
Сначала можно через telnet:
telnet 192.168.101.199 30001
Где 192.168.101.199 - ip-адрес нашей linux-машины, а 30001 - порт сервиса Exchange Listener, выбранный при установке на 12 шаге.
Если соединение проходит - открываем веб-браузер (желательно сразу на машине с Creatio) и вводим в адресную строку http://192.168.101.199:30001/api/listeners/status
Вывод должен быть вида "ServiceStatus": "Started", и т.д.
Дополнительно:
При желании собрать кластер, на всех дополнительных машинах проделываем:
Вводим команды, описанные в Error'ах и Warning'ах шага 5 (саму команду kubeadm init --pod-network-cidr=10.244.0.0/16 не вводим)
Вводим ключ-команду полученную на на шаге 5. Замечу что нужно стереть символ \ если он присутствует.
Проверяем поды на master-машине (их должно стать больше):
kubectl -n kube-system 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
Спасибо!
Подскажите команду
7. Вводим команду для возможности запуска контейнеров на текущей машине:
kubectl taint nodes --all node-role.kubernetes.io/master-
необходимо вводить только на мастер ноде или на всех нодах
Еремеев Игорь Юрьевич,
Здравствуйте, Игорь!
Данная команда нужна если у вас развернут К8S не в кластере - https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
Добрый день.
При выполнении п. 7, 8 и т.д. получаю ошибку:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
Проверил права для пользователя на папку $HOME/.kube/config
Команда: ls -l $HOME/.kube/config
Вывод:
-rw------- 1 username username 5454 Aug 6 05:55 /home/username/.kube/config
Чего не хватает?
UPD: Получил config куба:
Команда: sudo kubectl config view
Ответ:
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null
Смущает, что здесь пусто.
Коллеги, опубликовали второй пример по развертыванию сервиса - https://community.terrasoft.ru/articles/2-realnyy-primer-po-razvertyvaniyu-servisa-exchange-listener-s-ispolzovaniem-kubernetes
Коновалов Игорь,
Предположу что дело во включенном свопе.
Добрый день! Подскажите пожалуйста можно ли развернуть сервис без неограниченного доступа в Инернет?
Сергей, в статье ничего не указано о неограниченности интернет-доступа, только о скорости. Если оплата будет помегабайтной, то при установке и использовании трафик, естественно будет потребляться.
Или речь о работе в локалке без Интернета вообще? Тогда нужно, как минимум, позаботится о локальных репозиториях для установки по apt-get упомянутого софта. А по поводу работы Kubernetes в таких условиях лучше будет уточнить у них.
Спасибо за развернутое описание. Пришлось немного поиграться с правами доступа к папкам, но в целом все сработало
Добрый день, подскажите пожалуйста: как это лечиться?
root@l-creatio-lel:/home/adminka# kubectl get pods
NAME READY STATUS RESTARTS AGE
elistener-api-0 0/1 CrashLoopBackOff 4 4m5s
Warning Unhealthy 13m (x4 over 15m) kubelet Readiness probe failed: Get "http://10.244.0.5:80/healthcheck": dial tcp 10.244.0.5:80: connect: connection refused
Warning BackOff 86s (x57 over 15m) kubelet Back-off restarting failed container
$ kubectl logs elistener-api-0
Unhandled exception. StackExchange.Redis.RedisConnectionException: It was not possible to connect to the redis server(s). There was an authentication failure; check that passwords (or client certificates) are configured correctly. AuthenticationFailure (None, last-recv: 310) on 10.96.133.113:6379/Interactive, Flushed/ComputeResult, last: ECHO, origin: SetResult, outstanding: 0, last-read: 0s ago, last-write: 0s ago, keep-alive: 60s, state: ConnectedEstablishing, mgr: 8 of 10 available, last-heartbeat: never, global: 14s ago, v: 2.1.58.34321
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
elistener-api-0 0/1 CrashLoopBackOff 5 5m46s 10.244.0.5 r-creatio-lel <none> <none>
redis-master-0 1/1 Running 0 6m32s 10.244.0.4 r-creatio-lel <none> <none>
redis-replicas-0 0/1 Pending 0 6m32s <none> <none> <none> <none>
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elistener-api NodePort 10.109.70.15 <none> 80:30001/TCP 6m14s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11m
redis-headless ClusterIP None <none> 6379/TCP 7m
redis-master ClusterIP 10.96.133.113 <none> 6379/TCP 7m
redis-replicas ClusterIP 10.102.18.199 <none> 6379/TCP 7m
Екатерина Валерьевна,
Попробуйте при установке редиса вместо ключа "--set usePassword=false" указать "--set auth.enabled=false".
Добрый день,
что может быть?
adminka@r-creatio-lel-st:~$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k…
unable to recognize "https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k…": no matches for kind "ClusterRole" in version "rbac.authorization.k8s.io/v1beta1"
unable to recognize "https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k…": no matches for kind "ClusterRoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
Екатерина Валерьевна,
Возможно для решения вам помогут статьи на общедоступных ресурсах:
https://github.com/GoogleCloudPlatform/gke-monitoring-tutorial/issues/14
https://github.com/rook/rook/issues/2681
Добрый день всем, у нас используется on-site Creatio CRM, и возникла необходимость поднять kubernetes для ExchangeListener-а, но на самом последнем пункте возникает ошибка установки самого пакета в helm, прошу помочь в решении этого пункта, версии helm и exchange взяты за основу из этой статьи, только репозиторий helm поменялся, и добавил соответствующий. В остальном тоже самое.
Dima Avdoshin пишет: Добрый день, подскажите пожалуйста
NAME STATUS ROLES AGE VERSION
r-creatio-exl-prod Ready control-plane 51m v1.25.4
почему роль у него control-plane ставиться, а не мастер?
и при использовании
helm install --namespace default --set auth.enabled=false --set=slave.persistence.enabled=false --set master.persistence.enabled=false --set cluster.enabled=false redis bitnami/redis
wget https://academy.creatio.com/sites/default/files/documents/downloads/Exc…
helm install --set env.host=10.104.164.119 --set service.type=NodePort --set service.nodePort=30001 --set apiVersion=apps/v1 --namespace default elistener exchangelistener-0.8.39.tgz
adminka@r-creatio-exl-prod:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
elistener-api-0 0/1 CrashLoopBackOff 9 (3m16s ago) 29m
Warning Unhealthy 28m kubelet Liveness probe failed: Get "http://10.244.0.6:80/api/listeners/exists": dial tcp 10.244.0.6:80: connect: connection refused
Warning Unhealthy 8m32s (x15 over 28m) kubelet Readiness probe failed: Get "http://10.244.0.6:80/healthcheck": dial tcp 10.244.0.6:80: connect: connection refused
Warning BackOff 3m32s (x101 over 27m) kubelet Back-off restarting failed container
Подскажите пожалуйста, как это победить? И есть ли более новые версии ExchangeListener, которые можно поставить?
https://artifacthub.io/packages/helm/bitnami/redis
--set=slave.persistence.enabled=false - почему тут равно и для slave нет никаких опций.