Руководство по kubernetes, часть 2: создание кластера и работа с ним

Кластеры работают как часы

Кластер заказчика при использовании подхода «Kubernetes как услуга» постоянно мониторится силами «Фланта», поддерживается в работоспособном состоянии, чинится в случае любых проблем, обновляется для поддержания высокого уровня безопасности и внедрения новых функций. Для пользователя все работает как часы, а за механизмами этих часов следит поставщик услуги.

«Вне зависимости от размера бизнеса, компании смотрят не на голый Kubernetes. В отличие от типовых managed-решений, мы предлагаем в кластерах многочисленные (50+) компоненты, уже настроенные, интегрированные между собой и сразу готовые к работе. Они предназначены для решения вопросов и масштабирования, и балансировки трафика, и мониторинга, и безопасности, и других аспектов. При этом они доступны во всех Kubernetes-кластерах вне зависимости от выбранной инфраструктуры (облачные провайдеры, железные серверы, виртуальные машины). Те, кто уже пробовал эксплуатировать Kubernetes, поймут, сколько головной боли снимается тем, что Kubernetes будет сам обновляться на новые версии и при этом будут решены все проблемы совместимости релизов его компонентов», — добавляет Дмитрий Шурупов.

«В нашем Kubernetes будет работать автоскейлинг, компоненты подготовлены для запуска приложений в production. Это означает, например, что в кластере сразу доступны для использования метрики и графики для них, мониторинг ключевых показателей для конечных приложений… Ключ в том, что это не просто набор каких-то возможностей «для галочки», а специально отобранные, действительно нужные, полезные в работе реализации, «выстраданные» на основе большого опыта обслуживания разных проектов в реальных условиях. Для апдейтов, которые выходят довольно часто, пользователям не придется продумывать план каждого обновления, проводить тестирование, так как они получат это автоматически в работоспособном состоянии», — объяснил Дмитрий Столяров.

Основные программные компоненты, предварительно установленные и настроенные в кластерах Kubernetes от «Фланта»

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

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

Жизненный цикл программного обеспечения: от планирования и написания кода — к эксплуатации и мониторингу

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

«Managed-решение, или использование Kubernetes как услуги, стоит от 40 тыс. рублей за первый кластер, от 25 — за последующий. В таких условиях использование Kubernetes становится очень доступным для небольших компаний, кто раньше купить полноценную, всеобъемлющую поддержку не имел возможности», — отметил Александр Баталов.

Манипуляции с текстом

<box 100% round left |>
cat file_originale | > result.txt — общий синтаксис выполнения действий по обработке содержимого файла и вывода результата в новыйcat file_originale | » result.txt — общий синтаксис выполнения действий по обработке содержимого файла и вывода результата в существующий файл. Если файл не существует, он будет созданgrep Aug /var/log/messages — из файла ‘/var/log/messages’ отобрать и вывести на стандартное устройство вывода строки, содержащие «Aug»grep ^Aug /var/log/messages — из файла ‘/var/log/messages’ отобрать и вывести на стандартное устройство вывода строки, начинающиеся на «Aug»grep /var/log/messages — из файла ‘/var/log/messages’ отобрать и вывести на стандартное устройство вывода строки, содержащие цифрыgrep Aug -R /var/log/* — отобрать и вывести на стандартное устройство вывода строки, содержащие «Augr», во всех файлах, находящихся в директории /var/log и нижеsed ‘s/stringa1/stringa2/g’ example.txt — в файле example.txt заменить «string1» на «string2», результат вывести на стандартное устройство вывода.sed ‘/^$/d’ example.txt — удалить пустые строки из файла example.txtsed ‘/ *#/d; /^$/d’ example.txt — удалить пустые строки и комментарии из файла example.txtecho ‘esempio’ | tr » » — преобразовать символы из нижнего регистра в верхнийsed -e ‘1d’ result.txt — удалить первую строку из файла example.txtsed -n ‘/string1/p’ — отобразить только строки содержашие «string1»sed -e ‘s/ *$//’ example.txt — удалить пустые символы в в конце каждой строкиsed -e ‘s/string1//g’ example.txt — удалить строку «string1» из текста не изменяя всего остальногоsed -n ‘1,8p;5q’ example.txt — взять из файла с первой по восьмую строки и из них вывести первые пятьs -n ‘5p;5q’ example.txt — вывести пятую строкуsed -e ‘s/0*/0/g’ example.txt — заменить последовательность из любого количества нулей одним нулёмcat -n file1 — пронумеровать строки при выводе содержимого файлаcat example.txt | awk ‘NR%2==1’ — при выводе содержимого файла, не выводить чётные строки файлаecho a b c | awk ‘{print $1}’ — вывести первую колонку. Разделение, по-умолчанию, по проблелу/пробелам или символу/символам табуляцииecho a b c | awk ‘{print $1,$3}’ — вывести первую и треью колонки. Разделение, по-умолчанию, по проблелу/пробелам или символу/символам табуляцииpaste file1 file2 — объединить содержимое file1 и file2 в виде таблицы: строка 1 из file1 = строка 1 колонка 1-n, строка 1 из file2 = строка 1 колонка n+1-mpaste -d ‘+’ file1 file2 — объединить содержимое file1 и file2 в виде таблицы с разделителем «+»sort file1 file2 — отсортировать содержимое двух файловsort file1 file2 | uniq — отсортировать содержимое двух файлов, не отображая повторовsort file1 file2 | uniq -u — отсортировать содержимое двух файлов, отображая только уникальные строки (строки, встречающиеся в обоих файлах, не выводятся на стандартное устройство вывода)sort file1 file2 | uniq -d — отсортировать содержимое двух файлов, отображая только повторяющиеся строкиcomm -1 file1 file2 — сравнить содержимое двух файлов, не отображая строки принадлежащие файлу ‘file1’comm -2 file1 file2 — сравнить содержимое двух файлов, не отображая строки принадлежащие файлу ‘file2’comm -3 file1 file2 — сравнить содержимое двух файлов, удаляя строки встречающиеся в обоих файлах

</box>

Deploy реального приложения в кластер

Давайте теперь на реальном примере попробуем что-то запустить в кластере kubernetes. Я предлагаю для этого использовать демо магазин носков из этого репозитория — https://github.com/microservices-demo/microservices-demo. Там есть длиннющий yaml файл, который содержит в себе все необходимое (deployments, service и т.д.) для запуска магазина. Магазин состоит из множества компонентов, так что мы на практике убедимся, как легко и быстро можно деплоить сложные приложения в кластер.

Магазин настроен на работе в отдельном namespace — sock-shop. Его предварительно надо создать.

# kubectl create namespace sock-shop

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

# kubectl apply -n sock-shop -f "https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/kubernetes/complete-demo.yaml"

Наблюдать за поднятием подов можно командой в реальном времени.

# kubectl get pods -n sock-shop -w

После того, как они все станут Running можно проверять работу. В этом проекте не используется ingress, поэтому чтобы понять, как подключиться к магазину, надо провести небольшое расследование. Для начала посмотрим запущенные service.

# kubectl get service -n sock-shop -o wide

Нас интересует тип NodePort, так как к нему можно подключаться из вне. Видим, что порт используется 30001 и имя приложения front-end. Посмотрим, где оно запущено.

# kubectl get pod -n sock-shop -o wide

Этот pod запущен на kub-node-2. Посмотрим ее ip.

# kubectl get node -o wide

Ее ip адрес — 10.1.4.33. Значит для проверки магазина надо идти по урлу http://10.1.4.33:30001/

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

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-sock
  namespace: sock-shop
spec:
  rules:
  - host: sock-shop.cluster.local
    http:
      paths:
      - backend:
          serviceName: front-end
          servicePort: 80

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

# kubectl apply -f ingress-sock.yaml

Смотрим, что получилось.

# kubectl get ingress -n sock-shop -o wide
NAME           HOSTS                     ADDRESS     PORTS   AGE
ingress-sock   sock-shop.cluster.local   10.1.4.39   80      29s

Редактируем файл hosts и идем в браузер проверять.

Поздравляю, ваш кластер работает, а вы теперь администратор кластера Kubernetes и инженер yaml файлов :) У вас теперь будет большая дружба с лапшеподобным синтаксисом. Идите к руководству и требуйе прибавки к зарплате минимум на 30%.

Если лимит памяти не задан

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

  • У контейнера отсутствует верхняя граница для памяти, которую он может использовать.
    Такой контейнер может занять всю память, доступную на ноде, где он запущен, что, в свою очередь, может вызвать OOM Killer.
    Также контейнеры без ограничений по ресурсам имеют более высокие шансы быть убитыми в случае вызова OOM Kill.

  • Контейнер запущен в пространстве имён, в котором настроена величина ограничений по умолчанию.
    Тогда контейнеру автоматически присваивается это стандартное значение лимита.
    Администраторы кластера могут использовать

    для задания стандартной величины ограничений по памяти.

Отображение больших блоков текстовых данных в скрипте

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

  cat <<HELPEOF
  Usage:
   opt1 : Do this
   opt2 : Do that
  HELPEOF

cat <<HELPEOF
Usage:
opt1 : Do this
opt2 : Do that
HELPEOF

Другой рабочий пример:

#!/bin/bash
# Author: Vivek Gite <http://www.cyberciti.biz/
# -----------------------------------------------
 
#Set default to my-dev-box
BASEDIR="/home/vivek/projects/bash/nginx-keepalived/chroot"  
 
# Now switch to prod 
 $HOSTNAME == "lb2.nixcraft.net.in"  && BASEDIR="/etc/nixcraft/nginx/lb2"
 $HOSTNAME == "lb2.nixcraft.net.in"  && BASEDIR="/etc/nixcraft/nginx/lb1"
 
_profile="$BASEDIR/redhat.conf"
_etc_files="$BASEDIR/redhat.etc.files.conf"
_etc_dirs="$BASEDIR/redhat.etc.dirs.conf"
_hooks="$BASEDIR/hooks.sh"
 
usage(){
cat<<EOF
 Usage $0
  -e | --enable:        Enable the nginx-chroot environment
  -E | --upgrade:       Upgrade bind and libs in the nginx-chroot environment
  -p | --php:           Enable the php-cgi in the nginx-chroot environment
  -P | --phpupgrade:    Upgrade the php-cgi in the nginx-chroot environment
  -i | --info:          Display the php-cgi and nginx environment information such as version, users, connections etc
EOF
}
 
rootuser(){
        local uid=$(id -u)
         $uid -ne   && { echo "Only root may enable the nginx-chroot environment to the system."; exit 2; }
}
 
## function code removed to keep script short and sweet ##
enable_nginix_chroot(){
  :
}
upgrade_nginx_chroot(){
  :
}
enable_php_cgi_nginx_chroot(){
  :
}
upgrade_php_cgi_nginx_chroot(){
  :
}
 
get_nginx_chroot_info(){
  :
}
 
# Make sure only root run this script
rootuser
 
# Load local hooks
 -f "${_hooks}"  && . ${_hooks}
 
# Load os specifc paths
source ${_profile}
 
# Main logic 
case $1 in
    -e|--enable)    enable_nginix_chroot ;;
    -E|--upgrade)   upgrade_nginx_chroot;;
    -p|--php)       enable_php_cgi_nginx_chroot;;      
    -P|--phpupgrade)  upgrade_php_cgi_nginx_chroot;;      
    -i|--info)          get_nginx_chroot_info;;      
    *)            usage; exit 9999;
esac

#!/bin/bash
# Author: Vivek Gite <http://www.cyberciti.biz/
# ———————————————— #Set default to my-dev-box
BASEDIR=»/home/vivek/projects/bash/nginx-keepalived/chroot» # Now switch to prod
] && BASEDIR=»/etc/nixcraft/nginx/lb2″
] && BASEDIR=»/etc/nixcraft/nginx/lb1″ _profile=»$BASEDIR/redhat.conf»
_etc_files=»$BASEDIR/redhat.etc.files.conf»
_etc_dirs=»$BASEDIR/redhat.etc.dirs.conf»
_hooks=»$BASEDIR/hooks.sh» usage(){
cat<<EOF
Usage $0
-e | —enable: Enable the nginx-chroot environment
-E | —upgrade: Upgrade bind and libs in the nginx-chroot environment
-p | —php: Enable the php-cgi in the nginx-chroot environment
-P | —phpupgrade: Upgrade the php-cgi in the nginx-chroot environment
-i | —info: Display the php-cgi and nginx environment information such as version, users, connections etc
EOF
} rootuser(){
local uid=$(id -u)
] && { echo «Only root may enable the nginx-chroot environment to the system.»; exit 2; }
} ## function code removed to keep script short and sweet ##
enable_nginix_chroot(){
:
}
upgrade_nginx_chroot(){
:
}
enable_php_cgi_nginx_chroot(){
:
}
upgrade_php_cgi_nginx_chroot(){
:
} get_nginx_chroot_info(){
:
} # Make sure only root run this script
rootuser # Load local hooks
&& . ${_hooks} # Load os specifc paths
source ${_profile} # Main logic
case $1 in
-e|—enable) enable_nginix_chroot ;;
-E|—upgrade) upgrade_nginx_chroot;;
-p|—php) enable_php_cgi_nginx_chroot;;
-P|—phpupgrade) upgrade_php_cgi_nginx_chroot;;
-i|—info) get_nginx_chroot_info;;
*) usage; exit 9999;
esac

Приложения и экземпляры приложений

Одно и то же приложение может быть установлено несколько раз в кластер Kubernetes, в ряде случаев — в одинаковое пространство имен. Например, WordPress может быть установлен более одного раза, тогда каждый из сайтов будет иметь собственный установленный экземпляр WordPress.

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

Kubernetes требует сноровки

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

По данным GitHub за 2019 г., Kubernetes входит в десятку Open Source-проектов в мире по количеству контрибьюторов

«Многие компании присматриваются к Kubernetes и часто заблуждаются. Например, предприятие использует старое, ужасное «разваливающееся» приложение, а для его модернизации предлагает сверху поставить Kubernetes. Якобы, все самостоятельно масштабируется, автоматом повышается отказоустойчивость, а релизы будут доходить до конечных потребителей быстрее. Это так не работает. Для достижения эффекта нужно уметь «приготовить» Kubernetes, а зачастую потребуется еще и адаптация самого приложения», — объясняет Дмитрий Шурупов.

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

«Некоторые из тех, кто уже наслышан о Kubernetes, ошибочно полагают, что это библиотека, которую можно быстро прикрутить и за неделю, максимум — за месяц, все заработает как часы», — добавляет Дмитрий Столяров, технический директор, сооснователь компании «Флант».

Как работает технология

Принципы устройства

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

Помимо этого, в Kubernetes могут быть задействованы императивные команды (create, edit, delete), которые позволяют непосредственно создавать, модифицировать и удалять ресурсы. Однако, их не рекомендуется использовать для критически важных задач.

Для развертывания программного обеспечения в Kubernetes применяется база Linux-контейнеров (например, Containerd или CRI-O) и описание — сколько потребуется контейнеров и в каком количестве им потребуются ресурсы. Само развертывание контейнеров происходит на основе рабочих нод — виртуальных или физических машин.

Основные задачи Kubernetes

  1. Развертывание контейнеров и все операции для запуска необходимой конфигурации. В их число входят перезапуск остановившихся контейнеров, их перемещение для выделения ресурсов на новые контейнеры и другие операции.
  2. Масштабирование и запуск нескольких контейнеров одновременно на большом количестве хостов.
  3. Балансировка множества контейнеров в процессе запуска. Для этого Kubernetes использует API, задача которого заключается в логическом группировании контейнеров. Это дает возможность определить их пулы, задать им размещение, а также равномерно распределить нагрузку.

Преимущества K8s

  • Обнаружение сервисов и балансировка нагрузок. Контейнеры могут работать через собственные IP-адреса или использовать общее имя DNS для целой группы. K8s может регулировать нагрузку сетевого трафика и распределять его, чтобы поддержать стабильность развертывания.
  • Автоматическое управление хранилищами. Пользователь может задавать, какое хранилище использовать для развертывания по умолчанию — внутреннее, внешнего облачного провайдера (GKE, Amazon EKS, AKS), другие варианты.
  • Автоматическое внедрение и откат изменений. Пользователь может на лету делать любые дополнения к текущей конфигурации контейнеров. Если это нарушит стабильность развертывания, K8s самостоятельно откатит изменения до стабильно работающей версии.
  • Автоматическое распределение ресурсов. Kubernetes сам распределяет пространство и оперативную память из выделенного кластера нод, чтобы обеспечить каждый контейнер всем необходимым для работы.
  • Управление паролями и настройками. K8s может служить приложением для безопасной обработки конфиденциальной информации, связанной с работой приложений — паролей, OAuth-токенов, SSH-ключей. В зависимости от способа применения, данные и настройки можно обновлять без создания контейнера заново.
  • Самовосстановление при возникновении сбоя. С помощью особых метрик и тестов система может быстро опознать поврежденные или переставшие отвечать на запросы контейнеры. Вышедшие из строя контейнеры создаются заново и перезапускаются на том же поде.

Kubernetes – удобный инструмент оркестрации контейнеров. Однако, это решение, не работает само по себе, без подготовки и дополнительных настроек.  Например, пользователям придется решать вопросы по миграции схем баз данных или разбираться с обратной совместимостью API.

Проверьте, установлен ли Python.

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

Выполните следующие команды, чтобы найти установленное местоположение Python.

$ which python3

или же

$ type -a python3

Вывод:

python3 is/usr/bin/python3
python3 is/bin/python3

или же

$ ls -l/usr/bin/python
$ ls -l/usr/local/bin

Запустите команду, чтобы проверить версию Python:

$ python3 --version

Простая команда запуска python3:

$ python3
Python 3.8.2 (default, Jul 16 2020, 14:00:26)
 on linux
Type "help", "copyright", "credits" or "license" for more information.

Если вы не нашли установленный python, в следующем разделе я покажу вам, как установить python.

Установите Python в Ubuntu/Debian

Debian, Ubuntu и производные от них дистрибутивы поставляются с предустановленным python. Если он поврежден или не установлен, используйте следующую команду.

Чтобы установить python 2, введите:

$ sudo apt install python
After January 1, 2020 Python 2 no longer receives any updates, and recommend not using it.

или же

Чтобы установить python 3, введите:

$ sudo apt install python3

Python установлен из исходников, по умолчанию установлен в http://usr/local/bin/. В этом случае при вводе python в консоли будет выполняться не тот, который находится внутри /usr/local/bin/, а тот, который находится внутри/usr/bin/.

Если вы хотите выполнить тот, который находится внутри /usr/local/bin/, вы можете легко настроить систему, используя псевдоним. Псевдоним следует поместить в файл.bashrc, как показано ниже.

alias python=/usr/local/bin/python3.9

Благодаря диспетчеру пакетов dnf вы можете легко установить python в Fedora:

$ sudo dnf установить python38

Установите Python на RHEL/CentOS

Чтобы установить Python на RHEL, Oracle Linux и CentOS, используйте команду yum следующим образом:

$ sudo yum установить python
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: