Русский
Русский
English
Статистика
Реклама

Centos

Freeradius Google Autheticator LDAP Fortigate

05.09.2020 02:04:29 | Автор: admin
Как быть, если двухфакторной аутентификации и хочется, и колется, а денег на аппаратные токены нет и вообще предлагают держаться и хорошего настроения.
Данное решение не является чем-то супероригинальным, скорее микс из разных решений, найденных на просторах интернета.

Итак, дано:


Домен Active Directory.
Пользователи домена, работающие через VPN, как многие нынче.
В роли шлюза VPN выступает Fortigate.
Сохранение пароля для VPN-клиента запрещено политикой безопасности.
Политику Fortinet в отношении собственных токенов менее чем жлобской не назовешь бесплатных токенов аж 10 единиц, остальные по очень некошерной цене. RSASecureID, Duo и им подобные не рассматривал, поскольку хочется опенсорса.

Предварительные требования: хост *nix с установленным freeradius, sssd введен в домен, доменные пользователи могут спокойно на нем аутентифицироваться.
Дополнительные пакеты: shellinabox, figlet, freeeradius-ldap, шрифт rebel.tlf с репозитория https://github.com/xero/figlet-fonts.

В моем примере CentOS 7.8.
Логика работы предполагается такая: при подключении к VPN пользователь должен ввести доменный логин и OTP вместо пароля.

Настройка сервисов:


В /etc/raddb/radiusd.conf меняется только пользователь и группа, от имени которых стартует freeradius, так как сервис radiusd должен уметь читать файлы во всех поддиректориях /home/.

user = rootgroup = root

Чтобы можно было использовать группы в настройках Fortigate, нужно передавать Vendor Specific Attribute. Для этого в директории raddb/policy.d создаю файл со следующим содержимым:

group_authorization {    if (&LDAP-Group[*] == "CN=vpn_admins,OU=vpn-groups,DC=domain,DC=local") {            update reply {                &Fortinet-Group-Name = "vpn_admins" }            update control {                &Auth-Type := PAM                &Reply-Message := "Welcome Admin"                }        }    else {        update reply {        &Reply-Message := "Not authorized for vpn"            }        reject        }}

После установки freeradius-ldap в директории raddb/mods-available создается файл ldap.
Нужно создать символьную ссылку в каталог raddb/mods-enabled.

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

Привожу его содержимое к такому виду:

ldap {        server = 'domain.local'        identity = 'CN=freerad_user,OU=users,DC=domain,DC=local'        password = "SupeSecretP@ssword"        base_dn = 'dc=domain,dc=local'        sasl {        }        user {                base_dn = "${..base_dn}"                filter = "(sAMAccountname=%{%{Stripped-User-Name}:-%{User-Name}})"                sasl {                }                scope = 'sub'        }        group {                base_dn = "${..base_dn}"                filter = '(objectClass=Group)'                scope = 'sub'                name_attribute = cn                membership_filter = "(|(member=%{control:Ldap-UserDn})(memberUid=%{%{Stripped-User-Name}:-%{User-Name}}))"                membership_attribute = 'memberOf'        }}

В файлах raddb/sites-enabled/default и raddb/sites-enabled/inner-tunnel в секции authorize дописываю имя политики, которая будет использоваться group_authorization. Важный момент имя политики определяется не названием файла в директории policy.d, а директивой внутри файла перед фигурными скобками.
В секции authenticate в этих же файлах нужно раскомментировать строку pam.
В файле clients.conf прописываем параметры, с которыми будет подключаться Fortigate:

client fortigate {    ipaddr = 192.168.1.200    secret = testing123    require_message_authenticator = no    nas_type = other}

Конфигурация модуля pam.d/radiusd:

#%PAM-1.0auth       sufficient   pam_google_authenticator.soauth       include      password-authaccount    required     pam_nologin.soaccount    include      password-authpassword   include      password-authsession    include      password-auth

Дефолтные варианты внедрения связки freeradius с google authenticator предполагают ввод пользователем учетных данных в формате: username/password+OTP.

Представив количество проклятий, которое посыпется на голову, в случае использования дефолтной связки freeradius с Google Authenticator, было принято решение использовать конфигурацию модуля pam так, чтобы проверять только лишь токен Google Authenticator.
При подключении пользователя происходит следующее:

  • Freeradius проверяет наличие пользователя в домене и в определенной группе и, в случае успеха, производится проверка OTP токена.

Все выглядело достаточно удачно до момента, пока я не задумался А как же произвести регистрацию OTP для 300+ пользователей?
Пользователь должен залогиниться на сервер с freeradius и из-под своей учетной записи и запустить приложение Google authenticator, которое и сгенерирует для пользователя QR-код для приложения. Вот тут на помощь и приходит shellinabox в комбинации с .bash_profile.

[root@freeradius ~]# yum install -y shellinabox

Конфигурационный файл демона находится в /etc/sysconfig/shellinabox.
Указываю там порт 443 и можно указать свой сертификат.

[root@freeradius ~]#systemctl enable --now shellinaboxd

Пользователю остается лишь зайти по ссылке, ввести доменные креды и получить QR-код для приложения.

Алгоритм следующий:
  • Пользователь логинится на машину через браузер.
  • Проверяется доменный ли пользователь. Если нет, то никаких действий не предпринимается.
  • Если пользователь доменный, проверяется принадлежность к группе администраторов.
  • Если не админ, проверяется настроен ли Google Autheticator. Если нет, то генерируется QR-код и logout пользователя.
  • Если не админ и Google Authenticator настроен, то просто logout.
  • Если админ, то опять проверка Google Authenticator. Если не настроен, то генерируется QR-код.

Вся логика выполняется с использованием /etc/skel/.bash_profile.

cat /etc/skel/.bash_profile
# .bash_profile# Get the aliases and functionsif [ -f ~/.bashrc ]; then        . ~/.bashrcfi# User specific environment and startup programs# Make several commands available from user shellif [[ -z $(id $USER | grep "admins") || -z $(cat /etc/passwd | grep $USER) ]]  then    [[ ! -d $HOME/bin ]] && mkdir $HOME/bin    [[ ! -f $HOME/bin/id ]] && ln -s /usr/bin/id $HOME/bin/id    [[ ! -f $HOME/bin/google-auth ]] && ln -s /usr/bin/google-authenticator $HOME/bin/google-auth    [[ ! -f $HOME/bin/grep ]] && ln -s /usr/bin/grep $HOME/bin/grep    [[ ! -f $HOME/bin/figlet ]] && ln -s /usr/bin/figlet $HOME/bin/figlet    [[ ! -f $HOME/bin/rebel.tlf ]] && ln -s /usr/share/figlet/rebel.tlf $HOME/bin/rebel.tlf    [[ ! -f $HOME/bin/sleep ]] && ln -s /usr/bin/sleep $HOME/bin/sleep  # Set PATH env to <home user directory>/bin    PATH=$HOME/bin    export PATH  else    PATH=PATH=$PATH:$HOME/.local/bin:$HOME/bin    export PATHfiif [[ -n $(id $USER | grep "domain users") ]]  then    if [[ ! -e $HOME/.google_authenticator ]]      then        if [[ -n $(id $USER | grep "admins") ]]          then            figlet -t -f $HOME/bin/rebel.tlf "Welcome to Company GAuth setup portal"            sleep 1.5            echo "Please, run any of these software on your device, where you would like to setup OTP:Google Autheticator:AppStore - https://apps.apple.com/us/app/google-authenticator/id388497605Play Market - https://play.google.com/stor/apps/details?id=com.google.android.apps.authenticator2&hl=enFreeOTP:AppStore - https://apps.apple.com/us/app/freeotp-authenticator/id872559395Play Market - https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&hl=enAnd prepare to scan QR code."            sleep 5            google-auth -f -t -w 3 -r 3 -R 30 -d -e 1            echo "Congratulations, now you can use an OTP token from application as a password connecting to VPN."          else            figlet -t -f $HOME/bin/rebel.tlf "Welcome to Company GAuth setup portal"            sleep 1.5            echo "Please, run any of these software on your device, where you would like to setup OTP:Google Autheticator:AppStore - https://apps.apple.com/us/app/google-authenticator/id388497605Play Market - https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=enFreeOTP:AppStore - https://apps.apple.com/us/app/freeotp-authenticator/id872559395Play Market - https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&hl=enAnd prepare to scan QR code."            sleep 5            google-auth -f -t -w 3 -r 3 -R 30 -d -e 1            echo "Congratulations, now you can use an OTP token from application as a password to VPN."            logout        fi      else        echo "You have already setup a Google Authenticator"        if [[ -z $(id $USER | grep "admins") ]]          then          logout        fi    fi  else    echo "You don't need to set up a Google Authenticator"fi


Настройка Fortigate:


  • Создаем Radius-сервер

  • Создаем необходимые группы, в случае необходимости разграничения доступа по группам. Имя группы на Fortigate должно соответствовать группе, которая передается в Vendor Specific Attribute Fortinet-Group-Name.

  • Редактируем необходимые SSL-порталы.

  • Добавляем группы в политики.



Плюсы данного решения:
  • Есть возможность аутентификации по OTP на Fortigate опенсорс решением.
  • Исключается ввод доменного пароля пользователем при подключении по VPN, что несколько упрощает процесс подключения. 6-цифровой пароль ввести проще, чем тот, который предусмотрен политикой безопасности. Как следствие, уменьшается количество тикетов с темой: Не могу подключиться к VPN.


P.S. В планах докрутить это решение до полноценной 2-хфакторной авторизации с challenge-response.
Подробнее..

AD Freeradius Google Autheticator. Установка с нуля для Cisco Anyconnect и не только

24.02.2021 20:16:16 | Автор: admin
Итак, у нас встала задача включить двухфакторную аутентификацию для Cisco AnyconnectVPN и некоторых других пакетов. Общими у всех задач есть одно они умеют аутентифицироваться в Radius.
Есть масса платных решений (например Cisco DUO ), но платное не значит лучше и зачем платить больше?

Да, критики скажут это очередная статья как натянуть сову на глобус или как подружить FreeRadius, MS Acitve Directory и Google Authenticator. Но есть нюансы, которые я хочу показать.

Во-первых. Мне нужно несколько типов аутентификации. Я это реализую нестандартными настройками FreeRadius и получу на трех разных портах одного сервера три типа аутентификации:
  1. ADlogin, ADPasswordGoogleAuth (логин из AD, паролем выступает склееная фраза из пароля в AD и цифр от GoogleAuth )
  2. ADlogin, ADPassword (стандартный вариант логина и пароля от AD, по сути чисто технический вариант, но нужен для Anyconnect)
  3. ADLogin, GoogleAuth ( логин из AD, пароль цифры GoogleAuth. Так сказать GoogleAuthenticator в чистом виде)

Во-вторых. Используя модуль shellinabox предоставляем возможность клиенту создать себе GoogleAuth токен самостоятельно, при этом не понижая уровня безопасности системы. Возможно не самое красивое решение но 100% работающее.

И в-третьих. Мне так и не удалось победить проблему: когда истекает время жизни пароля в AD, FreeRadius перестает считать его валидным и пробрасывает дальше ошибку. Т.е перестает предлагать сменить пароль в такой ситуации. Решение shellinabox позволяет решить эту проблему, предлагая пользователю в такой ситуации зайти на URL shellinabox.

Все проверено на Centos7 но без особых изменений зайдет на любом RedHat дистрибутиве и с непринципиальными модификациями на Ubuntu и FreeBSD. Другие дистрибуты не проверял, но общий смысл обязан сохранится.

1) Включаем NTP если не включено. Можно заменить любой аналогичной службой, важно чтоб время было синхронизировано корректно.

a) Установка
#yum install ntp


b) Включение на старте и сразу запуск
#systemctl enable now ntpd


c) Проверка
#ntpq p


2) Включаем Linux в AD. Я предпочитаю SSSD.

a) Установка
#yum install y sssd realmd oddjob oddjob-mkhomedir adcli samba-common samba-common-tools krb5-workstation openldap-clients policycoreutils-python

Здесь есть один момент. Возможно спецы меня поправят и часть пакетов лишняя именно для этой задачи, но я предпочитаю стантдартизацию и именно такой набор работает у меня везде.

b) собственно ввод в домен
#realm join pbu.icb --user=имя-пользователя-домена


c) проверка
#realm list


Должно вывести нечто подобное:
my.domen
type: kerberos
realm-name: MY.DOMEN
domain-name: my.domen
configured: kerberos-member
server-software: active-directory
client-software: sssd
required-package: oddjob
required-package: oddjob-mkhomedir
required-package: sssd
required-package: adcli
required-package: samba-common-tools
login-formats: %U
login-policy: allow-permitted-logins
permitted-logins:


d) редактируем /etc/sssd/sssd.conf для ограничения по AD группам, которым можно ходить на эту машину. Читай аутентифицироваться в AD с этой машины.
use_fully_qualified_names = False
simple_allow_groups = GroupLinuxAdmins@my.domen, GroupUseVPN@my.domen
ad_gpo_ignore_unreadable = True


первая группа GroupLinuxAdmins@my.domen, члены которой могут администрировать систему, вторая GroupUseVPN@my.domen это те кто потом будет ходить в VPN.

e) Запускаем sssd
#chown root.root /etc/sssd/sssd.conf&&chmod 600 /etc/sssd/sssd.conf#systemctl restart sssd

Убеждаемся что sssd работает корректно:
#id  имя-пользователя-домена

Должно вывести список групп AD в которые входит пользователь домена имя-пользователя-домена

f) Разрешаем админам sudo
#echo "%GroupLinuxAdmins@my.domen ALL=(ALL) ALL" > /etc/sudoers.d/sudoadmin#chown root.root /etc/sudoers.d/sudoadmin&&chmod 600 /etc/sudoers.d/sudoadmin


g) Выключаем root для ssh, разрешаем ssh только членам группы GroupLinuxAdmins@my.domen.
Редактируем /etc/ssh/sshd_config, изменив или добавив строки ниже. ВАЖНО! Тут и дальше имена групп нужно использовать только в нижнем регистре.

PermitRootLogin no
AllowGroups grouplinuxadmins


И перезапускаем sshd
#systemctl restart sshd


3) Установка FreeRadius
a) Собственно установка
#yum -y install freeradius freeradius-utils#ln -s /etc/raddb/mods-available/pam /etc/raddb/mods-enabled/pam


b) Редактируем /etc/raddb/sites-enabled/default:
Находим в разделе authenticate строку вида
# pam

и убираем комментарий в начале строки ( символ # )

с) Собственно базовый радиус установлен. Только для localhost но уже можем проверять.
Парольное слово в Radius для localhost по-умолчанию: testing123

# radtest userVPN password_for_userVPN localhost 0 testing123


Правильный ответ будет если в конце ответа
Received Access-Accept


При неправильном пароле (тоже стоит обязательно проверить ):
В конце ответа будет
Received Access-Reject
и дальше
(0) -: Expected Access-Accept got Access-Reject


d) Дабавляем систему, которой можно обращаться к Radius, т.е устройство, которой будет организовывать Cisco AnyconnectVPN. У меня это Cisco Firepower. Пусть у него будет IP 10.10.10.5.
Добавляем в файл /etc/raddb/clients.conf

client ftd {
ipaddr = 10.10.10.5
secret = secretFTD
}


И включаем радиус со стартом
#systemctl enable --now radiusd


e) Редактируем /etc/raddb/radiusd.conf. данная настройка нужна для того, чтобы Google Authenticator мог проверить файл $HOME/.google_authenticator для всех пользователей.
находим
user = radiusd
group = radiusd

и меняем на
user = root
group = root


f) Собственно базовый Radius установлен. Если при установке FreeRadius что-то идет не так, очень полезная возможность консольной работы с FreeRadius. Для этого стопаем службу и запускаем Radius в консольном режиме с debug
#systemctl stop radius#radiusd -Xx


4) Ставим Google Autenticator
a) К сожелению я не знаю как подружить Google Authenticator и selinux. Поэтому отключаем.
Файл /etc/selinux/config меняем:
SELINUX=enforcing

на
SELINUX=permissive

После чего
#setenforce 0

а лучше вообще перезагрузить машину

b)
#yum install y epel-release#yum install y google-authenticator


5) Модифицируем FreeRadius для 3 типов аутентификации
a) Редактируем /etc/raddb/mods-enabled/pam, добавляя строки
pam radius11812{
pam_auth = radiusd_ad
}

pam radius21812{
pam_auth = radiusd_ga
}


b) В папке /etc/pam.d копируем pam настройки для разных типов аутентификации
Для просто в AD берем системную
#ln s /etc/pam.d/password-auth-ac /etc/pam.d/radiusd_ad

Для просто GoogleAuth пишем самостоятельно в /etc/pam.d/radiusd_ga

#%PAM-1.0
#
auth required pam_google_authenticator.so nullok
auth required pam_permit.so
account required pam_nologin.so
account include password-auth
password include password-auth
session include password-auth


!!! очень важный момент. При такой конфигурации если отсутствует привязка пользователя в профиле к GoogleAuth то такой пользователь считается валидным. Если нужно без ввода цифр GoogleAuth не пускать вообще, не зависимо от привязки, то нужно в первой строке убрать nullok а вторую строку убрать вообще.

c) Копируем /etc/raddb/sites-enabled/default для двух дополнительных портов
# cp /etc/raddb/sites-enabled/default /etc/raddb/sites-enabled/radius11812# cp /etc/raddb/sites-enabled/default /etc/raddb/sites-enabled/radius21812


d) Редактируем /etc/raddb/sites-enabled/radius11812
Находим в разделе authenticate строку вида
pam

и заменяем на
Auth-Type pam {
radius11812
}


e) Аналогично /etc/raddb/sites-enabled/radius21812
Находим в разделе authenticate строку вида
pam

и заменяем на
Auth-Type pam {
Radius21812
}


6) Устанавливаем shellinabox
a)
#yum install y shellinabox#yum enable now shellinabox


b) В принципе этого достаточно. Но некоторые любят красоту ;). Тогда дополнительно ставим еще figlet, и шрифт rebel.tlf ( взять с репозитория https://github.com/xero/figlet-fonts и положить в /usr/share/figlet ).

c) Добавляем вызов логики генерации GoogleAuth токена для всех пользователей
#echo . /usr/local/etc/radius_user_profiles.sh >> /etc/skel/.bash_profile


d) Создаем /usr/local/etc/radius_user_profiles.sh ( это вариант с украшательствами )
#!/bin/bash# Set groups for vpn, etc. ##   !!! Names of groups without caps letters !!!#VPNissuer="MyCompany"GROUP_VPN="groupusevpn"# Get the aliases and functionsif [ -f ~/.bashrc ]; then        . ~/.bashrcfi# User specific environment and startup programs# Make several commands available from user shell# for group VPN that use 2FA Google authenticatorif [[ -n $(id $USER | grep $GROUP_VPN) ]]  then     clear    [[ ! -d $HOME/bin ]] && mkdir $HOME/bin    [[ ! -f $HOME/bin/id ]] && ln -s /usr/bin/id $HOME/bin/id    [[ ! -f $HOME/bin/google-auth ]] && ln -s /usr/bin/google-authenticator $HOME/bin/google-auth    [[ ! -f $HOME/bin/grep ]] && ln -s /usr/bin/grep $HOME/bin/grep    [[ ! -f $HOME/bin/figlet ]] && ln -s /usr/bin/figlet $HOME/bin/figlet    [[ ! -f $HOME/bin/rebel.tlf ]] && ln -s /usr/share/figlet/rebel.tlf $HOME/bin/rebel.tlf    [[ ! -f $HOME/bin/sleep ]] && ln -s /usr/bin/sleep $HOME/bin/sleep  # Set PATH env to <home user directory>/bin    PATH=$HOME/bin    export PATH    if [[ ! -e $HOME/.google_authenticator ]]      then        figlet -t -c -f $HOME/bin/rebel.tlf "Welcome to $VPNissuer GAuth setup portal"        sleep 1.5        echo "Please, run Google Autheticator to setup OTP and prepare to scan QR code.If you don't have, please download that from market:AppStore    - https://apps.apple.com/us/app/google-authenticator/id388497605Play Market - https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=en"        sleep 1.5        google-auth -f -t -w 3 -r 3 -R 30 -d -e 1 -l "$VPNissuer" -i "$USER"        echo "Congratulations, now you can use an OTP token from application as a password to VPN."        logout    else        echo "You have already setup a Google Authenticator        "        logout    fifi

e) Устнавливаем разрешения на выполнение всем.
#chmod 755  /usr/local/etc/radius_user_profiles.sh


f) Можно файлы типа .google_authenticator вынести в отдельный каталог ( по-умолчанию это файлы $HOME/.google_authenticator). Увеличивает ли это безопасность системы? Нет, а удобство дело привычки. Для этого надо сделать несколько шагов:
  • в скрипте /usr/local/etc/radius_user_profiles.sh заменить строки
    if [[! -e $HOME/.google_authenticator ]]
    google-auth -f -t -w 3 -r 3 -R 30 -d -e 1 -l "$VPNissuer" -i "$USER"

    на
    if [[! -e /path_secrets/${USER} ]]
    google-auth -f -t -w 3 -r 3 -R 30 -d -e 1 -l "$VPNissuer" -i "$USER" --secret=/path_secrets/$USER
  • и в модулях PAM /etc/pam.d/radiusd и /etc/pam.d/radiusd_ga
    везде после pam_google_authenticator.so добавить параметр secret=/path_secrets/${USER}
    auth required pam_google_authenticator.so secret=/path_secrets/${USER} nullok
  • создать каталог
    #mkdir /path_secrets#chmod 777 /path_secrets
    

7) Теперь самое интересное. Shellinabox это по-сути графическая web оболочка для шелла. Для того чтоб не нарушить безопасность системы делаем отдельный sshd c ограничением по группе AD на нестандартном порту и направляем shelinabox на этот порт. Стандартный 22 остается для администраторов и снаружи недоступен.

a) Копируем systemd service скрипт и конфиг sshd:
#cp /usr/lib/systemd/system/sshd.service /usr/lib/systemd/system/sshd_web.service#cp /etc/ssh/sshd/sshd_config /etc/ssh/sshd_web_config


b) Редактируем /usr/lib/systemd/system/sshd_web.service заменяя строку
ExecStart=/usr/sbin/sshd -D $OPTIONS

на
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd_web_config $OPTIONS


c) Редактируем /etc/ssh/sshd_web_config добавляя или исправляя параметры:
port 2022
MaxAuthTries 3
MaxSessions 1
AllowGroups groupusevpn


Таким образом мы запускаем дополнительный шелл sshd на порту 2022 не открывая его на firewall т.к обращения к нему исключительно по интерфейсу local.

d) Редактируем /etc/sysconfig/shellinaboxd изменив параметр на
OPTS=" -s /:SSH:localhost:2022"


e) В папке /var/lib/shellinabox по умолчанию лежат самосгенеренные и самоподписанные сертификаты shellinabox. Лично у себя я установил дополнительно nginx в который внес реальные сертификаты ssl, вынеся shellinabox на порт 8443 ( любой нестандартный )

#yum install y nginx


Конфигурация для nginx:

server {
listen 443 ssl;
server_name shellinabox.my.domen;

add_header Strict-Transport-Security max-age=15768000; includeSubDomains always;

set $upstream localhost:8443;

proxy_intercept_errors on;
underscores_in_headers on;

location ~ ^/(.*) {
proxy_pass $upstream$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/ privkey.pem;
ssl_protocols TLSv1.2;
ssl_dhparam /etc/ssl/ssl-dhparams.pem;
}

и в /etc/sysconfig/shellinaboxd меняем
PORT=8443


f) Перезапускаем после всех изменений.
#systemctl daemon-reload#systemctl enable now sshd_web#systemctl enable now shellinabox

Если ставили nginx то
#systemctl enable now nginx


g) Открываем порты firewalld
firewall-cmd --new-zone=radius permanentfirewall-cmd --zone=radius --add-source=10.10.10.5 --permanentfirewall-cmd --zone=radius --add-port=1812/udp --permanentfirewall-cmd --zone=radius --add-port=11812/udp --permanentfirewall-cmd --zone=radius --add-port=21812/udp --permanentfirewall-cmd --reload


8) Тестируем весь конструктор.
a) Заходим на shellinabox.my.domen
b) Логинимся пользователем VPN и получаем QR-код для GoogleAuth
c) Ставим на смартфон GoogleAuthenticator и сканим им QR-код.
d)
#radtest userVPN password_for_userVPNXXXXXX localhost 0 testing123

где XXXXXX цифры с GoogleAuthenticator. Результат должен быть Received Access-Accept
e)
#radtest userVPN password_for_userVPN localhost:11812 0 testing123

Результат должен быть Received Access-Accept
f)
#radtest userVPN XXXXXX localhost:21812 0 testing123 

где XXXXXX цифры с GoogleAuthenticator. Результат должен быть Received Access-Accept

9) Собственно VPN
a) Если все предидущие этапы прошли успешно то прописываем сервер типа Radius c IP и портом 11812/UDP как первый фактор в CISCO AnyconnectVPN и его же с портом 21812/UDP как второй фактор.





b) Деплоим конфигурацию и проверяем.

Как понятно из процесса тестирования, те системы, которые не умеют отдельно спрашивать первый и второй фактор ( или мы не хотим факторы разделять специально) мы направляем на порт Radius 1812 и используем схему пароль_ADXXXXXX добавляя цифры с Google Authenticator сразу после пароля без пробела.

Незакрытые вопросы:
  • Смена пароля при истечении времени жизни пароля через FreeRadius. Буду благодарен за советы.
  • SELINUX и GoogleAuthenticator.
  • Хотелось бы более красивого, аккуратного и, главное, более управляемого варианта генерации GoogleAuth токена, чем банальный шелл-скрипт.


PS. В статье использовались материалы http://personeltest.ru/aways/habr.com/ru/post/516362, откуда взята идея shellinabox
Подробнее..

Recovery mode От стартапа до тысяч серверов в десятке ЦОД. Как мы гнались за ростом Linux инфраструктуры

03.07.2020 20:16:17 | Автор: admin
Если ваша IT инфраструктура растёт слишком быстро, вы рано или поздно столкнётесь с выбором линейно увеличивать людские ресурсы на её поддержку или начинать автоматизацию. До какого-то момента мы жили в первой парадигме, а потом начался долгий путь к Infrastructure-as-Code.



Разумеется, НСПК не стартап, но такая атмосфера царила в компании в первые годы существования, и это были очень интересные годы. Меня зовут Корняков Дмитрий, более 10 лет я поддерживаю инфраструктуру Linux с высокими требованиями доступности. К команде НСПК присоединился в январе 2016 года и, к сожалению, не застал самого начала существования компании, но пришел на этапе больших изменений.

В целом, можно сказать, что наша команда поставляет для компании 2 продукта. Первый это инфраструктура. Почта должна ходить, DNS работать, а контроллеры домена пускать вас на сервера, которые не должны падать. IT ландшафт компании огромен! Это business&mission critical системы, требования по доступности некоторых 99,999. Второй продукт сами сервера, физические и виртуальные. За существующими нужно следить, а новые регулярно поставлять заказчикам из множества подразделений. В этой статье я хочу сделать акцент на том, как мы развивали инфраструктуру, которая отвечает за жизненный цикл серверов.

Начало пути

В начале пути наш стек технологий выглядел так:
ОС CentOS 7
Контроллеры домена FreeIPA
Автоматизация Ansible(+Tower), Cobbler


Всё это располагалось в 3х доменах, размазанных на нескольких ЦОДах. В одном ЦОД офисные системы и тестовые полигоны, в остальных ПРОД.

Создание серверов в какой-то момент выглядело так:



В шаблоне VM CentOS minimal и необходимый минимум вроде корректного /etc/resolv.conf, остальное приезжает через Ansible.

CMDB Excel.

Если сервер физический, то вместо копирования виртуальной машины на него устанавливалась ОС с помощью Cobbler в конфиг Cobbler добавляются MAC адреса целевого сервера, сервер по DHCP получает IP адрес, а дальше наливается ОС.

Поначалу мы даже пытались делать какой-то configuration management в Cobbler. Но со временем это стало приносить проблемы с переносимостью конфигураций как в другие ЦОД, так и в Ansible код для подготовки VM.

Ansible в то время многие из нас воспринимали как удобное расширение Bash и не скупились на конструкции с использованием shell, sed. В общем Bashsible. Это в итоге приводило к тому, что, если плейбук по какой-либо причине не отрабатывал на сервере, проще было удалить сервер, поправить плейбук и прокатить заново. Никакого версионирования скриптов по сути не было, переносимости конфигураций тоже.

Например, мы захотели изменить какой-то конфиг на всех серверах:

  1. Изменяем конфигурацию на существующих серверах в логическом сегменте/ЦОД. Иногда не за один день требования к доступности и закон больших чисел не позволяет применять все изменения разом. А некоторые изменения потенциально деструктивны и требуют перезапуск чего-либо от служб до самой ОС.
  2. Исправляем в Ansible
  3. Исправляем в Cobbler
  4. Повторяем N раз для каждого логического сегмента/ЦОД

Для того, чтобы все изменения проходили гладко, необходимо было учитывать множество факторов, а изменения происходят постоянно.

  • Рефакторинг ansible кода, конфигурационных файлов
  • Изменение внутренних best practice
  • Изменения по итогам разбора инцидентов/аварий
  • Изменение стандартов безопасности, как внутренних, так и внешних. Например, PCI DSS каждый год дополняется новыми требованиями

Рост инфраструктуры и начало пути

Количество серверов/логических доменов/ЦОД росло, а с ними количество ошибок в конфигурациях. В какой-то момент мы пришли к трём направлениям, в сторону которых нужно развивать configuration management:

  1. Автоматизация. Насколько возможно, нужно избегать человеческого фактора в повторяющихся операциях.
  2. Повторяемость. Управлять инфраструктурой намного проще, когда она предсказуема. Конфигурация серверов и инструментов для их подготовки должна быть везде одинаковой. Это так же важно для продуктовых команд приложение должно гарантированно после тестирования попадать в продуктивную среду, настроенную аналогично тестовой.
  3. Простота и прозрачность внесения изменений в configuration management.

Осталось добавить пару инструментов.

В качестве хранилища кода мы выбрали GitLab CE, не в последнюю очередь за наличие встроенных модулей CI/CD.

Хранилище секретов Hashicorp Vault, в т.ч. за прекрасное API.

Тестирование конфигураций и ansible ролей Molecule+Testinfra. Тесты идут намного быстрее, если подключаете к ansible mitogen. Параллельно мы начали писать собственную CMDB и оркестратор для автоматического деплоя (на картинке над Cobbler), но это уже совсем другая история, о которой в будущем расскажет мой коллега и главный разработчик этих систем.

Наш выбор:

Molecule + Testinfra
Ansible + Tower + AWX
Мир Серверов + DITNET(Собственная разработка)
Cobbler
Gitlab + GitLab runner
Hashicorp Vault




Кстати про ansible роли. Сначала она была одна, после нескольких рефакторингов их стало 17. Категорически рекомендую разбивать монолит на идемпотентные роли, которые можно потом запускать отдельно, дополнительно можно добавить теги. Мы роли разбили по функционалу network, logging, packages, hardware, molecule etc. А вообще, придерживались стратегии ниже. Не настаиваю на том, что это истина в единственной инстанции, но у нас сработало.

  • Копирование серверов из золотого образа зло!

    Из основных недостатков вы точно не знаете, в каком состоянии образы сейчас, и что все изменения придут во все образы во все фермы виртуализации.
  • Используйте дефолтные файлы конфигурации по минимуму и договоритесь с другими подразделениями, что за основные системные файлы отвечаете вы, например:

    1. Оставьте /etc/sysctl.conf пустым, настройки должны лежать только в /etc/sysctl.d/. Ваш дефолт в один файл, кастом для приложения в другой.
    2. Используйте override файлы для редактирования systemd юнитов.
  • Шаблонизируйте все конфиги и подкладывайте целиком, по возможности никаких sed и его аналогов в плейбуках
  • Рефактория код системы управления конфигурациями:

    1. Разбейте задачи на логические сущности и перепишите монолит на роли
    2. Используйте линтеры! Ansible-lint, yaml-lint, etc
    3. Меняйте подход! Никакого bashsible. Нужно описывать состояние системы
  • Под все Ansible роли нужно написать тесты в molecule и раз в день генерировать отчёты.
  • В нашем случае, после подготовки тестов (которых больше 100) нашлось около 70000 ошибок. Исправляли несколько месяцев.


Наша реализация

Итак, ansible роли были готовы, шаблонизированы и проверены линтерами. И даже гиты везде подняты. Но вопрос надежной доставки кода в разные сегменты остался открытым. Решили синхронизировать скриптами. Выглядит так:



После того, как приехало изменение, запускается CI, создаётся тестовый сервер, прокатываются роли, тестируются молекулой. Если всё ок, код уходит в прод ветку. Но мы не применяем новый код на существующие сервера в автомате. Это своеобразный стопор, который необходим для высокой доступности наших систем. А когда инфраструктура становится огромной, в дело идёт ещё закон больших чисел даже если вы уверены, что изменение безобидное, оно может привести к печальным последствиям.

Вариантов создания серверов тоже много. Мы в итоге выбрали кастомные скрипты на питоне. А для CI ansible:

- name: create1.yml - Create a VM from a template  vmware_guest:    hostname: "{{datacenter}}".domain.ru    username: "{{ username_vc }}"    password: "{{ password_vc }}"    validate_certs: no    cluster: "{{cluster}}"    datacenter: "{{datacenter}}"    name: "{{ name }}"    state: poweredon    folder: "/{{folder}}"    template: "{{template}}"    customization:      hostname: "{{ name }}"      domain: domain.ru      dns_servers:        - "{{ ipa1_dns }}"        - "{{ ipa2_dns }}"    networks:      - name: "{{ network }}"        type: static        ip: "{{ip}}"        netmask: "{{netmask}}"        gateway: "{{gateway}}"        wake_on_lan: True        start_connected: True        allow_guest_control: True    wait_for_ip_address: yes    disk:      - size_gb: 1        type: thin        datastore: "{{datastore}}"      - size_gb: 20        type: thin        datastore: "{{datastore}}"

Вот к чему мы пришли, система продолжает жить и развиваться.

  • 17 ansible-ролей для настройки сервера. Каждая из ролей предназначена для решения отдельной логической задачи (логирование, аудит, авторизация пользователей, мониторинг и т.д.).
  • Тестирование ролей. Molecule + TestInfra.
  • Собственная разработка: CMDB + Оркестратор.
  • Время создания сервера ~30 минут, автоматизировано и практически не зависит от очереди задач.
  • Одинаковое состояние/именование инфраструктуры во всех сегментах плейбуки, репозитории, элементы виртуализации.
  • Ежедневная проверка состояния серверов с генерацией отчётов о расхождениях с эталоном.

Надеюсь мой рассказ будет полезен тем, кто в начале пути. А какой стек автоматизации используете вы?
Подробнее..

Поваренная книга Quarkus Cookbook, бесплатный Developer Sandbox for OpenShift и руководство CentOS Project

25.02.2021 12:15:55 | Автор: admin

Мы собрали для вас короткий дайджест полезных материалов, найденных нами в сети за последние две недели. Оставайтесь с нами станьте частью DevNation!

Начни новое:

Качай:

  • Бесплатный Developer Sandbox for OpenShift
    Это ваш личный OpenShift в облаке, всего за пару минут и без какой бы то ни было инсталляции. Среда создана специально для разработчиков и включает в себя Helm-диаграммы, builder-образы Red Hat, инструменты сборки s2i, также CodeReady Workspaces, облачную IDE с веб-интерфейсом.

Мероприятия:

Подробнее..

OKD4 общедоступный релиз уже здесь

20.07.2020 22:15:29 | Автор: admin
Рабочая группа OKD рада сообщить о выходе общедоступного релиза системы OKD4, которая представляет собой community-версию Red Hat OpenShift Kubernetes.



Red Hat в очередной раз подтверждает приверженность принципам open source и открытого сотрудничества с сообществами разработки Kubernetes и других облачно-ориентированных инициатив.

Истоки OKD


Когда в апреле 2012 года Red Hat впервые запустила Origin как опенсорсный upstream-вариант OpenShift, было сложно представить, насколько быстрым и успешным будет развитие облачно-ориентированных технологий. Последующие годы запомнились взлетом контейнеров, созданием OCI и Fedora CoreOS, а также недавним переездом Operator Framework под крышу CNCF. Без этих инновационных технологий и сообществ, в которых они были созданы, появление OKD4 было бы невозможно.

Во время релиза третьей версии OKD выступал в качестве стабильной основы для OpenShift Container Platform, играя роль upstream-дистрибутива на основе community-компонентов, таких как CentOS, Project Atomic и других. С появлением Universal Base Image взаимоотношения между OKD и OCP изменились: на смену формату upstream-downstream пришло то, что мы называем родственные дистрибутивы (sibling distributions). Образы теперь строятся на базе RHEL7 и могут распространяться одновременно и для OKD, и для OCP без какой-либо пересборки. В результате это позволяет обоим дистрибутивам получать обновления, включая исправления безопасности RHEL7, а также обеспечивает стабильный базис для Red Hat Enterprise Linux.



В OpenShift 4.x особое внимание уделяется высокой доступности, наблюдаемости и бесшовном обновлении. С выходом OKD 4 сообщество не только получает автоматический доступ к этим функциям, но и возможность влиять на развитие платформы (через репозиторий процесс улучшений), а также пространство для экспериментов, дискуссий и обмена знаниями. Широко используемый в OKD 4 шаблон Operators позволяет пользователям эффективно сопровождать кластеры на протяжении всего срока службы.

Особенности релиза


OKD4 использует в качестве базовой ОС для своих узлов Fedora CoreOS, предоставляя кластер с последними исправлениями безопасности, новыми функциями (вроде cgroups v2) и обновленным ПО. OKD4 использует те же образы, что и соответствующая версия OpenShift Container Platform. Поэтому сообщество может полноценно участвовать в разработке системы и модифицировать любые части кластера для достижения тех или иных целей.

При этом кластер сохраняет знакомые по OKD3 особенности: его можно устанавливать в user environment, конфигурировать по своему вкусу и обновлять.

В чем отличия OKD от OCP


У OKD4 есть ряд важных отличий от OCP:

Во-первых, как community-дистрибутиву ему не нужен pull-секрет с сайта https://openshift.com/try. Все образы OKD4 доступны без дополнительной аутентификации. Базовый образ ОС для OKD4 загружается с сайта https://getfedora.org/en/coreos/download/. Однако для некоторых опциональных операторов с сайта operatorhub.io pull-секрет все же требуется, поэтому по умолчанию OKD4 устанавливает исходник только с community-операторами, подробнее см. FAQ.

Во-вторых, OCP это особый дистрибутив Kubernetes, с упором на высокую доступность и продакшн-нагрузки. Отсюда и ограничения на конфигурацию кластеров например, не поддерживаются конфигурации single master. В свою очередь, OKD4 легко позволяет создавать такие конфигурации для тех же девелоперских или тестовых stage-сред. Хотя такие кластеры и нельзя потом обновить до следующей версии.

Новые nightly-релизы OKD4 создаются после того, как OCP проходит тестирование в рамках нашей системы CI. Каждые две недели мы будем перемещать nightly-релиз в канал stable, чтобы пользователи могли получать обновления к новейшему и оттестированному коду без переключения каналов.

Как приступить к работе с OKD4


OKD4 устанавливается так же легко, как и OCP4, см. инструкции в руководстве Getting Started.

Документация по OKD доступна на сайте docs.okd.io

Сообщать о неполадках можно на OKD Github Repo по адресу https://github.com/openshift/okd

Техническая поддержка осуществляется здесь: #openshift-users channel on Kubernetes Slack

Уже пользуетесь OKD?


В этом случае потратьте, пожалуйста, пять минут на заполнение опросника OKD Adoption, чтобы помочь рабочей группа OKD планировать дальнейшее развитие проекта и лучше понять характер рабочих нагрузок, для которых он применяется!

Включайтесь в работу


На сайте сообщества OKD.io можно загрузить последний релиз, ознакомиться с ключевыми upstream-проектами, над которыми мы работаем, лучше узнать наших конечных пользователей и рабочие нагрузки, для которых используется OKD, а также найти ссылки на последние информационные ресурсы.

Рабочая группа OKD собирается дважды в неделю, чтобы обсудить текущее состояние и последующие шаги разработки. Время и место встреч отслеживаются в репо openshift/community.

Повестку и детали предстоящих встреч можно найти здесь: https://github.com/openshift/community/projects/1

Русскоязычное сообщество OpenShift в Telegram:
https://t.me/ru_openshift

Вступайте в наши ряды


Сообщество OpenShift Commons насчитывает более 590 организаций-участников, которые ведут совместную работу над OpenShift. Сообщество открыто для всех: пользователей, операторов, предприятий, стартапов, некоммерческих организаций, образовательных учреждений, партнеров и поставщиков услуг.

Подробнее..

CRI-O как замена Docker в качестве исполняемой среды для Kubernetes настройка на CentOS 8

20.08.2020 12:11:50 | Автор: admin
Привет! Меня зовут Сергей, я DevOps в Surf. DevOps-отдел в Surf ставит своей задачей не только налаживание взаимодействия между специалистами и интеграцию рабочих процессов, но и активные исследования и внедрение актуальных технологий как в собственную инфраструктуру, так и в инфраструктуру заказчика.

Ниже я немного расскажу об изменениях в технологическом стеке для контейнеров, с которыми мы встретились при изучении дистрибутива CentOS 8 и о том, что такое CRI-O и как быстро настроить с его помощью исполняемую среду для Kubernetes.



Почему Docker отсутствует в стандартной поставке CentOS 8


После установки последних крупных релизов RHEL 8 или CentOS 8 нельзя не заметить: в этих дистрибутивах и официальных репозиториях отсутствует приложение Docker, которое идеологически и функционально заменяют собой пакеты Podman, Buildah (присутствуют в дистрибутиве по умолчанию) и CRI-O. Это связано с практической реализацией стандартов, разрабатываемых, в том числе, и компанией Red Hat в рамках проекта Open Container Initiative (OCI).

Цель OCI, являющейся частью The Linux Foundation, создание открытых индустриальных стандартов для форматов и исполняемой среды контейнеров, которые бы решали сразу несколько задач. Во-первых, не противоречили как философии Linux (например, в той её части, что каждая программа должна выполнять какое-то одно действие, а Docker представляет собой этакий комбайн всё-в-одном). Во-вторых, могли бы устранить все имеющиеся недостатки в программном обеспечении Docker. В-третьих, были бы полностью совместимыми с бизнес-требованиями, выдвигаемыми ведущими коммерческими платформами для развёртывания, управления и обслуживания контейнеризованных приложений (например, Red Hat OpenShift).

Недостатки Docker и достоинства нового ПО уже были довольно подробно описаны в этой статье, а с подробным описанием как всего предлагаемого в рамках проекта OCI стека ПО и его архитектурными особенностями можно ознакомиться в официальной документации и статьях как от самой Red Hat (неплохая статья в Red Hat blog), так и в сторонних обзорах.

Важно отметить, какую функциональность имеют компоненты предлагаемого стека:

  • Podman непосредственное взаимодействие с контейнерами и хранилищем образов через процесс runC;
  • Buildah сборка и загрузка в реестр образов;
  • CRI-O исполняемая среда для систем оркестрации контейнеров (например, Kubernetes).

Думаю, что для понимания общей схемы взаимодействия между компонентами стека целесообразно привести здесь схему связей Kubernetes c runC и низкоуровневыми библиотеками с использованием CRI-O:



CRI-O и Kubernetes придерживаются одного и того же цикла выпуска и поддержки (матрица совместимости очень проста: мажорные версии Kubernetes и CRI-O совпадают), а это, с учётом ориентира на полное и всестороннее тестирование работы данного стека разработчиками, даёт нам право ожидать максимально достижимой стабильности в работе при любых сценариях использования (здесь на пользу идет и относительная легковесность CRI-O по сравнению с Docker в силу целенаправленного ограничения функциональности).

При установке Kubernetes right way способом (по мнению OCI, конечно) с использованием CRI-O на CentOS 8 мы столкнулись с небольшими затруднениями, которые, однако, успешно преодолели. Буду рад поделиться с вами инструкцией по установке и настройке, которые в совокупности займут от силы 10 минут.

Как развернуть Kubernetes на CentOS 8 с использованием среды CRI-O


Предварительные условия: наличие как минимум одного хоста (2 cores, 4 GB RAM, накопитель не менее 15 GB) с установленной CentOS 8 (рекомендуется профиль установки Server), а также записи для него в локальном DNS (в крайнем случае можно обойтись записью в /etc/hosts). И не забудьте отключить swap.

Все операции на хосте производим от имени пользователя root, будьте внимательны.

  1. На первом шаге настроим ОС, установим и настроим предварительные зависимости для CRI-O.
    • Обновим ОС:

      dnf -y update
      

    • Далее требуется настроить файрволл и SELinux. Здесь у нас всё зависит от окружения, в котором будут работать наш хост или хосты. Вы можете либо настроить файрволл по рекомендациям из документации, либо, если находитесь в доверенной сети или применяете сторонний файрволл, изменить зону по умолчанию на доверенную или выключить файрволл:

      firewall-cmd --set-default-zone trustedfirewall-cmd --reload
      

      Чтобы выключить файрволл можно использовать следующую команду:

      systemctl disable --now firewalld
      

      SELinux требуется выключить либо перевести в режим permissive:

      setenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
      

    • загрузим необходимые модули ядра и пакеты, настроим автоматическую загрузку модуля br_netfilter при старте системы:

      modprobe overlaymodprobe br_netfilterecho "br_netfilter" >> /etc/modules-load.d/br_netfilter.confdnf -y install iproute-tc
      

    • для активации форвардинга пакетов и корректной обработки трафика сделаем соответствующие настройки:

      cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOFnet.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1net.bridge.bridge-nf-call-ip6tables = 1EOF
      

      применим сделанные настройки:

      sysctl --system
      

    • зададим необходимую версию CRI-O (мажорная версия CRI-O, как уже упоминалось, совпадают с требуемой версией Kubernetes), так как последняя стабильная версия Kubernetes на данный момент 1.18:

      export REQUIRED_VERSION=1.18
      

      добавим необходимые репозитории:

      dnf -y install 'dnf-command(copr)'dnf -y copr enable rhcontainerbot/container-selinuxcurl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/CentOS_8/devel:kubic:libcontainers:stable.repocurl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION/CentOS_8/devel:kubic:libcontainers:stable:cri-o:$REQUIRED_VERSION.repo
      

    • теперь мы можем установить CRI-O:

      dnf -y install cri-o
      

      Обратите внимание на первый нюанс, который мы встречаем в процессе инсталляции: необходимо отредактировать конфигурацию CRI-O перед запуском сервиса, так как требуемый компонент conmon имеет отличное от указанного место размещения:

      sed -i 's/\/usr\/libexec\/crio\/conmon/\/usr\/bin\/conmon/' /etc/crio/crio.conf
      


      Теперь можно активировать и запустить демон CRI-O:

      systemctl enable --now crio
      


      Можно проверить статус демона:

      systemctl status crio
      

  2. Установка и активация Kubernetes.
    • Добавим требуемый репозиторий:

      cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearchenabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpgexclude=kubelet kubeadm kubectlEOF
      

      Теперь мы можем установить Kubernetes (версии 1.18, как уже указывалось выше):

      dnf install -y kubelet-1.18* kubeadm-1.18* kubectl-1.18* --disableexcludes=kubernetes
      

    • Второй важный нюанс: так как мы не используем демон Docker, а используем демон CRI-O, до запуска и инициализации Kubernetes требуется внести соответствующие настройки в конфигурационный файл /var/lib/kubelet/config.yaml, предварительно создав нужный каталог:

      mkdir /var/lib/kubeletcat <<EOF > /var/lib/kubelet/config.yamlapiVersion: kubelet.config.k8s.io/v1beta1kind: KubeletConfigurationcgroupDriver: systemdEOF
      

    • Третий важный момент, с которым мы сталкиваемся при установке: несмотря на то, что мы указали используемый драйвер cgroup, и его настройка через аргументы передаваемые kubelet устарела (на что прямо указано в документации), нам необходимо добавить в файл аргументы, иначе наш кластер не инициализируется:

      cat /dev/null > /etc/sysconfig/kubeletcat <<EOF > /etc/sysconfig/kubeletKUBELET_EXTRA_ARGS=--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock'EOF
      

    • Теперь мы можем активировать демон kubelet:

      sudo systemctl enable --now kubelet
      

      Чтобы настроить control-plane или worker ноды за считанные минуты, вы можете воспользоваться этим скриптом.

  3. Пора инициализировать наш кластер.
    • Для инициализации кластера выполните команду:

      kubeadm init --pod-network-cidr=10.244.0.0/16
      

      Обязательно запишите команду присоединения к кластеру kubeadm join ..., которой предлагается воспользоваться в конце вывода, либо, как минимум, указанные токены.

    • Установим плагин (CNI) для работы Pod network. Я рекомендую использовать Calico. Возможно, более популярный Flannel имеет проблемы с совместимостью с nftables, да и Calico единственная реализация CNI, рекомендуемая и полностью протестированная проектом Kubernetes:

      kubectl --kubeconfig /etc/kubernetes/admin.conf apply -f https://docs.projectcalico.org/v3.15/manifests/calico.yaml 
      

    • Для подключения worker ноды к нашему кластеру её требуется настроить по пунктам инструкции 1 и 2, либо воспользоваться скриптом, затем выполнить команду из вывода kubeadm init ..., которую мы записали на предыдущем этапе:

      kubeadm join $CONTROL_PLANE_ADDRESS:6443 --token $TOKEN \    --discovery-token-ca-cert-hash $TOKEN_HASH
      

    • Проверим, что наш кластер инициализирован и начал работу:

      kubectl --kubeconfig=/etc/kubernetes/admin.conf get pods -A
      

    Готово! Вы уже можете размещать на вашем K8s кластере полезную нагрузку.

Что нас ждёт впереди


Надеюсь, что инструкция выше помогла сэкономить вам немного времени и нервов.
Исход процессов, происходящих в индустрии, зачастую зависит от того, как их принимает основная масса конечных пользователей и разработчиков другого ПО в соответствующей нише. Пока не совсем ясно, к какому итогу через несколько лет приведут инициативы OCI, но мы будем с удовольствием за этим следить. Своим мнением вы можете поделиться прямо сейчас в комментариях.
Stay tuned!

Данная статья появилась благодаря следующим источникам:

Подробнее..

Перевод Устанавливаем балансировщик нагрузки HAProxy на CentOS

23.07.2020 18:11:16 | Автор: admin

Перевод статьи подготовлен в преддверии старта курса Администратор Linux. Виртуализация и кластеризация




Балансировка нагрузки это распространенное решение для горизонтального масштабирования веб-приложений по нескольким хостам с предоставлением пользователям единой точки доступа к сервису. HAProxy является одной из самых популярных программ для балансировки нагрузки с открытым исходным кодом, которая также обеспечивает высокую доступность и функциональность проксирования.


HAProxy стремится оптимизировать использование ресурсов, максимизировать пропускную способность, минимизировать время отклика и избежать перегрузки каждого отдельно взятого ресурса. Она может быть установлена на множестве дистрибутивов Linux, таких как CentOS 8, на котором мы остановимся в этом руководстве, а также в системах Debian 8 и Ubuntu 16.



HAProxy особенно подходит для веб-сайтов с очень высоким трафиком и поэтому часто используется для повышения надежности и производительности конфигураций веб-служб с несколькими серверами. В этом руководстве изложены шаги по настройке HAProxy в качестве балансировщика нагрузки на облачном хосте CentOS 8, который затем направляет трафик на ваши веб-серверы.


В качестве необходимого условия для достижения наилучших результатов у вас должно быть как минимум два веб-сервера и сервер для балансировки нагрузки. На веб-серверах должна быть запущена хотя бы базовая веб-служба, такая как nginx или httpd, для того чтобы можно было проверить балансировку нагрузки между ними.


Установка HAProxy на CentOS 8


В силу того, что HAProxy быстро развивающееся приложение с открытым исходным кодом, дистрибутив, доступный вам в стандартных репозиториях CentOS, может оказаться не самой последней версией. Чтобы узнать актуальную версию, выполните следующую команду:


sudo yum info haproxy

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


В этом руководстве мы будем устанавливать самую последнюю стабильную версию 2.0, которая еще не была доступна в стандартных репозиториях на момент написания руководства. Вам нужно будет установить ее из первоисточника. Но сначала проверьте, выполнены ли у вас необходимые условия для загрузки и компиляции программы.


sudo yum install gcc pcre-devel tar make -y

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


wget http://www.haproxy.org/download/2.0/src/haproxy-2.0.7.tar.gz -O ~/haproxy.tar.gz

После завершения загрузки распакуйте файлы с помощью приведенной ниже команды:


tar xzvf ~/haproxy.tar.gz -C ~/

Перейдите в распакованный каталог с исходниками:


cd ~/haproxy-2.0.7

Затем скомпилируйте программу под вашу систему:


make TARGET=linux-glibc

И, наконец, установите саму HAProxy:


sudo make install

Теперь HAProxy установлена, но для ее работы требуются некоторые дополнительные манипуляции. Продолжим настройку программного обеспечения и сервисов ниже.


Настройка HAProxy под ваш сервер


Теперь добавьте следующие каталоги и файл статистики для записей HAProxy:


sudo mkdir -p /etc/haproxysudo mkdir -p /var/lib/haproxy sudo touch /var/lib/haproxy/stats

Создайте символьную ссылку для двоичных файлов, чтобы вы могли запускать команды HAProxy от имени обычного пользователя:


sudo ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

Если вы хотите добавить прокси-сервер в систему в качестве службы, скопируйте файл haproxy.init из examples в свой каталог /etc/init.d. Отредактируйте права доступа к файлу, чтобы скрипт выполнялся, а затем перезагрузите демон systemd:


sudo cp ~/haproxy-2.0.7/examples/haproxy.init /etc/init.d/haproxysudo chmod 755 /etc/init.d/haproxysudo systemctl daemon-reload

Вам также необходимо разрешить службе автоматическую перезагрузку при запуске системы:


sudo chkconfig haproxy on

В целях удобства также рекомендуется добавить нового пользователя для запуска HAProxy:


sudo useradd -r haproxy

После этого вы можете еще раз проверить номер установленной версии с помощью следующей команды:


haproxy -vHA-Proxy version 2.0.7 2019/09/27 - https://haproxy.org/

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


Наконец, файрвол в CentOS 8 по умолчанию довольно рестриктивен для этого проекта. Используйте следующие команды, чтобы разрешить необходимые службы и перезагрузить файрвол:


sudo firewall-cmd --permanent --zone=public --add-service=httpsudo firewall-cmd --permanent --zone=public --add-port=8181/tcpsudo firewall-cmd --reload

Настройка балансировщика нагрузки


Настройка HAProxy довольно простой процесс. По сути, всё, что вам нужно сделать, это сообщить HAProxy, какие соединения он должен прослушивать и куда следует их ретранслировать.


Это делается путем создания файла конфигурации /etc/haproxy/haproxy.cfg с определяющими настройками. Вы можете почитать о параметрах конфигурации HAProxy на странице документации, если хотите узнать об этом больше.


Балансировка нагрузки на транспортном уровне (layer 4)


Начнем с базовой настройки. Создайте новый файл конфигурации, например, используя vi с командой ниже:


sudo vi /etc/haproxy/haproxy.cfg

Добавьте в файл следующие разделы. Замените server_name тем, что должно вызывать ваши сервера на странице статистики, а private_ip приватными IP-адресами серверов, на которые вы хотите направлять веб-трафик. Вы можете проверить приватные IP-адреса на панели управления UpCloud и на вкладке Private network в меню Network.


global   log /dev/log local0   log /dev/log local1 notice   chroot /var/lib/haproxy   stats timeout 30s   user haproxy   group haproxy   daemondefaults   log global   mode http   option httplog   option dontlognull   timeout connect 5000   timeout client 50000   timeout server 50000frontend http_front   bind *:80   stats uri /haproxy?stats   default_backend http_backbackend http_back   balance roundrobin   server server_name1 private_ip1:80 check   server server_name2 private_ip2:80 check

Это определяет балансировщик нагрузки транспортного уровня (layer 4) с внешним именем http_front, прослушивающий порт 80, который затем направляет трафик к бэкенду по умолчанию с именем http_back. Дополнительная статистика /haproxy?stats подключает страницу статистики по указанному адресу.


Различные алгоритмы балансировки нагрузки.


Указание серверов в разделе бэкенда позволяет HAProxy использовать эти серверы для балансировки нагрузки в соответствии с алгоритмом циклического перебора, когда это возможно.


Алгоритмы балансировки используются для определения того, на какой сервер в бэкенде передается каждое соединение. Вот некоторые из полезных опций:


  • Roundrobin: каждый сервер используется по очереди в соответствии со своим весом. Это самый плавный и честный алгоритм, когда время обработки серверами остается равномерно распределенным. Этот алгоритм является динамическим, что позволяет регулировать вес сервера на лету.


  • Leastconn: выбирается сервер с наименьшим количеством соединений. Циклический перебор выполняется между серверами с одинаковой нагрузкой. Использование этого алгоритма рекомендуется для длинных сеансов, таких как LDAP, SQL, TSE и т. д., но он не очень подходит для коротких сеансов, таких как HTTP.


  • First: первый сервер с доступными слотами для подключения получает соединение. Серверы выбираются от самого низкого числового идентификатора до самого высокого, который по умолчанию соответствует положению сервера в ферме. Как только сервер достигает значения maxconn, используется следующий сервер.


  • Source: IP-адрес источника хешируется и делится на общий вес запущенных серверов, чтобы определить, какой сервер будет получать запрос. Таким образом, один и тот же IP-адрес клиента будет всегда доставаться одному и тому же серверу, в то время как серверы остаются неизменными.



Настройка балансировки нагрузки на прикладном уровне (layer 7)


Еще одна доступная возможность настроить балансировщик нагрузки для работы на прикладном уровне (layer 7), что полезно, когда части вашего веб-приложения расположены на разных хостах. Это может быть достигнуто путем регулирования передачи соединения, например, по URL.


Откройте файл конфигурации HAProxy с помощью текстового редактора:


sudo vi /etc/haproxy/haproxy.cfg

Затем настройте сегменты фронтенд и бэкенд в соответствии с примером ниже:


frontend http_front   bind *:80   stats uri /haproxy?stats   acl url_blog path_beg /blog   use_backend blog_back if url_blog   default_backend http_backbackend http_back   balance roundrobin   server server_name1 private_ip1:80 check   server server_name2 private_ip2:80 checkbackend blog_back   server server_name3 private_ip3:80 check

Фронтенд объявляет правило ACL с именем url_blog, которое применяется ко всем соединениям с путями, начинающимися с /blog. Use_backend определяет, что соединения, соответствующие условию url_blog, должны обслуживаться бэкендом с именем blog_back, а все остальные запросы обрабатываются бэкендом по умолчанию.


Со стороны бэкенда конфигурация устанавливает две группы серверов: http_back, как и раньше, и новую, называемую blog_back, которая обслуживает соединения с example.com/blog.


После изменения настроек сохраните файл и перезапустите HAProxy с помощью следующей команды:


sudo systemctl restart haproxy

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


Тестирование настройки


Когда HAProxy настроен и запущен, откройте публичный IP-адрес сервера балансировщика нагрузки в браузере и проверьте, правильно ли вы подключились к бэкенду. Параметр stats uri в конфигурации создает страницу статистики по указанному адресу.


http://load_balancer_public_ip/haproxy?stats

Когда вы загружаете страницу статистики, если все ваши серверы отображаются зеленым, то настройка прошла успешно!



Страница статистики содержит некоторую полезную информацию для отслеживания ваших веб-хостов, включая время работы/простоя и количество сеансов. Если сервер помечен красным, убедитесь, что сервер включен и что вы можете пропинговать его с машины балансировки нагрузки.


Если ваш балансировщик нагрузки не отвечает, убедитесь, что HTTP-соединения не блокируются файрволом. Также убедитесь, что HAProxy работает с помощью команды ниже:


sudo systemctl status haproxy

Защита страницы статистики с помощью пароля


Однако, если страница статистики просто указана во фронтенде, то она открыта для всеобщего обозрения, что может оказаться не очень хорошей идеей. Вместо этого вы можете назначить ей собственный номер порта, добавив приведенный ниже пример в конец вашего файла haproxy.cfg. Замените username и password на что-нибудь безопасное:


listen stats   bind *:8181   stats enable   stats uri /   stats realm Haproxy\ Statistics   stats auth username:password

После добавления новой группы слушателей удалите старую ссылку на stats uri из фронтенд группы. Когда закончите, сохраните файл и перезапустите HAProxy.


sudo systemctl restart haproxy

Затем снова откройте балансировщик нагрузки с новым номером порта и войдите в систему с именем пользователя и паролем, которые вы указали в файле конфигурации.


http://load_balancer_public_ip:8181

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


http://load_balancer_public_ip/

Если на ваших внутренних серверах есть хотя бы какое-то разнообразие целевых страниц, вы заметите, что каждый раз, когда вы перезагружаете страницу, вы получаете ответ от другого хоста. Вы можете попробовать различные алгоритмы балансировки в разделе конфигурации или ознакомиться с полной документацией.


Заключение: балансировщик нагрузки HAProxy


Поздравляем с успешной настройкой балансировщика нагрузки HAProxy! Даже с базовой настройкой балансировки нагрузки вы можете значительно повысить производительность и доступность вашего веб-приложения. Это руководство является лишь введением в балансировку нагрузки с помощью HAProxy, которая способна на гораздо большее, чем то, что можно описать в краткой инструкции по настройке. Мы рекомендуем поэкспериментировать с различными конфигурациями с помощью обширной документации, доступной для HAProxy, а затем приступить к планированию балансировки нагрузки для вашей производственной среды.


Используя несколько хостов для защиты вашего веб-сервиса с помощью запаса мощности, сам балансировщик нагрузки все равно может представлять точку отказа. Вы можете еще больше повысить высокую доступность, установив плавающий IP между несколькими балансировщиками нагрузки. Вы можете узнать больше об этом в нашей статье о плавающих IP-адресах на UpCloud.




Подробнее о курсе Администратор Linux. Виртуализация и кластеризация***



Подробнее..

Разработка и тестирование Ansible-ролей с использованием Molecule и Podman

17.09.2020 10:15:44 | Автор: admin
Одно из основных преимуществ Red Hat Ansible Automation Platform заключается в том, что ее язык описания автоматизаций читабелен не только для пары-тройки гуру, но и почти для всех, кто имеет отношение к ИТ. Поэтому вносить свой вклад в автоматизацию могут любые специалисты, что сильно облегчает организацию межкомандного взаимодействия и внедрение автоматизации на уровне корпоративной культуры.



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

Тестирование автоматизационного контента штука довольно сложная, поскольку для этого надо развертывать специальную инфраструктуру тестирования и настраивать условия тестирования, чтобы обеспечить релевантность самих тестов. Molecule это комплексная инфраструктура тестирования, которая помогает разрабатывать и тестировать роли Ansible, чтобы вы могли сосредоточиться на разработке автоматизаций и не отвлекаться на управление инфраструктурой тестирования.

Вот как это декларируется в документации проекта:

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

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

В этой серии из двух частей мы покажем, как применять Molecule при разработке и тестировании ролей Ansible. В первой части рассмотрим установку и настройку Molecule, во второй разработку ролей с его помощью.

Если роль является частью коллекции, используйте этот подход для разработки и юнит-тестирования роли. В следующей статье мы покажем, как применять Molecule для выполнения интегрированных тестов в коллекции.

Molecule использует драйверы для предоставления целевых инстансов на базе различных технологий, включая Linux-контейнеры, виртуальные машины и облачных провайдеров. По умолчанию он идет с тремя предустановленными драйверами: Docker и Podman для контейнеров, а также драйвером Delegated для создания кастомных интеграций. Драйверы для других провайдеров предоставляются сообществом разработки проекта.

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

Используя Molecule с драйвером Podman, мы с нуля разработаем и протестируем новую роль Ansible, которая развертывает веб-приложение на базе веб-сервера Apache и должна работать на Red Hat Enterprise Linux (RHEL) 8 или Ubuntu 20.04.

Мы разбираем типовой сценарий, когда роль должна работать на различных версиях операционной системы. Используя Podman и Linux-контейнеры, мы можем создать несколько инстансов, чтобы протестировать роль на разных версиях ОС. Благодаря своей легковесности, контейнеры позволяют быстро итерировать функциональность роли прямо по ходу разработки. Использование контейнеров для тестирования ролей применимо в данной ситуации, поскольку роль конфигурирует только запущенные инстансы Linux. Для тестирования на других целевых системах или облачных инфраструктурах можно использовать драйвер delegated или другие драйверы, предоставляемые сообществом.

Что нам понадобится


Для примеров из этой статьи нужна физическая или виртуальная машина Linux с установленными Python 3 и Podman (мы используем RHEL 8.2). Также Podman должен был сконфигурирован для запуска rootless-контейнеров. Установка Podman выходит за рамки этой статьи, для получения соответствующей информации см. официальную документацию. Установка Podman на RHEL 8 также описывается в документации по контейнерам RHEL 8.

Приступаем


Molecule выполнен в виде Python-пакета и, соответственно, устанавливается через pip. Первым шагом мы создаем выделенное Python-окружение и устанавливаем в него наш Molecule:

$ mkdir molecule-blog$ cd molecule-blog$ python3 -m venv molecule-venv$ source molecule-venv/bin/activate(molecule-venv) $ pip install "molecule[lint]"

Обратите внимание, что мы устанавливаем Molecule с опцией lint, чтобы pip также поставил инструменты yamllint и ansible-lint, которые позволят нам использовать Molecule для статического анализа кода роли на предмет соответствия стандартам кодирования Ansible.

Установка скачивает все необходимые зависимости из интернета, включая Ansible. Теперь смотрим что мы установили:

$ molecule --versionmolecule 3.0.4   ansible==2.9.10 python==3.6

Что ж, пора использовать команду molecule, чтобы инициализировать новую роль Ansible.

Инициализируем новую роль Ansible


Вообще говоря, при разработке новой роли Ansible, она инициализируется командой ansible-galaxy role init, но мы будем использовать вместо этого команду molecule. При этом мы получим ту же структуру роли, что и с командой ansible-galaxy, а также базовую заготовку кода для запуска тестов Molecule.

По умолчанию Molecule использует для выполнения тестов драйвер Docker. Поскольку мы хотим использовать вместо него podman, то при инициализации роли командой molecule надо указать соответствующий драйвер с помощью опции --driver-name=podman.

Переключаемся обратно в каталог molecule-blog и инициализируем новую роль mywebapp следующей командой:

$ molecule init role mywebapp --driver-name=podman--> Initializing new role mywebapp...Initialized role in /home/ricardo/molecule-blog/mywebapp successfully.

Molecule создает структуру нашей роли в папке mywebapp. Переключаемся в эту папку и смотрим, что там:

$ cd mywebapp$ tree. defaults    main.yml files handlers    main.yml meta    main.yml molecule    default        converge.yml        INSTALL.rst        molecule.yml        verify.yml README.md tasks    main.yml templates tests    inventory    test.yml vars     main.yml 10 directories, 12 files

Molecule складывает свои конфигурационные файлы в подкаталог molecule. При инициализации новой роли здесь появляется всего один сценарий, который называется default. Позднее сюда можно добавить свои сценарии для тестирования различных условий. В этой статье мы будем использовать только сценарий default.

Проверим базовую конфигурацию в файле molecule/default/molecule.yml:

$ cat molecule/default/molecule.yml ---dependency:  name: galaxydriver:  name: podmanplatforms:  - name: instance    image: docker.io/pycontribs/centos:7    pre_build_image: trueprovisioner:  name: ansibleverifier:  name: ansible

Как мы и просили, в этом файле указано, что для тестов применяется драйвер Podman. Здесь же задается платформа по умолчанию для тестового инстанса, через контейнерный образ docker.io/pycontribs/centos:7, который мы потом поменяем.

В отличие Molecule v2, Molecule v3 не задает линтер по умолчанию. Поэтому откроем конфигурационный файл molecule/default/molecule.yml и допишем в конце конфигурацию lint:

$ vi molecule/default/molecule.yml...verifier:  name: ansiblelint: |  set -e  yamllint .  ansible-lint .

Сохраним и закроем файл, и запустим команду molecule lint из корневой папки нашего проекта, чтобы прогнать линтер по всему проекту:

$ molecule lint

На выходе получаем несколько ошибок, поскольку в файле meta/main.yml нет ряда требуемых значений. Исправим это: отредактируем файл meta/main.yml, добавив author, company, license, platforms и удалив пустую строку в конце. Для краткости обойдемся без комментариев, и тогда наш meta/main.yaml будет выглядеть так:

$ vi meta/main.ymlgalaxy_info:  author: Ricardo Gerardi  description: Mywebapp role deploys a sample web app   company: Red Hat    license: MIT    min_ansible_version: 2.9   platforms:  - name: rhel    versions:    - 8   - name: ubuntu    versions:    - 20.04   galaxy_tags: [] dependencies: []

Еще раз прогоним по проекту линтер и убедимся, что ошибок больше нет.

$ molecule lint--> Test matrix     default     dependency     lint    --> Scenario: 'default'--> Action: 'dependency'Skipping, missing the requirements file.Skipping, missing the requirements file.--> Scenario: 'default'--> Action: 'lint'--> Executing: set -eyamllint .ansible-lint . 

Итак, наша роль инициализирована и базовая конфигурация molecule тоже на месте. Теперь создадим тестовый инстанс.

Создаем тестовый инстанс


По умолчанию Molecule задает только один инстанс, которые называется instance и создается из образа Centos:7. Наша роль, если помните, должна работать на RHEL 8 и Ubuntu 20.04. Кроме того, поскольку она запускает веб-сервер Apache в качестве системной службы, нам нужен контейнерный образ с включенным systemd.

У Red Hat есть официальный Universal Base Image для RHEL 8 с включенным systemd:

registry.access.redhat.com/ubi8/ubi-init

Для Ubuntu нет официального образа с systemd, поэтому мы воспользуемся образом, который поддерживается силами Джефа Джирлинга (Jeff Geerling) из сообщества Ansible:

geerlingguy/docker-ubuntu2004-ansible

Чтобы получить инстансы с systemd, подправим конфигурационный файл molecule/default/molecule.yml, убрав из него инстанс centos:7 и добавив два новых инстанса:

$ vi molecule/default/molecule.yml---dependency:  name: galaxydriver:  name: podmanplatforms:  - name: rhel8    image: registry.access.redhat.com/ubi8/ubi-init    tmpfs:      - /run      - /tmp    volumes:      - /sys/fs/cgroup:/sys/fs/cgroup:ro    capabilities:      - SYS_ADMIN    command: "/usr/sbin/init"    pre_build_image: true  - name: ubuntu    image: geerlingguy/docker-ubuntu2004-ansible    tmpfs:      - /run      - /tmp    volumes:      - /sys/fs/cgroup:/sys/fs/cgroup:ro    capabilities:      - SYS_ADMIN    command: "/lib/systemd/systemd"    pre_build_image: trueprovisioner:  name: ansibleverifier:  name: ansiblelint: |  set -e  yamllint .  ansible-lint .

С помощью этих параметров мы монтируем для каждого инстанса временную файловую систему /run и /tmp, а также том cgroup. Кроме того, мы включаем функцию SYS_ADMIN, необходимую для запуска контейнеров с Systemd.

Если делать все по уму и выполнять этот пример на машине RHEL 8 с включенным SELinux, то еще надо установить в true логический параметр container_manage_cgroup, чтобы контейнеры могли запускать Systemd, (подробнее см. документацию RHEL 8):

sudo setsebool -P container_manage_cgroup 1

Для инициализации этих инстансов Molecule использует Ansible Playbook. Изменим и добавим параметры инициализации, модифицировав словарь provisioner в конфигурационном файле molecule/default/molecule.yml.

Он принимает те же самые опции конфигурации, что прописаны в конфигурационном файле ansible.cfg. Например, обновим конфигурацию провайдера (provisioner), добавив секцию defaults. Установим интерпретатор Python в auto_silent, чтобы деактивировать предупреждения. Включим callback-плагины profile_tasks, timer и yaml, чтобы профайлерская информация включалась в вывод Playbook. И наконец, добавим секцию ssh_connection и отключим SSH pipelining, поскольку он не работает с Podman:

provisioner:  name: ansible  config_options:    defaults:      interpreter_python: auto_silent      callback_whitelist: profile_tasks, timer, yaml    ssh_connection:      pipelining: false

Сохраним этот файл и создадим инстанс командой molecule create из корневого каталога нашей роли:

$ molecule create

Molecule выполнит инициализационный плейбук и создаст оба наших инстанса. Проверим их командой molecule list:

$ molecule listInstance Name    Driver Name    Provisioner Name    Scenario Name    Created    Converged---------------  -------------  ------------------  ---------------  ---------  -----------rhel8            podman         ansible             default          true       falseubuntu           podman         ansible             default          true       false

Также проверим, что оба контейнера запущены в Podman:

$ podman psCONTAINER ID  IMAGE                                                   COMMAND               CREATED             STATUS                 PORTS  NAMES2e2f14eaa37b  docker.io/geerlingguy/docker-ubuntu2004-ansible:latest  /lib/systemd/syst...  About a minute ago  Up About a minute ago         ubuntu2ce0a0ea8692  registry.access.redhat.com/ubi8/ubi-init:latest         /usr/sbin/init        About a minute ago  Up About a minute ago         rhel8

При разработке роли Molecule использует запущенные инстансы для ее тестирования. Если тест проваливается или какая-то ошибка приводит к необратимым изменениям, из-за которых все надо начинать сначала, вы можете в любое время убить эти инстансы командой molecule destroy и создать их заново командной molecule create.

Заключение


Если вам не терпится и хочется поглубже копнуть тему разработки и тестирования ролей, или тему Ansible-автоматизации, то рекомендуем следующие ресурсы:

Подробнее..

Отказоустойчивый кластер с балансировкой нагрузки с помощью keepalived

24.10.2020 20:17:25 | Автор: admin

Сегодня я расскажу о том, как быстро собрать отказоустойчивый кластер с балансировкой нагрузки с помощью keepalived на примере DNS-серверов.


Итак, предположим, что у нас есть сервер, который должен работать без перебоев. Его нельзя просто так взять и выключить посреди рабочего дня клиенты или пользователи не поймут. Тем не менее любой сервер время от времени надо обслуживать, ставить обновления, менять аппаратную конфигурацию или сетевые настройки. Кроме того, нужно быть готовым к росту нагрузки, когда мощности сервера перестанет хватать. У сервера должна быть предусмотрена возможность быстрого масштабирования. Если вы озаботились этими проблемами, то вам нужно организовать отказоустойчивый кластер.


Чаще всего такие задачи приходится делать с HTTP-серверами. Я сегодня покажу сборку кластера на примере DNS, потому что опробовал технологию именно на нем, но с минимальными изменениями то же самое можно сделать и с серверами, работающими по TLS или HTTP.


Лирическое отступление о проблемах DNS


В принципе, DNS задуман так, чтобы необходимости городить огород с кластерами не возникало. В каждой зоне можно прописать множество NS-записей, в каждой сети можно раздать список DNS-серверов с помощью DHCP. DNS-сервера умеют реплицировать зоны, поэтому они хорошо масштабируются. Однако на практике это плохо работает. Когда я попробовал добавить 2-й DNS-сервер, то обнаружил, что


  1. Половина пользователей сидят со статическими настроенными адресами DNS-серверов. Ставят себе 4 восьмерки в качестве primary и локальный DNS в качестве secondary.
  2. Многие Linux-сервера не умеют из коробки корректно обновлять настройки DNS. Там такой зоопарк из glibc, nsswitch.conf, resolv.conf, NetworkManager, resolvconf, systemd-resolved, hosts, dhclient.conf и т. п., которые конфликтуют между собой, что рассчитывать на автоматическое обновление по DHCP просто не приходится.
  3. Windows шлет запросы одновременно на все сервера, но обязательно дожидается ответа или таймаута от 1-го
  4. Linux сначала обращается к 1-му DNS в списке и только в случае ошибки переходит к следующему.

Если долгое время в сети используется DNS-сервер с определенным IP, то он оказывается прописан в десятках разных мест. Например:


  • Директива resolver в nginx.conf
  • daemon.json в docker
  • В настройках docker-контейнеров
  • В конфигах модных нынче систем вроде kubernetes или openshift во внутренних файлах на каждой ноде и еще там же в конфигах dnsmasq.
  • В конфигах почтовых серверов.
  • В настройках VPN-серверов.

Никакими плейбуками и DHCP-декларациями это все обновить просто нереально. Поэтому было бы очень хорошо, если бы собираемый кластер можно было повесить на 1 уже существующий IP. Тогда для пользователей ничего не изменится, и софт перенастраивать не понадобится.


Поэтому я выбрал решение с keepalived и протоколом VRRP.


Подготовка


Собирая кластер из нескольких серверов, желательно уметь их различать на стороне клиента, чтобы не бегать искать по логам серверов, какой запрос, куда попал. Я для этого в bind9 завел вот такую зону.


/var/named/zones/load.balance.zone
$ORIGIN load.balance.$TTL 1hload.balance. 86400 IN SOA ns.mydomain.ru. dnsmaster.mydoamin.ru. (     1603065098 3600 1800 604800 30)load.balance. IN NS ns.mydomain.ru.health IN TXT =nameserver-1=

На 1-м сервере ресурсная запись TXT для health.load.balance содержит текст =nameserver-1=, на 2-м сервере =nameserver-2=, и т. д. Таким образом, отправляя запрос в кластер, я по ответу могу определить, какой сервер мне ответил, что очень удобно для отладки.


Если у вас HTTP-сервер, то поместите эту информацию в HTTP-заголовок. Например, для nginx я использую вот такую директиву


add_header serega-trace "$hostname" always;

Убедитесь, что ваши сетевые файерволлы не блокируют IP-трафик протокола 112 по адресу 224.0.0.18. Этот адрес будут использовать ваши сервера, чтобы договариваться между собой о том, кто из них MASTER, а кто BACKUP.


Открыть VRRP в iptables
iptables -t filter -I INPUT -p vrrp -d 224.0.0.18 -j ACCEPTiptables -t filter -I OUTPUT -p vrrp -d 224.0.0.18 -j ACCEPT

При организации DNS нужно выделить мастер-сервер, на который не будут идти клиентские запросы. DNS-мастер используется только для управления. Он реплицирует свои зоны на slave-сервера, которые уже видны пользователям, и именно на них идет нагрузка. Далее речь будет идти о кластеризации именно DNS-slave.


Уровень 1 (Easy)


Если вам просто достаточно резервирования на случай аварии, то рекомендую рассмотреть самый быстрый и простой вариант. 2 одинаковых сервера разделяют между собой общий виртуальный IP (далее буду называть его VIP). У кого в данный момент в сетевом интерфейсе прописан VIP, тот сервер и работает. 2-й сервер следит за мастером (имеется в виду мастер VRRP, а не DNS), и как только обнаруживает, что он перестал вещать, сразу объявляет мастером себя и поднимает VIP на своем сетевом интерфейсе.


Меня приятно удивило то, как быстро удалось поднять кластер по такому варианту. Несмотря на то, что раньше я никогда не имел дело с keepalived, уже через час все работало. Так что если вам нужно решить задачу быстро, то уровень 1 вам подойдет в самый раз.


Сбор информации


Для успешного развертывания вам понадобится собрать следующую информацию. Здесь я привожу значения для примера. У вас эти значения должны быть свои.


Параметр Возможное значение Описание
vip 10.2.1.5 виртуальный IP, на который шлют запросы клиенты
dev0 eth0 1-й сетевой интерфейс на узлах кластера
ip01 10.2.1.2 IP 1-го узла кластера на 1-м сетевом интерфейсе
ip02 10.2.1.3 IP 2-го узла кластера на 1-м сетевом интерфейсе
net0 10.2.1.0/24 подсеть, которой принадлежат ip01 и ip02

Установите keepalived и snmpd. SNMP ставить необязательно, но мне кажется, что, если серверов с виртуальными IP будет много, он будет полезен.


setenforce 0 # если вдруг у вас selinuxdnf install -y keepalived nmap-ncat net-snmp net-snmp-utilssystemctl enable keepalivedsystemctl enable snmpd

Netcat нужен для диагностики и healthcheck-ов.


В файл /etc/sysconfig/keepavlied добавьте опцию -x. Она нужна для взаимодействия keepalived с snmpd. Если вы не собираетесь поднимать SNMP, то этот шаг можете пропустить.


Отредактируйте файл /etc/snmp/snmpd.conf следующим образом:


/etc/snmp/snmpd.conf
master agentxrocommunity public

В /etc/keepalived положите вот такой скрипт keepalived-notify.sh:


/etc/keepalived/keepalived-notify.sh
#!/bin/shumask -S u=rwx,g=rx,o=rxexec echo "[$(date -Iseconds)]" "$0" "$@" >>"/var/run/keepalived.$1.$2.state"

Этот скрипт будет вызываться демоном keepalived при изменении состояния кластера. Он запишет в каталог /var/run статусный файл, который удобно использовать для диагностики.


Отредактируйте основной конфигурационный файл keepalived.conf следующим образом:


global_defs {    enable_script_security}vrrp_script myhealth {    script "/bin/nc -z -w 2 127.0.0.1 53"    interval 10    user nobody}vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 5    priority 100    advert_int 1    nopreempt    notify /etc/keepalived/keepalived-notify.sh root    authentication {        auth_type PASS        auth_pass KPSjXfRG    }    virtual_ipaddress {        10.2.1.5    }    track_script {        myhealth    }}

Блок global_defs содержит единственную необходимую настройку enable_script_security, которая по умолчанию отключена.


Блок vrrp_script описывает скрипт, который демон keepalived будет использовать для определения работоспособности своего сервера. Если этот скрипт вернет ошибку, то демон перейдет в состояние FAIL, и не будет претендовать на роль MASTER. В этом же блоке описывается периодичность выполнения healthchek-ов и указывается пользователь, от имени которого запускается скрипт. В нашем случае используется утилита netcat, которая устанавливает соединение c локальным DNS-сервером по TCP-порту 53. Можно использовать разные проверки, например, прозвонить UDP-порт 53 утилитой dig.


В блоке VRRP_INSTANCE задаются настройки 1 экземпляра сервера с виртуальным IP.


  • state задает начальное состояние сервера BACKUP или MASTER. В режиме nopreempt единственное допустимое значение BACKUP.
  • interface указывает, на каком сетевом интерфейсе будет поднят VIP
  • virtual_router_id уникальный идентификатор роутера VRRP. Возможные значения от 1 до 255. У всех узлов кластера это значение должно быть одинаковым. Рекомендуется в качестве router_id использовать последний байт VIP, чтобы не запутаться, когда у вас таких виртуальных адресов будет много.
  • priority задает приоритет данного экземпляра при выборе мастера. Мастером назначается сервер, у которого значение параметра priority выше. Если у нескольких серверов priority одинаковый, то мастер будет выбран случайным образом.
  • advert_int определяет, с какой периодичностью мастер должен сообщать остальным о себе. Если по истечению данного периода сервера не получат от мастера широковещательное уведомление, то они инициируют выборы нового мастера.
  • nopreempt означает, что если мастер пропал из сети, и был выбран новый мастер с меньшим приоритетом, то по возвращении старшего мастера, он останется в состоянии BACKUP. Т. е. если вы перезагрузили мастер, то он больше мастером не станет, пока новый мастер не отвалится. Если вы предпочитаете, чтобы мастером был какой-то конкретный сервер, то замените настройку nopreempt на preempt_delay.
  • notify задает хук-скрипт, который будет вызываться при каждом изменении состояния сервера, и имя пользователя, от имени которого данный скрипт будет выполняться.
  • authentication задает пароль, длиной до 8 символов, который будет защищать кластер от случайных коллизий с другими серверами в локальной сети.
  • virtual_ipaddress задает VIP
  • track_script указывает на описание скрипта, осуществляющего healthcheck.

Выполните указанные настройки на обоих серверах кластера и запустите сервисы:


systemctl start snmpdsystemctl start keepalived

Проверьте логи и статусные файлы на наличие ошибок.


journalctl -u snmpdjournalctl -u keepalivedtail /var/run/keepalived.INSTANCE.VI_1.state

Если у вас используется selinux, не забудьте по данным audit.log обновить политики и вернуть enforcing mode командой set enforce 1.


Проверка


Если в логах ошибок нет, можно проверять. Поскольку мы кластеризовали DNS, то будем использовать dig. Для проверки HTTP-сервера подойдет curl.


Запустите на клиенте такой скрипт


while true; do    dig -4 +short +notcp +norecurse +tries=1 +timeout=1 \        -q health.load.balance. -t txt @10.2.1.5;     sleep 1;done

Этот скрипт будет раз в секунду выдавать ресурсную запись health.load.balance/IN/TXT, которая содержит идентификатор сервера. В нашей конфигурации это будет тот сервер, который сейчас VRRP-мастер.


Зайдите на этот сервер и убедитесь, что в файле /var/run/keepalived.INSTANCE.VI_1.state в последней строке указано MASTER.


Перезапустите на мастере сервис keepalived. Если у вас все сделано правильно, то мастер поменяется. На 1-м сервере в файле keepalived.INSTANCE.VI_1.state появятся строки STOP и BACKUP, на втором сервере в этом же файле появится строка MASTER, а клиентский скрипт станет выдавать ресурсную запись с идентификатором нового мастера.


[2020-10-13T10:48:00+00:00] /etc/keepalived/keepalived-notify.sh INSTANCE VI_1 BACKUP 100[2020-10-13T11:26:29+00:00] /etc/keepalived/keepalived-notify.sh INSTANCE VI_1 MASTER 100

"=nameserver-1=""=nameserver-1=""=nameserver-1=""=nameserver-2=""=nameserver-2="

Все, кластер готов. Теперь можно перезагружать сервера по одному в любое время, не нужно откладывать обновления на выходные, не нужно работать по ночам, не нужно рассылать пользователям предупреждения о том, что возможны перебои в связи с регламентными работами.


Если у вас все получилось, значит вы успешно прошли 1-й уровень кластеризации. Он обладает следующими плюсами:


  • очень легко и быстро настраивается,
  • практически невозможно что-либо сломать,
  • на всех узлах кластера одинаковая конфигурация, что сильно сокращает трудоемкость администрирования.

Однако есть у данного варианта развертывания и существенный минус. В один момент времени в кластере работает только один сервер, а остальные, что называется, курят бамбук. Во-первых, это неэффективно с точки зрения использования вычислительных ресурсов. Во-вторых, если ваш сервер перестанет справляться с нагрузкой, то такой простенький кластер вам не поможет.


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


Уровень 2 (c балансировкой нагрузки)


Чтобы задействовать все сервера кластера, нужно научить VRRP-мастер, на сетевом интерфейсе которого прописан VIP, не только принимать трафик для своих локальных сервисов, но и направлять часть трафика на остальные сервера. Демон keepalived как раз умеет это делать.


Отредактируйте конфиг keepalived.conf, приведя его к следующему виду:


/etc/keepalived/keepalived.conf
global_defs {    enable_script_security}vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 5    priority 100    advert_int 1    nopreempt    notify /etc/keepalived/keepalived-notify.sh root    authentication {        auth_type PASS        auth_pass KPSjXfRG    }    virtual_ipaddress {        10.2.1.5    }}virtual_server 10.2.1.5 53 {    protocol UDP    delay_loop 10    lvs_sched rr    lvs_method NAT    real_server 10.2.1.2 53 {        DNS_CHECK {            type txt            name health.load.balance.        }    }    real_server 10.2.1.3 53 {        DNS_CHECK {            type txt            name health.load.balance.        }    }}virtual_server 10.2.1.5 53 {    protocol TCP    delay_loop 10    lvs_sched rr    lvs_method NAT    real_server 10.2.1.2 53 {        TCP_CHECK {            connect_timeout 3        }    }    real_server 10.2.1.3 53 {        TCP_CHECK {            connect_timeout 3        }    }}

Начало конфигурации аналогично предыдущему варианту без балансировки, только из блока vrrp_instance исчез track_script, соответственно за ненадобностью был удален блок vrrp_script.


Главное отличие в новой конфигурации заключается в блоках virtual_server. Для DNS требуется 2 виртуальных сервера, для 53-го порта TCP и для 53-го порта UDP. В случае HTTP-сервера аналогично потребуются сервера для 80-го и 443-го портов TCP.


Каждый виртуальный сервер идентифицируется 3 значениями: IP, порт и протокол. IP и порт через пробел указываются в заголовке блока virtual_server, а протокол определяется параметром protocol внутри блока. Допустимые протоколы TCP и UDP. В случае DNS как раз нужны оба.


Параметр delay_loop задает периодичность, с которой балансировщик опрашивает бэкенды для определения их состояния.


Самые важные параметры в виртуальном сервере это lvs_sched и lvs_method. lvs_sched задает алгоритм, по которому балансировщик определяет, куда отправить очередной IP-пакет. lvs_method задает механизм, который использует балансировщик для направления пакетов в выбранный пункт назначения.


В приведенном примере lvs_sched равен rr, что означает round robin, т. е. балансировка равномерно по очереди. lvs_method используется NAT. Кроме NAT доступны также механизмы DR (direct routing) и TUN (tunneling). На мой взгляд, NAT единственный рабочий вариант. Остальные методы работают только в очень специфических условиях.


Каждый виртуальный сервер состоит из нескольких реальных серверов, что отражено в соответствующих вложенных блоках real_server. Внутри блока real_server надо описать способ опроса его состояния, т. е. healthcheck.


После такой настройки keepalived работает следующим образом:


  1. Принимает IP-пакет с адресом получателя равным VIP.
  2. Выбирает real_server, куда необходимо направить пакет, анализируя протокол, порт, lvs_sched и результаты healthcheck-ов.
  3. Заменяет в IP-пакете адрес получателя на IP-адрес выбранного реального сервера и отправляет его дальше.

Только для работы этого недостаточно. Выбранный реальный сервер отправит ответный IP-пакет, в котором адрес отправителя будет равен его собственному IP-адресу. Клиент дропнет такой пакет, потому что он отправлял запрос на VIP и ожидает ответы от VIP, а не с IP-адреса реального сервера.


Чтобы решить эту проблему, нужно заставить реальный сервер отправить ответ не на IP клиента, а на IP мастера, чтобы тот выполнил обратную подстановку реального IP на виртуальный.


Для этого понадобится itpables и некоторые настройки ядра.


dnf -y install iptables iptables-servicessystemctl enable iptablessystemctl start iptables

echo "net.ipv4.ip_forward=1" >>/etc/sysctl.d/99-sysctl.confecho "net.ipv4.vs.conntrack=1" >>/etc/sysctl.d/99-sysctl.confsysctl -w net.ipv4.ip_forward=1sysctl -w net.ipv4.vs.conntrack=1

Добавьте в iptables следующее правило:


iptables -t nat -I POSTROUTING 1 -d 10.2.1.0/24 -j SNAT --to-source 10.2.1.5service iptables save

Действие SNAT означает, что после маршрутизации в IP-пакете IP-адрес источника будет заменен на IP-адрес to-source. Вместо SNAT можно также использовать действие MASQUERADE, которое делает то же самое, только определяет исходящий IP автоматически.


Поскольку были внесены изменения в такие вещи как iptables и параметры ядра, рекомендуется перезагрузить сервер и убедиться, что ничего из этого не потерялось.


Выполните описанные действия на обоих серверах кластера. Проверьте логи и статусные файлы. Если ошибок нет, то выполните проверку работы кластера способом, описанным выше. Теперь должен получиться вот такой вывод:


"=nameserver-1=""=nameserver-2=""=nameserver-1=""=nameserver-2=""=nameserver-1="

Поскольку в балансировщике задан алгоритм round robin, то сервера отвечают строго по очереди друг за другом.


Остановите named на 2-м сервере, и получите:


"=nameserver-1=""=nameserver-1=""=nameserver-1=""=nameserver-1=""=nameserver-1="

Снова запустите на 2-м сервере named, и на клиенте снова начнется чередование ответов.


Не забудьте про корректировку политик selinux, о которой рассказано выше.


Поздравляю. Только что мы с вами прошли 2-й уровень кластеризации.


Теперь наш кластер не только отказоустойчивый, но и масштабируемый.


Тем не менее, данная конструкция имеет и большой минус. Из-за трансляции адресов на подчиненные сервера запросы приходят с VIP, и невозможно по логам определить, какой запрос от какого клиента пришел. Возможность вычислить клиента по IP очень полезна для решения различных проблем. Поэтому, мой совет не останавливаться на 2-м уровне и, по возможности, перейти на 3-й.


Уровень 3 (Expert)


3-й уровень кластеризации подразумевает, что вы уже находитесь на 2-м, и все у вас работает как надо. Необходимо только обеспечить проброс клиентского IP-адреса до реальных серверов.


Принцип проброса следующий: все пакеты, приходящие на сервер, содержат IP реального клиента, а ответы на них отправляются на VIP. Т. е. VIP для реального сервера является шлюзом по умолчанию. Причем на этот шлюз направляются даже те пакеты, получатель которых находится в локальной подсети.


Но у серверов уже есть шлюз по умолчанию, и заменить его нельзя. Если убрать стандартный шлюз по умолчанию, то балансировка может быть и будет работать, однако все остальное сетевое взаимодействие у сервера сломается, и на него нельзя будет даже зайти по SSH.


Решение заключается в создании на сервере 2-го сетевого интерфейса. На 1-м сетевом интерфейсе будет производиться стандартный сетевой обмен, а на 2-м как раз и будет настроен VIP в качестве шлюза по умолчанию. Соответственно, у серверов вместе с дополнительным сетевым интерфейсом должен будет появиться и дополнительный IP-адрес.


Итак, добавьте на сервера кластера дополнительные сетевые интерфейсы и назначьте им IP-адреса.


Соберите информацию, необходимую для дальнейшей настройки. В нашем примере будут использоваться следующие значения:


Параметр Возможное значение Описание
vip 10.2.1.5 виртуальный IP, на который шлют запросы клиенты
dev0 eth0 1-й сетевой интерфейс на узлах кластера
dev1 eth1 2-й сетевой интерфейс на узлах кластера
ip01 10.2.1.2 IP 1-го узла кластера на 1-м сетевом интерфейсе
ip02 10.2.1.3 IP 2-го узла кластера на 1-м сетевом интерфейсе
ip11 10.2.1.6 IP 1-го узла кластера на 2-м сетевом интерфейсе
ip12 10.2.1.7 IP 2-го узла кластера на 2-м сетевом интерфейсе
net0 10.2.1.0/24 подсеть, которой принадлежат ip01 и ip02

Скорректируйте конфигурацию keepalived по указанному образцу.


/etc/keepalived/keepalived.conf
global_defs {    enable_script_security}vrrp_instance VI_1 {    state BACKUP    interface eth0    virtual_router_id 5    priority 100    advert_int 1    nopreempt    notify /etc/keepalived/keepalived-notify.sh root    authentication {        auth_type PASS        auth_pass KPSjXfRG    }    virtual_ipaddress {        10.2.1.5    }}virtual_server 10.2.1.5 53 {    protocol UDP    delay_loop 10    lvs_sched rr    lvs_method NAT    real_server 10.2.1.6 53 {        DNS_CHECK {            connect_ip 10.2.1.2            type txt            name health.load.balance.        }    }    real_server 10.2.1.7 53 {        DNS_CHECK {            connect_ip 10.2.1.3            type txt            name health.load.balance.        }    }}virtual_server 10.2.1.5 53 {    protocol TCP    delay_loop 10    lvs_sched rr    lvs_method NAT    real_server 10.2.1.6 53 {        TCP_CHECK {            connect_ip 10.2.1.2            connect_timeout 3        }    }    real_server 10.2.1.7 53 {        TCP_CHECK {            connect_ip 10.2.1.3            connect_timeout 3        }    }}

От предыдущей конфигурации новая отличается тем, что для реальных серверов указаны IP с дополнительных сетевых интерфейсов, но healthcheck-и отправляются на IP основных сетевых интерфейсов. Обратите внимание на этот момент. Все сервера кластера опрашивают друг друга, но на дополнительных сетевых интерфейсах будут настроены маршруты на VIP, поэтому узлы, которые сейчас в состоянии BACKUP, не смогут получить ответ от новых IP-адресов.


Теперь необходимо прописать правильные маршруты для дополнительных сетевых интерфейсов.


Добавьте в файл /etc/iproute2/rt_tables 2 новых таблицы маршрутизации. В примере ниже добавлены таблицы table0 и table1.


/etc/iproute2/rt_tables
## reserved values#255     local254     main253     default0       unspec## local##1      inr.ruhep20      table021      table1

По документации к NetworkManager и CentOS 8 статические маршруты и правила следует помещать в файлы /etc/syconfig/network-scripts/route-eth0 и rule-eth0. На многих моих серверах именно так и сделано. Только почему-то на серверах, поднятых из одного и того же образа, формат этих файлов оказался разным. На большинстве серверов route-eth0 выглядит так:


route-eth0 здорового человека
192.168.1.0/24 via 192.168.1.1172.10.1.0/24 via 172.10.1.1

но почему-то на моих серверах DNS эти же файлы содержат вот это:


route-eth0 курильщика
ADDRESS0=192.168.1.0NETMASK0=255.255.255.0GATEWAY0=192.168.1.1ADDRESS1=172.10.1.0NETMASK1=255.255.255.0GATEWAY1=172.10.1.1

Формат понятен, только совершенно непонятно, как в него поместить имя таблицы маршрутизации. Я не смог разобраться в этом вопросе. Если кто-то знает, в чем дело, поделитесь, пожалуйста, информацией в комментариях.


Поскольку сохранить маршруты в специальных системных файлах не удалось, пришлось сделать костыль.


/etc/keepalived/routes.sh
#!/bin/sh# https://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.multiple-links.htmlvip="10.2.1.5"dev0="eth0"ip0="10.2.1.2" # "10.2.1.3"dev1="eth1"ip1="10.2.1.6" # "10.2.1.7"ip route add 10.2.1.0/24 dev "$dev0" src "$ip0" table table0ip route add default via 10.2.1.1 table table0ip rule add from "$ip0" table table0ip route add "$vip/32" dev "$dev1" src "$ip1"ip route add default via "$vip" table table1ip route add "$vip/32" dev "$dev1" src "$ip1" table table1ip rule add from "$ip1" table table1

В комментарии в скрипте указаны значения, которые надо скорректировать при переносе скрипта на другой сервер.


Данный скрипт я добавил в автозапуск вместе с сервисом keepalived.


systemctl edit keepalived

[Service]ExecStartPre=/etc/keepalived/routes.sh

Не самое элегантное решение, но работает нормально, поэтому можете спокойно использовать, если не знаете, как можно сделать лучше.


Принципы задания правил маршрутизации описаны в Linux Advanced Routing & Traffic Control HOWTO. Идея заключается в том, что создается 2 независимые таблицы маршрутизации, в каждой свой шлюз по умолчанию. В зависимости от того, с какого сетевого интерфейса отправляется пакет, с помощью правил ip rule выбирается либо одна таблица, либо другая.


Удалите из iptables правило SNAT в цепочке POSTROUTING, добавленное при прохождении 2-го уровня. Сохраните состояние iptables.


iptables -t nat -D POSTROUTING -d 10.2.1.0/24 -j SNAT --to-source 10.2.1.5service iptables save

Проверьте результат. Клиент должен получать ответы от каждого сервера поочередно, в логах на серверах должны писаться реальные IP клиентов.


Теперь имеется отказоустойчивый кластер, в котором все живые узлы принимают нагрузку и видят IP-адреса своих клиентов. Единственный небольшой минус у этой конфигурации заключается в том, что есть 1 скрипт, который на разных серверах должен иметь разные параметры. Небольшое усложнение администрирования, которое с лихвой окупается полученными преимуществами.


Сложность Масштабирование Единые настройки IP клиента
Уровень 1 Easy Нет Да Да
Уровень 2 Normal Да Да Нет
Уровень 3 Expert Да Нет Да
Подробнее..

БудниDevOpscобираемgcc9.3.1подCentOS8

21.04.2021 16:08:09 | Автор: admin

В Северстали внедрены большие корпоративные системы, такие какSAPилиQMET,но есть и много разных задач, которые закрывает собственная разработка,и задачи у этой разработки редко бывают простыми. А значит, и требования к инструментам разработки бывают достаточно специфическими.Что делать, если вашим разработчикам потребовалсяgcc-9подCentOS,а его нет в общедоступных репозиториях? Конечно, засучить рукава исоздать требуемые пакеты. Вот только задача эта выглядит просто только на первый взгляд.

Если вам интересно, какие грабли разложены на пути к замене системного компилятора, и как мы с ними справились, добро пожаловать под кат.

Stage1.Собственно сборкаgcc

Здесь казалось бывсё просто: берёмgcc.specот пакетаgcc-8.3.1, меняем 8 на 9, запускаемrpmbuildbb,долго ждём? Да, но нет. Для начала придётся пересмотреть и поправить все патчи, а заодно ещё и поставитьbinutilsпосвежее,благо этонесложно. Потом, мы же не просто так компилятор меняем, нам же ещё какие-нибудьnvptx-toolsподавай, а это значит, что когда сборка закончитсяи начнется тестирование, тесты вlibgomp,завязанные на выгрузку кода, начнут виснуть и застревать в разных странных позах.

Решения тут может быть два:

  1. Консервативное: сказать разработчикам извините, нешмогла и отключитьnvptx-tools.

  1. Экспериментальное: предупредить разработчиков, чтоnvptxони используют на свой страх и риск, после чего запуститьrpmbuild, дождаться застревания в тестах и отстреливать их руками. Вы получите массовыеtestsfailedв результатах, но искомые пакеты будут собраны.

Stage 2. Packagelibgcc.i686 has inferiorarchitecture

Итак,мыскладываемвсеэтизамечательныеgcc-9.3.1-3.el8.x86_64.rpm, gcc-offload-nvptx-9.3.1-3.el8.x86_64.rpmит.д.ит.п.вотдельныйрепозиторий,индексируемего,подключаемв/etc/yum.repos.d,говоримdnfupdateиНет, ну вы правда думали, что он возьмёт и сразупоставится? Как бы не так. Как известно, 64-разрядные дистрибутивы семействDebianиRedHatдля семейств процессоровx86 в глубине души немножечко 32-разрядные (то есть, по умолчанию существуют в режимеmultilib), и поэтому вам потребуется илиобъявитьmultilibпережитком прошлогои снести 32-разрядные библиотеки системного компилятора, или создать соответствующие пакеты (libgcc.i686,libgfortran.i686,libgomp.i686,libquadmath.i686 иlibstdc++.i686) для новой версии. Как ни забавно, но решения тут тоже может быть два:

  1. Рекомендованное производителем: поставитьmockи выполнитьполнуюсборку дляi686, наступив на все сопутствующие грабли (nvptx,например, лучше сразу выключить).

  1. Ленивое на скорую руку: дело в том, что 32-битные версии библиотек на самом деле собираются вместе с 64-битными,ноникудав итогене попадают. В стандартной версииgcc.specони вообще тупо удаляются, но это как раз недолго изакомментировать. А потом скопироватьgcc.specвlibgcc-i686.spec, вымарать из него всю секцию %build, а в %installнаписать примерно следующее:

%install rm -rf %{buildroot} mkdir -p %{buildroot} tar cf - -C %{_buildrootdir}/%{name}-%{version}-%{release}.x86_64 usr | tar xf - -C %{buildroot}  FULLPATH=%{buildroot}%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_major} FULLEPATH=%{buildroot}%{_prefix}/libexec/gcc/%{gcc_target_platform}/%{gcc_major}  # fix some things mkdir -p %{buildroot}/%{_lib} mv -f %{buildroot}%{_prefix}/%{_lib}/libgcc_s.so.1 %{buildroot}/%{_lib}/libgcc_s-%{gcc_major}-%{DATE}.so.1 chmod 755 %{buildroot}/%{_lib}/libgcc_s-%{gcc_major}-%{DATE}.so.1 ln -sf libgcc_s-%{gcc_major}-%{DATE}.so.1 %{buildroot}/%{_lib}/libgcc_s.so.1  mkdir -p %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib} mv -f %{buildroot}%{_prefix}/%{_lib}/libstdc++*gdb.py* \       %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/ pushd %{name}-%{version}-%{DATE}/libstdc++-v3/python  for i in `find . -name \*.py`; do   touch -r $i %{buildroot}%{_prefix}/share/gcc-%{gcc_major}/python/$i done touch -r hook.in %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/libstdc++*gdb.py popd  for f in `find %{buildroot}%{_prefix}/share/gcc-%{gcc_major}/python/ \        %{buildroot}%{_datadir}/gdb/auto-load/%{_prefix}/%{_lib}/ -name \*.py`; do   r=${f/$RPM_BUILD_ROOT/}   %{__python3} -c 'import py_compile; py_compile.compile("'$f'", dfile="'$r'")'   %{__python3} -O -c 'import py_compile; py_compile.compile("'$f'", dfile="'$r'")' done  rm -rf %{buildroot}%{_prefix}/%{_lib}/%{name} 

Теперь достаточно сказатьrpmbuildbblibgcc-i686.specгде-то в соседнем терминале, покаgccразвлекается своимtorture,ивуаля, наши32-битные пакеты у нас в кармане (в смысле, в $RPM_BUILD_ROOT/RPMS/i686).Мы копируем их в наш репозиторий, индексируем его, запускаемdnfmakecacherepogcc-9 &&dnfupdateи Нет, обновить компилятор всё ещё нельзя.

Stage3.Annobinиlibtool

Те, кто внимательно смотрит на параметры сборкина линуксах линеекRHELиCentOS, могли заметить, что по умолчанию вgccподключен плагинannobin.У этого плагина есть неприятная привычка привязываться к версии компилятора, поэтому его придется пересобрать. Детали в принципе изложены в самомannobin.specв комментариях, поэтому отметим только, что пересобрать его придётся минимум дважды: сперва, используя ещё системныйgcc8.3.1,поправить требование к версииgcc,чтобыgcc< %{gcc_next}превратилось вgcc<=%{gcc_next}, потом, уже заменивgcc,пересобрать заново, вернув требованиеgcc< %{gcc_next}ираскомментировавстроку%undefine_annotated_build иначе вообще ничего собираться не будет. Ну и для чистоты можно пересобрать в третий раз, вернув_annotated_buildна место, а предыдущие две версии пакетов (переходную и без аннотациибинарей) из репозитория удалить.

Остаетсяlibtool.Этот джентльмен тоже жёстко привязывается к версииgcc,но к счастью, зависимость эта односторонняя, поэтомуlibtoolможно просто удалить перед заменойgcc,затем собрать его заново новымgccи добавить соответствующий пакет в наш репозиторийgcc-9.

Как ни странно, на этом всё. У нас есть отдельный репозиторий, подключив который, можно поставить требуемую версию компилятора, а при необходимости вернуть обратно системную версию (командойdnfdowngradegcc),хотя необходимости такой у нас не возникало.

Хабравчане-девопсы, а какие у вас бывали нестандартные запросы от разработчиков?

Подробнее..

Самые лучшие дистрибутивы Linux для десктопа в 2020 году

20.10.2020 12:19:01 | Автор: admin

Логотипы пяти лучших дистрибутивов для начинающих пользователей Linux

Linux традиционно считается операционной системой для инженеров и программистов, но уже давно прикладываются реальные усилия, чтобы сделать Linux привлекательнее для остальных людей. Это очень важно, поскольку неустранимые архитектурные проблемы безопасности Windows и закрытая экосистема Apple не позволяют рассматривать их как надёжные варианты для массового использования.

Linux представлен в разных видах. Здесь невероятные возможности настройки, поэтому дистрибутивы разрабатываются исходя из разных потребностей и интересов пользователей. Например, кто-то переходит с Windows или macOS и есть дистрибутивы, которые в точности повторяют их интерфейс. Другие сосредоточены, например, на максимальной безопасности или эффективном использовании ресурсов.

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

Содержание


  1. Лучшие дистрибутивы для начинающих
  2. Лучшие дистрибутивы для опытных специалистов
  3. Самые легковесные варианты для старых машин x86
  4. Опрос

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

В целом выбор конкретного дистрибутива зависит от того, что нам нужно: графический интерфейс, похожий на Windows или macOS? Лучшая безопасность? Возможность тщательной настройки ядра и всех аспектов системы?

Разные дистрибутивы Linux предназначены для конкретных типов пользователей. Например, Ubuntu проста в использовании, потому что предназначена для новичков. С другой стороны, Arch Linux создана для опытных пользователей, которые любят вводить команды в консоли. Давайте пройдёмся по разным категориям.

Лучшие дистрибутивы для начинающих



Ubuntu


Во многих рейтингах на первом месте для домашнего десктопа стоит Ubuntu. Несомненно, это один из самых популярных вариантов (посмотрим результаты голосования на Хабре). Система проста в использовании, у неё комфортный GUI. Внешний вид элементов легко настраивается, поддерживаются темы, хотя этим сейчас никого не удивишь.



Самое главное, что у Ubuntu большое сообщество, на Хабре раньше даже был отдельный хаб Убунтариум. Но и сейчас легко найти многочисленные форумы, где можно попросить совета и просто пообщаться с единомышленниками. Главный ресурс Форум русскоязычного сообщества Ubuntu. С этим сообществом вряд ли может кто-то может сравниться.

Linux Mint


В течение нескольких лет Linux Mint лидировал в счётчике Distrowatch, сейчас он опустился на третье место после MX Linux и Manjaro.

Среднее за сутки количество заходов на страницу Distrowatch за последние 6 месяцев
1 MX Linux 3713
2 Manjaro 2567
3 Mint 2313
4 Ubuntu 1615
5 Pop!_OS 1498
6 Debian 1355
7 elementary 1300
8 Fedora 1011
9 Solus 1011
10 Zorin 885

Цель проекта Linux Mint предоставить пользователю современную, элегантную и удобную операционную систему, которая одновременно является мощной и простой в использовании.


Linux Mint с окружением MATE

Дистрибутив обеспечивает полноценную поддержку форматов мультимедиа, включает некоторые проприетарные программы и поставляется в комплекте с обширным набором опенсорсных приложений. Linux Mint очень понравится новым пользователям Linux, потому что интерфейс похож на Windows 7. Все программы сгруппированы по категориям.

Систему можно собрать с окружением Cinnamon, MATE или Xfce. Linux Mint работает быстро, отлично подходит для старых компьютеров. Сделан на базе Ubuntu и Debian, использует те же репозитории.

Elementary OS


Многие дистрибутивы приспосабливают графический интерфейс для удобства пользователей, которые привыкли к Windows. А вот Elementary OS один из немногих, который ориентирован на пользователей macOS, то есть очень похож на интерфейс маков. Поэтому его называют одним из самых красивых дистрибутивов Linux.



Эта система тоже основана на Ubuntu LTS, что означает высокую стабильность. Используется среда рабочего стола Pantheon (на основе GNOME), которая копирует macOS. Приложения Pantheon либо форки приложений GNOME, либо написаны с нуля на Vala (компилируемый язык программирования).



В комплекте установки идёт совсем немного программ, включая браузер Epiphany, почтовый клиент и несколько инструментов. Всё необходимое придётся устанавливать самостоятельно из AppCenter. Это единый центр для установки и обновления приложений.

Manjaro



Manjaro Linux

Дистрибутив Manjaro основан на Arch Linux. Хотя в основе лежит система, которая ориентирована на опытных специалистов, сам Manjaro на самом деле хорошо подходит для новичков. Простой и дружественный интерфейс, много GUI-приложений в комплекте.

В качестве среды рабочего стола можно установить Xfce, KDE или GNOME. Также официально поддерживается Net-версия без графического окружения для более опытных пользователей, желающих создать рабочее окружение на свой вкус.

Zorin OS



Zorin OS

Zorin OS ещё один дистрибутив на базе Ubuntu, который входит в число самых простых в использовании, интуитивно понятных и красивых. Графический интерфейс особенно улучшился после выхода версии Zorin 15 в прошлом году. Целевой аудиторией являются начинающие пользователи Linux, привыкшие работать в Windows.

Zorin OS выпускается в четырёх редакциях: Lite, Core, Education и платная Ultimate. Автор дистрибутива Артём Зорин, молодой парень из Дублина. Его родители русские, переехавшие из Украины в Ирландию много лет назад. Над операционной системой Артём работает с 2008 года вместе с братом Кириллом. Они зарегистрировали коммерческую компанию и продают платные версии Zorin OS и другие продукты.


Авторы дистрибутива Кирилл и Артём Зорины в 2010 году. Фото: podcast.ubuntu-uk.org

Лучшие дистрибутивы для опытных специалистов



Некоторых опытных пользователей раздражает интерфейс для новичков они хотят лучшего контроля над своей машиной. Это возможно только тогда, когда у вас максимальный контроль над операционной системой.

Идеальный дистрибутив для опытных пользователей это тот, который поощряет интенсивное взаимодействие со всеми аспектами ОС и помогает достигнуть главной цели построения идеальной системы. У пользователя полный контроль, какие пакеты устанавливать в систему.

Arch и Gentoo при инсталляции даже не предлагают вариантов по умолчанию, так что нужно вручную выбрать текстовый редактор, веб-браузер, читалку PDF и т. д. В остальных дистрибутивах есть настройки по умолчанию, но туда не включены кодеки и плагины для медиафайлов, их надо добавить самостоятельно.

Одно из главных преимуществ этих дистрибутивов заключается в том, что они легко настраиваются. Конечно, во всех дистрибутивах вы можете изменить фон рабочего стола, тему значков, определить сочетания клавиш, настроить управление питанием и внести множество других изменений во внешний вид и поведение всех. Но эстетическая конфигурация это лишь малая часть общей картины. Представленные здесь дистрибутивы идут дальше, предлагая пользователям возможность вносить не только косметические изменения, но и настраивать практически всё, что можно настроить, в соответствии с вашими конкретными потребностями, включая ядро. Это резко контрастирует с обычными дистрибутивами, где вы проходите через процесс установки, а потом удаляете ненужные пакеты и настройки. Так никогда не получится собрать такую же хорошую (оптимизированную) систему, как построенную с нуля в соответствии с вашими спецификациями.

Например, Gentoo это единственный дистрибутив, который во время инсталляции позволяет проверить ядро и удалить из него ненужные функции.



Fedora это испытательный стенд инструментов и технологий, которые затем попадают в Red Hat Enterprise Linux. Это идеальный дистрибутив для тех, кто хочет быть на переднем крае разработки.

В то время как Slackware, Gentoo и Arch заставляют использовать консоль для многих задач настройки, у Fedora отличные инструменты GUI для настройки сети, брандмауэра и т. д. Fedora легко настроить как игровую станцию, медиасервер для стриминга контента или даже как веб-сервер.

Slackware стремится создать самый доступный Unix-подобный дистрибутив и ставит главными приоритетами стабильность и простоту использования, хотя многие жалуются на трудность в освоении. Нужно отметить, что у Slackware нет нормального репозитория и баг-трекера, то есть разработчики не следуют общепринятой методологии опенсорса.

Debian чрезвычайно стабильная система, что делает её идеальной для серверов. Стабильность достигается благодаря тому, что ОС поставляется с более старыми пакетами, поэтому система не очень подходит для десктопа.

Как и Gentoo, дистрибутив Arch даёт доступ ко всем внутренностям системы, но считается попроще в использовании, чем Gentoo. Философия минимализма отличает Arch от большинства других дистрибутивов, которые стараются стать самыми функциональными и красивыми. Кроме ядра, Arch больше не предлагает никаких пакетов по умолчанию при установке, позволяя пользователям сформировать дистрибутив с нуля. Это даёт возможность собрать гораздо более быструю систему.

У Arch и Gentoo отличная система управления пакетами, в то время как Slackware здесь выделяется в худшую сторону.

Перечисленные пять дистрибутивов сильно отличаются по модели обновления. Fedora выпускает новый релиз раз в шесть месяцев, Debian раз в два года, и процесс перехода на новую версию болезненный и времязатратный. Slackware выпускает новую версию без расписания, когда накопится достаточное количество новых функций (раз в несколько лет). Наконец, Arch и Gentoo применяют плавающий релиз (rolling release), постоянно обновляя систему по мере выхода новой версии каждого пакета. То есть пользователь устанавливает систему и навсегда забывает об обновлениях, которые выполняются постоянно в фоновом режиме. Это просто отличная вещь.

Самые легковесные варианты для старых машин x86



Современные дистрибутивы типа Ubuntu ориентированы на массовую аудиторию пользователей, работающих на современном железе. В результате они стали слишком раздутыми и тормозными для старых машин, даже если вручную провести установку и удалить ненужные пакеты. Без большого объёма оперативной памяти и мощного CPU они не показывают хорошей производительности.

К счастью, есть много легковесных дистрибутивов, которые усечены и настроены опытными специалистами. Они способны вдохнуть новую жизнь в старое оборудование.

Lubuntu


Дистрибутив Lubuntu рекомендуют почти в каждом обзоре. Многие знают, что это официальный вариант Ubuntu (как и другой легковесный дистрибутив Ubuntu MATE). Благодаря этому Ubuntu и Lubuntu пользуются одним и тем же программным обеспечением и репозиториями.


Lubuntu с рабочим столом

Это быстрый и лёгкий дистрибутив, который отлично подходит для старых компьютеров. К сожалению, с версии 18.10 перестали выходить 32-битные образы. Последняя Lubuntu 20.04 LTS работает с минималистичным рабочим столом LXQt. В системе реализовано эффективное энергопотребление, так что её можно рекомендовать для установки на ноутбуки. Минимальные системные требования: процессор Pentium 4, Pentium M, AMD K8 или выше, 1 ГБ оперативной памяти.

Linux Lite


Linux Lite также можно рекомендовать как вариант для новых пользователей. Не так давно он был одним из самых быстрорастущих дистрибутив. Если нужен дистрибутив, который одновременно прост в освоении, работает на старых ПК и приятно выглядит, то это идеальный вариант.


Linux Lite 5.0

Это отличная легковесная ОС, основанная на выпусках Ubuntu LTS. Она поставляется со всеми популярными и полезными приложениями. Linux Lite также считается одним из лучших дистрибутивов для тех, кто переходит на Linux с Windows (то есть он похож на Windows). Минимальные требования: процессор 1 ГГц, 768 МБ оперативной памяти, разрешение экрана 1024768.

Puppy Linux


Puppy Linux один из ветеранов среди легковесных дистрибутивов с 15-летней историей. Сейчас выпускаются различные версии в зависимости от базовой среды, например, версия Puppy Linux 8.0 (Bionic Pup) основана на Ubuntu Bionic Beaver (18.04), а Slacko Puppy 6.3.2 на Slackware 14.1.


Puppy Linux

Создатель дистрибутива Барри Каулер отошёл от основного проекта, а теперь занимается смежным проектом под названием Quirky это версия Puppy Linux, собранная волшебными, как он их называет, скриптами Woof-CE. Скрипты могут скачивать пакеты некоторых других дистрибутивов, обрезать их прямо в Puppy-размер, а затем собирать Puppy Linux live-CD и делать всё это полностью автоматически.

В дистрибутиве очень много разнообразных приложений, которые устанавливаются по желанию. В том числе довольно нестандартных, как Homebank для управления финансами или Samba для управления общими ресурсами. Версия Bionic Pup совместима с репозиториями Ubuntu, предоставляя доступ к обширной коллекции софта от родительского дистрибутива. Но если ограничиться минимальным набором пакетов, то Puppy Linux занимает на диске около 300 МБ.

Минимальные системные требования: процессор 600 МГц, 256 МБ оперативной памяти.

TinyCore


TinyCore пожалуй, самый крошечный дистрибутив Linux. Самая лёгкая версия Core весит всего 11 МБ и идёт без GUI.

Базовая система TinyCore размером 16 МБ предлагает на выбор графические среды для рабочего стола FLTK или FLWM.

Можно установить CorePlus весом 106 МБ, там уже более продвинутые оконные менеджеры, такие как IceWM и FluxBox, есть поддержка Wi-Fi и другие необходимые нормальному человеку функции.

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


TinyCore

TinyCore экономит на размере, требуя подключения к сети во время первоначальной настройки. Минимальный объём оперативной памяти 64 МБ, рекомендуемый 128 МБ, процессор i486DX. Выпускаются 32-битные и 64-битные версии, а также PiCore для устройств ARM, таких как Raspberry Pi.

Ubuntu MATE


Ubuntu MATE это самый тяжёлый из легковесных дистрибутивов Linux. Его системные требования: процессор 1 ГГц, 1 ГБ оперативной памяти и 8 ГБ свободного места на диске.

В последней версии Ubuntu MATE 20.04 LTS реализована масса новых функций и улучшений, включая несколько вариаций цветовых тем, установка в один клик, экспериментальный ZFS и игровой режим от Feral Interactive.


Ubuntu MATE 20.04

MATE одно из лучших окружений для десктопа, наряду с GNOME, KDE и Cinnamon. То есть это самый красивый вариант Linux, который можно установить на относительно старом железе.



Кроме всех упомянутых, нужно отметить самые быстрорастущие в последнее время дистрибутивы MX Linux и Linux Lite, однозначный выбор для приватности и безопасности Tails, для пентестинга Kali Linux, серверную систему CentOS (по сути, бесплатная версия RedHat Enterprise) и лучший дистрибутив для Raspberry Pi Raspbian.

Стоит ещё добавить, что по своей архитектуре Linux фундаментально превосходит Windows в вопросах информационной безопасности. Это относится к любому дистрибутиву.

Что ж, теперь посмотрим на результаты опроса ниже. Победит ли ожидаемо Ubuntu или хабражители выберут другой вариант?



На правах рекламы


Арендуйте сервер любой конфигурации в течение минуты, с любой операционной системой (есть возможность установить ОС со своего образа). Используем только современное брендовое оборудование и лучшие ЦОД-ы. Эпичненько :)

Подробнее..

Alma, но не Mater встречайте AlmaLinux, наследника CentOS 8

14.01.2021 16:09:15 | Автор: admin
Источник

CloudLinux заявила, что в продолжение дистрибутива CentOS 8 будет создан новый под названием AlmaLinux. Компания заменила первоначальное придуманное название, чтобы уйти от несколько каламбурного Lenix: Lenix Linux выглядело не очень читаемо.

CloudLinux планирует инвестировать в проект $1 млн. в год. Компания станет его основным спонсором, снабдив разработчиками и необходимыми ресурсами.


Основатель компании CloudLinux предприниматель и выходец из Украины Игорь Селецкий. Штаб-квартира компании находится в Пало-Альто в Калифорнии. Среди клиентов компании крупнейшие корпорации и их дочки, включая Dell и IBM Softlayer.

Что известно о новом дистрибутиве AlmaLinux


  • Основа пакетная база Red Hat Enterprise.
  • Полная бинарная совместимость с RHEL.
  • Простая и прозрачная миграция с CentOS 8.
  • Поддерживаемые обновления до 2029 года.
  • Free-модель для пользователей.
  • Функции принятия решений делегируют сообществу по аналогии с платформой Fedora.


Предполагается, что первый выпуск нового дистрибутива будет доступен уже в первом квартале этого года.

Зачем нужен новый дистрибутив? У ветки CentOS 8 есть одно узкое место: прекращение поддержки с конца этого года. Ее убрали преждевременно, многие пользователи CentOS 8, включая компании, рассчитывали на сопровождение со стороны разработчиков до 2029 года. Пользователей могла бы спасти миграция на CentOS Stream, но пока нет ясности в ее совместимости с RHEL.

В целом, не все так плохо и с оригинальным CentOS например, Facebook и Twitter продолжают верить в дистрибутив. Компании создали рабочую группу Hyperscale. Цель создание решений для больших инфраструктур на базе CentOS Stream и EPEL. Также группа проведет глобальное тестирование функциональных изменений в дистрибутиве, чтобы упростить процессы интеграции с другими системами. Так, планируется упростить внедрение режима COW (Copy-On-Write) в DNF и RPM.

Какие еще есть альтернативы для CentOS?



Во-первых, существует Oracle Linux. Компания Oracle 14 лет разрабатывает собственный клон RHEL. Его преимущества:

  • 100% совместим с RHEL на бинарном уровне;
  • разработан для гибридного облака;
  • автоматическое обновление Linux без перезагрузки;
  • оптимизирован для работы программного обеспечения Oracle.

Второй альтернативой можно рассмотреть Rocky Linux.

Система полностью управляется сообществом. Сейчас зарегистрировано 370 человек в качестве волонтеров. Создание Rocky Linux обусловлено также трансформацией CentOS. Наработки проекта планируют публиковать под лицензией BSD. Релиз запланирован на второй квартал 2021 года. Для сборочных процессов планируют использовать Koji, Mock и MBS из Fedora Linux.

Подробнее..

Есть ли жизнь после CentOS?

28.04.2021 10:12:44 | Автор: admin

Под конец и без того нелегкого 2020 года Red Hat преподнесла всем поклонникам CentOS весьма неожиданный подарок, объявив о радикальном сокращении EOL восьмой версии дистрибутива и последующем отказе от дальнейшего развития проекта. Пользователи операционной системы, на протяжении многих лет занимавшей третье место по популярности в мире, оказались на распутье. Что выбрать в такой ситуации? Стать вечным бета-тестером, перейдя на CentOS Stream? Выделить бюджет на покупку лицензии Red Hat Enterprise Linux? Или быть может попробовать одно из конкурирующих решений?

Хроника пикирующего дистрибутива: зачем убили CentOS?


В июле 2019 года руководство Red Hat объявило об официальном урегулировании всех формальностей, связанных с продажей бизнеса корпорации IBM. Финальная сумма сделки составила около 34 миллиардов долларов США, или $190 за каждую проданную акцию (при том, что на момент объявления о сделке бумаги торговались по $116). Как обычно и бывает в таких случаях, Red Hat клятвенно заверили сообщество, что присоединение к знаменитому IT-гиганту поможет привлечь дополнительные инвестиции и ресурсы, что даст возможность компании достичь новых вершин, и донести технологии Red Hat до еще более широкой аудитории, чем прежде. В свою очередь, лидеры разработки Fedora и CentOS поспешили заявить, что цели и модель управления проектами останутся неизменными, а Red Hat, как и ранее, продолжит активно участвовать в их развитии. И компания действительно сдержала свое слово, но лишь наполовину.


Кто-то всерьез полагал, что после поглощения Red Hat ничего не изменится?

В начале декабря 2020 года компания объявила о прекращении поддержки CentOS операционной системы, фактически являющейся бесплатной альтернативой Red Hat Enterprise Linux, великодушно предложив всем пользователям данного дистрибутива перейти на CentOS Stream. Больше всего эта новость ошарашила тех, кто уже успел мигрировать на CentOS 8: хотя поддержка восьмой версии операционной системы должна была завершиться лишь 31 мая 2029 года, первоначальный EOL ограничили 31 декабря 2021 года (то есть, обещанные 10 лет волшебным образом превратились в 2 года). Тем, кто использует CentOS 7, повезло значительно больше: сроки поддержки семерки оставили неизменными, так что операционная система продолжит получать критически важные апдейты до 2024 года. Впрочем, кто знает, что придет в голову Red Hat в ближайшем будущем?

Согласно официальной позиции компании, модель взаимодействия между пользователями и разработчиками программного обеспечения, которую олицетворяет собой CentOS, в современных реалиях уже не актуальна. И CentOS Stream является на сегодняшний день наиболее оптимальным и сбалансированным дистрибутивом, сочетая в себе инновации Fedora и стабильность Red Hat Enterprise Linux. Именно стремясь удовлетворить потребности сообщества, Red Hat приняли решение всецело сосредоточиться на поддержке данной версии дистрибутива, сделав CentOS Stream основным центром инноваций экосистемы RHEL.

Однако сообщество подобную заботу не оценило: на фоне новостей о прекращении дальнейшего развития оригинального дистрибутива CentOS стал стремительно терять позиции, модераторы тематического сабреддита добавили к прежнему названию приписку Corporate-driven (вместо community-driven), Not suitable for Enterprise, закрепив тред RIP CentOS, 20042020, журнал ZDNet, принадлежащий CBS Interactive, открыто высказал мнение, что отказ от поддержки CentOS является ничем иным, как частью продвижения RHEL, в сети появился лэндинг довольно ехидного содержания centos.rip (создание которого, кстати, приписывают Oracle главному конкуренту Red Hat, разрабатывающему собственный RH-based дистрибутив), а на change.org была опубликована петиция, авторы которой обратились к Red Hat с просьбой продолжить разработку CentOS в прежнем формате.


Кем бы ни были авторы centos.rip, ехидства им не занимать

Реакция Red Hat не заставила себя долго ждать: компания прислушалась к мнению сообщества, изменив правила использования Red Hat Enterprise Linux для разработчиков. Ранее в рамках программы Red Hat Developer действовало правило один разработчик одна лицензия, а сам дистрибутив можно было разворачивать только в локальном окружении. С 1 февраля 2021 года в программе могут участвовать целые команды, количество лицензий увеличилось с 1 до 16, к тому же новые условия EULA допускают установку ОС в инстансах публичных cloud-сервисов. Но, разумеется, только в целях разработки программного обеспечения: использование дистрибутива в продакшене обновленная лицензия по-прежнему не предусматривает.

Таким образом Red Hat прозрачно намекнула, что не намерена отклоняться от ранее избранного курса, чего и следовало ожидать. Вполне очевидно, что несмотря на первоначальное обещание сохранить созданную компанией модель разработки и поддерживать сложившуюся вокруг ее проектов экосистему, IBM увидела в CentOS прямую угрозу продажам RHEL. Отказ же от старой доброй CentOS позволяет убить не то что двух, а сразу трех зайцев:

  1. Часть пользователей из числа представителей крупного бизнеса наверняка предпочтет перейти на RHEL, что обеспечит дополнительную прибыль;
  2. Те, кто рискнет мигрировать на CentOS Stream, пополнят ряды бета-тестеров, а это поможет эффективнее обкатывать новые технологии и быстрее выявлять уязвимости в новых версиях пакетов;
  3. Освободившиеся ресурсы можно использовать для дальнейшего развития Red Hat Enterprise Linux, оставаясь в рамках прежнего бюджета на разработку.

Мотивы IBM понятны: даже для такой крупной корпорации 34 миллиарда долларов очень серьезная сумма, а предпринятые шаги помогут частично компенсировать затраты на покупку Red Hat уже в обозримом будущем за счет крупных корпоративных заказчиков. Но что же делать небольшим компаниям, которые попросту не могут себе позволить приобретение коммерческой лицензии RHEL?

Куда пойти, куда податься?


Древняя народная мудрость гласит: Лучший Linux тот, в котором разбирается ваш системный администратор. И с этим действительно трудно поспорить: хотя в основе UNIX-подобных операционных систем лежат одни и те же принципы, каждый дистрибутив имеет свои особенности, сильные и слабые стороны, знание которых во многом определяет эффективность работы с созданной на их основе IT-инфраструктурой. Если же ваша компания использует определенную операционную систему достаточно долго, у вас наверняка написаны сотни, а то и тысячи скриптов, заточенных под выбранную программную среду и являющихся неотъемлемой частью внутренних корпоративных сервисов, полное переписывание которых чревато серьезными финансовыми и временными затратами, не говоря уже о потенциальных убытках в том случае, если что-то пойдет не так.

В свете этого наиболее логичной стратегией становится миграция на дистрибутив, максимально близкий по архитектуре к исходному. И в случае с CentOS выбор оказывается не так уж и мал.

1. CentOS Stream



Пользователям CentOS 8 Red Hat предлагает мигрировать на CentOS Stream. Всерьез рассматривать перспективы использования данного дистрибутива в продакшене не получается, ведь если даже в релизные версии операционных систем периодически просачиваются баги и уязвимости, зачастую носящие критический характер, то что говорить о непрерывно обновляемой бете? Хотя чисто технически влиться в Поток предельно просто. Для этого достаточно выполнить в терминале всего три команды:

  1. Подключаем репозиторий CentOS Stream

# dnf install centos-release-stream

  1. Указываем новый репозиторий в качестве дефолтного

# dnf swap centos-{linux,stream}-repos

  1. Синхронизируем установленные пакеты

# dnf distro-sync

Поскольку отличия пакетной базы CentOS 8 и CentOS Stream на сегодняшний день минимальны, процедура миграции с вероятностью 99% пройдет безболезненно. Тем не менее, если речь идет не о нуждах разработки, а о комплексной IT-инфраструктуре, на которой завязана львиная доля бизнес-процессов предприятия, стоит присмотреться к чему-то более надежному. Например, к тому же Oracle Linux.

2. Oracle Linux



Фактически Oracle Linux представляет собой клон RHEL. Данная операционная система полностью совместима с CentOS на уровне двоичного кода. К тому же в декабре 2020 года компания Oracle представила удобный скрипт для миграции продакшн-систем, автоматически заменяющий специфичные для CentOS пакеты на эквивалентные из поставки Oracle Linux, и поддерживающий 6-ю, 7-ю и 8-ю версии ОС. Интересной особенностью данного скрипта является функция резервного копирования затронутых файлов, так что при возникновении любых проблем вы сможете откатить все внесенные изменения.

Разумеется, не могло обойтись и без некоторых ограничений:

  1. Скрипт обрабатывает только основные репозитории операционной системы. Подключение внешних репозиториев вроде EPEL для получения обновлений ранее установленных пакетов придется производить вручную;
  2. Совместимость с пакетами, полученными из сторонних репозиториев, не гарантируется. В частности, Oracle указывает на возможные конфликты, вызванные наличием файла /etc/oracle-release;
  3. После миграции могут перестать работать пакеты, использующие сторонние модули ядра и/или модули ядра с закрытым исходным кодом (к таковым относятся, например, коммерческие антивирусные приложения);
  4. Скрипт не поддерживает системы, в которых используются сторонние инструменты централизованного управления наподобие Foreman, Spacewalk или Uyni.

Впрочем, если сравнивать автоматическую миграцию с помощью готового скрипта на аналогичный дистрибутив с переездом на принципиальную иную ОС в ручном режиме, все перечисленное покажется не более, чем незначительными неудобствами. Ко всему прочему, Oracle Linux обладает рядом важных преимуществ:

  1. Дистрибутив полностью бесплатен и может использоваться в коммерческих проектах без каких-либо ограничений или дополнительного лицензирования;
  2. Бесплатная и коммерческая версии Oracle Linux отличаются друг от друга только наличием технической поддержки от специалистов корпорации, сами же дистрибутивы полностью идентичны и используют единый репозиторий, одновременно получая все выходящие обновления;
  3. Изменения в ядре Unbreakable Enterprise Kernel публикуются в Git-репозитории с разделением на отдельные патчи и детализацией внесенных изменений, что повышает прозрачность и предсказуемость поведения системы при ее обновлении;
  4. Oracle Linux поддерживает высокопроизводительную сетевую файловую систему Oracle Cluster File System 2 (OCFS2), позволяющую создавать разделяемые хранилища, используемые одновременно несколькими Linux-системами, что делает Oracle Linux весьма удобной для построения масштабируемых веб-серверов, кластерных баз данных, виртуализации и других аналогичных сценариев.

В свете всего перечисленного переход на Oracle Linux кажется наиболее правильным и логичным шагом. Однако если рассматривать перспективы миграции на данный дистрибутив в историческом контексте, все становится уже совсем не так однозначно. Дело в том, что и Oracle Linux, и CentOS в их современном виде являются плодом ожесточенной конкуренции между Red Hat и Oracle.

Еще в октябре 2006 года, на фоне анонса инициативы Unbreakable Linux, в рамках которой Oracle фактически предложила пользователям копию RHEL за вдвое более низкую цену, акции Red Hat упали на 28%, что вынудило компанию перейти к активным действиям. Ответным шагом стал перевод RHEL 6 на монолитное ядро, что фактически блокировало возможность использования наработок компании в сторонних дистрибутивах, сделав анализ примененных патчей излишне трудоемким. Технический директор Red Hat, Брайан Стивенс, тогда заявил:

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

Реакция Oracle не заставила себя долго ждать: компания открыла неограниченный доступ ко всем обновлениям Oracle Linux, включая errata и оперативные патчи безопасности, сформировав Git-репозиторий для отслеживания всех изменений, и начав весьма успешно переманивать пользователей CentOS, агитируя их переходить на бесплатный продукт enterprise-класса.

После этого Red Hat не оставалось ничего, кроме как возглавить разработку CentOS: в январе 2014 года компания объявила о начале прямого финансирования проекта, получив права на владение всеми товарными знаками.


Данный шаг позволил устранить основной недостаток операционной системы непредсказуемость процесса разработки. Инциденты вроде неожиданной пропажи Лэнса Дэвиса, одного из основателей проекта, и многомесячные перерывы в выпуске обновлений не добавляли CentOS популярности, заставляя сообщество склоняться в сторону более надежной альтернативы. Устранив перечисленные риски, Red Hat поставила под сомнение целесообразность использования Oracle Linux: и правда, в чем смысл работать с клоном, если можно получить качественный, полностью бесплатный продукт от создателей оригинальной RHEL, что называется, из первых рук?

На протяжении последующих 6 лет в противостоянии Red Hat и Oracle сохранялся паритет. Теперь же, когда столь сильный конкурент сошел с дистанции, дальнейший вектор развития Oracle Linux становится непредсказуем. Можно с уверенностью утверждать, что ближайшие 46 лет политика компании в отношении лицензирования операционной системы останется неизменной: сейчас для Oracle куда важнее расширить инсталляционную базу за счет бывших пользователей CentOS, нежели получить сиюминутную прибыль. В отсутствие же сильного конкурента корпорация может начать, по примеру Red Hat, обкатывать обновления на пользователях бесплатной версии ОС. Подобный сценарий вполне реален, если только в ближайшие годы на рынке не появится достойная альтернатива.

3. AlmaLinux



И таковой вполне может оказаться AlmaLinux. Появление данного проекта стало ответной реакцией CloudLinux на преждевременное прекращение поддержки CentOS 8. Компания планирует выделять на разработку операционной системы по 1 миллиону долларов в год из собственных доходов.

AlmaLinux следует базовым принципам CentOS: дистрибутив формируется путем пересборки пакетной базы RHEL, сохраняя бинарную совместимость с оригинальной операционной системой, что позволяет пользователям CentOS 8 легко и безболезненно перевести IT-инфраструктуру на новые рельсы. В дальнейшем развивать проект планируется с привлечением сообщества, при этом будет использоваться модель управления, аналогичная той, что применяется при разработке Fedora. Для этих целей создана отдельная некоммерческая организация AlmaLinux OS Foundation.

Первый стабильный выпуск AlmaLinux увидел свет 30 марта этого года. Дистрибутив бесплатен для всех категорий пользователей, включая корпоративных. В настоящее время для загрузки доступны сборки для архитектуры x86_64, однако в скором времени разработчики обещают подготовить ARM-версии операционной системы. Дистрибутив полностью идентичен по функциональности с RHEL 8.3, которая лежит в его основе, за исключением отсутствия ряда специфических для Red Hat Enterprise Linux пакетов (например, redhat-*, insights-client и subscription-manager-migration*). CloudLinux обещает поддерживать текущую версию AlmaLinux до 2029 года. Как и в случае с Oracle Linux, для простой и прозрачной миграции с CentOS 8 разработчики операционной системы подготовили удобный автоматизированный скрипт.

Если рассуждать о перспективах данного проектах, то AlmaLinux имеет неплохие шансы занять вакантное место CentOS, благо команда CloudLinux, насчитывающая на сегодняшний день более сотни IT-специалистов, обладает вполне достаточным опытом разработки и сопровождения RH-based проектов, ведь флагманский продукт компании основан на пакетной базе RHEL. Ребята уже наглядно продемонстрировали, на что способны, представив первый стабильный билд операционной системы спустя всего 4 месяца после анонса, и если так пойдет и дальше, они вполне смогут составить достойную конкуренцию Oracle.

4. Rocky Linux



В нашем списке Rocky Linux является наиболее неоднозначным кандидатом на замену CentOS. Хотя бы потому, что сам по себе продукт все еще не добрался до релиза, а значит и судить о его перспективности можно лишь опираясь на факты, известные о самих авторах инициативы и их партнерах. С первого взгляда все выглядит достаточно вкусно:

  • Разработку Rocky Linux возглавляет компания Ctrl IQ стартап основателя CentOS Грегори Курцера;
  • Компания заручилась поддержкой инвесторов в лице венчурного фонда IAG Capital Partners и одного из крупнейших поставщиков гипермасштабируемых систем хранения данных OpenDrives, по итогам переговоров с которыми на разработку операционной системы удалось привлечь $4 млн;
  • В число ключевых спонсоров проекта входят корпорация Amazon, предоставившая команде Ctrl IQ необходимые для разработки и сборки дистрибутива вычислительные мощности в облаке AWS, и MontaVista Software, имеющая более, чем 20-летний опыт разработки программного обеспечения с открытым исходным кодом, ориентированного на нужды корпоративных клиентов.

Rocky Linux позиционируется, как полностью бесплатная RH-based операционная система, демонстрирующая уровень стабильности enterprise-класса и пригодная для использования в рабочих проектах. Согласно заявлению Курцера, новый дистрибутив, основанный на исходном коде RHEL, продолжит традиции оригинального CentOS, а его разработка останется полностью прозрачна для сообщества, которое и будет определять генеральный вектор развития проекта. При этом Ctrl IQ не рассматривает Rocky Linux в качестве источника дохода. Компания планирует зарабатывать на предоставлении корпоративным заказчикам инфраструктуры для высокопроизводительных вычислений под ключ, направляя часть вырученных средств на базовые расходы по разработке и юридической поддержке проекта.

Rocky Linux находится лишь в начале своего пути, поэтому говорить о надежности новой операционной системы пока еще рано. Как рано рассуждать и о том, насколько конкурентоспособным окажется бизнес Ctrl IQ, ведь из четырех компонентов технологического стека HPC в настоящее время можно пощупать лишь Warewulf набор инструментов для управления высокопроизводительными кластерами Linux. Впрочем, ждать осталось совсем недолго: выход первого релиз-кандидата Rocky Linux запланирован на 30 апреля 2021 года.


Время для принятия взвешенного решения все еще есть. Даже если вы используете CentOS 8, оставшиеся месяцы вполне достаточный срок для того, чтобы определиться с выбором дистрибутива и спланировать стратегию миграции IT-инфраструктуры на новую платформу. Те же, кто остался на CentOS 7, имеют отличную возможность оценить, на что в действительности способны команды разработчиков AlmaLinux и Rocky Linux и сделать осознанный выбор в пользу той или иной операционной системы, опираясь не на обещания, а на реальные кейсы.

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



Наши серверы можно использовать для разработки и хостинга сайтов.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru