Kubernetes - установка минимального кластера на CentOS
О технологиях

Kubernetes - установка минимального кластера на CentOS

9531
9 минут

В этой статье мы установим минимальный Kubernetes кластер на CentOS 7 в Облаке КРОК.

Причем, предполагается установка и настройка Kubernetes кластера исключительно в ручном режиме, чтобы у вас появилось представление о взаимосвязях компонент кластера. Само собой, в одной из следующих статей будет показано, как автоматизировать эту установку. Пакет Kubernetes предоставляет несколько сервисов: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet и kube-proxy. Эти службы управляются systemd и все конфигурационные файлы будут находиться в едином месте: /etc/kubernetes. Все сервисы будут распределены по хостам соответственно их ролям:

  • master-1, будет мастер-сервером Kubernetes. На нем будут запущены kube-apiserver, kube-controller-manager и kube-scheduler. Кроме того, на мастере также будет работать etcd.
  • minion-1, будет вычислительным сервером, на котором будут запускаться контейнеры. На нем будут запущены kubelet, proxy, cadvisor и docker. Кроме того, на этом сервере будет запущен flannel для работы overlay сети.

Требования

  • Образ ВМ на базе CentOS
  • Облако КРОК или другая облачная платформа
  • Базовые знания о сущностях Kubernetes (описаны в статье Kubernetes: введение)

    Схема подключения виртуальных машин представлена на картинке в начале статьи.

Установка кластера

Общие действия После старта виртуальных машин, необходимо отключить обновление имени виртуального сервера утилитой cloud-init. Для этого отредактируйте файл /etc/cloud/cloud.cfg и закомментируйте в секции cloud_init_modules следующие строчки:


cloud_init_modules:

- migrator

- bootcmd

- write-files

- growpart

- resizefs

# - set_hostname

# - update_hostname

# - update_etc_hosts

- rsyslog

- users-groups

- ssh

Установите имя каждого сервера, выполнив команду:


$ sudo hostnamectl set-hostname master-1.avmaksimov.ru

или


$ sudo hostnamectl set-hostname minion-1.avmaksimov.ru

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


master-1.avmaksimov.ru
minion-1.avmaksimov.ru

Для того, чтобы узлы кластера могли обращаться друг к другу по имени, на каждом хосте необходимо добавить следующую информацию в /etc/hosts:


$ sudo bash -c 'cat <> /etc/hosts

192.168.0.4 master-1

192.168.0.5 minion-1

EOF'

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


$ sudo yum -y update

Подключите репозиторий virt7-docker-common-release:


$ sudo bash -c 'cat < /etc/yum.repos.d/virt7-docker-common-release.repo

[virt7-docker-common-release]

name=virt7-docker-common-release

baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/

gpgcheck=0

EOF'

Установите Kubernetes, etcd и flannel:


$ sudo yum -y install --enablerepo=virt7-docker-common-release kubernetes etcd flannel

Отредактируйте конфигурационный файл /etc/kubernetes/config (он будет одинаковым на всех хостах):Б.зЮ


# Разделенный запятыми список узлов в etcd кластере

KUBE_ETCD_SERVERS="--etcd-servers=http://master-1:2379"

# Логирование на stderr, чтобы получить логи в журнале systemd

KUBE_LOGTOSTDERR="--logtostderr=true"

# Уровень логирования для Kubernetes, 0 - debug

KUBE_LOG_LEVEL="--v=0"

# Разрешить ли этому кластеру запуск привилегированных Docker контейнеров? Нет.

KUBE_ALLOW_PRIV="--allow-privileged=false"

# Как replication controller и scheduler будут находить kube-apiserver

KUBE_MASTER="--master=http://master-1:8080"

$ sudo bash -c 'cat < /etc/kubernetes/config

KUBE_ETCD_SERVERS="--etcd-servers=http://master-1:2379"

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=0"

KUBE_ALLOW_PRIV="--allow-privileged=false"

KUBE_MASTER="--master=http://master-1:8080"

EOF'

Disable the firewall on the master and all the nodes, as docker does not play well with other firewall rule managers. CentOS won’t let you disable the firewall as long as SELinux is enforcing, so that needs to be disabled first.

Необходимо отключить фаервол на master-1 и minion-1, так как Docker не очень хорошо работает с другими менеджерами фаервола. CentOS не позволит вам отключить фаервол до тех пор, как SELinux находится в режиме enforcing, так что необходимо отключить его в первую очередь.


$ sudo setenforce 0

$ sudo systemctl disable iptables-services firewalld

$ sudo systemctl stop iptables-services firewalld

Настройка сервисов Kubernetes на мастере (master-1)

Отредактируйте /etc/etcd/etcd.conf так, чтобы его содержание было следующим:


# [member]

ETCD_NAME=default

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

#[cluster]

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.4:2379"

$ sudo bash -c 'cat < /etc/etcd/etcd.conf

# [member]

ETCD_NAME=default

ETCD_DATA_DIR="/var/lib/etcd/default.etcd"

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

#[cluster]

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.0.4:2379"

EOF'

Отредактируйте /etc/kubernetes/apiserver так, чтобы его содержание было следующим:


# Адрес, на котором слушает apiserver

KUBE_API_ADDRESS="--address=0.0.0.0"

# Порт, на котором слушает apiserver

KUBE_API_PORT="--port=8080"

# Порт, на котором слушает kubelet

KUBELET_PORT="--kubelet-port=10250"

# Адресное пространство, которое будет использоваться под сервисы (services)

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# Здесь можно добавить свои собственные параметры

KUBE_API_ARGS=""

$ sudo bash -c 'cat < /etc/kubernetes/apiserver

KUBE_API_ADDRESS="--address=0.0.0.0"

KUBE_API_PORT="--port=8080"

KUBELET_PORT="--kubelet-port=10250"

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

KUBE_API_ARGS=""

EOF'

Запустить ETCD и настроить его на хранение конфигурации overlay сети на мастер-сервере. Предупреждение: Эта сеть не должна использоваться в вашей сетевой инфраструктуре! Например, 172.30.0.0/16 свободна в нашей сети.


$ sudo systemctl start etcd

$ sudo etcdctl mkdir /kube-centos/network

$ sudo etcdctl mk /kube-centos/network/config "{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }"

Настроим flannel для поддержки Docker overlay сети отредактировав файл /etc/sysconfig/flanneld:


# Настройки flanneld

# etcd url: указывает на сервер, на котором запущен etcd (в нашем случае master-1)

FLANNEL_ETCD_ENDPOINTS="http://master-1:2379"

# Ключ настроек в etcd. Это тот ключ настроек, по которому будет искаться информация о overlay сети

FLANNEL_ETCD_PREFIX="/kube-centos/network"

# Любые другие дополнительные опции

#FLANNEL_OPTIONS=""

$ sudo bash -c 'cat < /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://master-1:2379"

FLANNEL_ETCD_PREFIX="/kube-centos/network"

EOF'

Запустим все нужные для работы Kubernetes сервисы:


$ sudo bash -c '

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do

       systemctl restart $SERVICES

       systemctl enable $SERVICES

       systemctl status $SERVICES

done

'

Настройка сервисов Kubernetes на миньоне (minion-1)

Все, что нужно сделать на миньоне — это настроить kubelet и запустить его вместе с proxy сервисом.

Отредактируйте /etc/kubernetes/kubelet так, чтобы его содержание было следующим:


# Адрес, на котором будет слушать kubelet

KUBELET_ADDRESS="--address=0.0.0.0"

# Порт, на котором будет слушать kubelet

KUBELET_PORT="--port=10250"

# Вы можете оставить это поле пустым, или же указать имя хоста миньона

# Check the node number!

KUBELET_HOSTNAME="--hostname-override=minion-1"

# Расположение api-server

KUBELET_API_SERVER="--api-servers=http://master-1:8080"

# Здесь можно добавить дополнительные флаги

KUBELET_ARGS=""

$ sudo bash -c 'cat < /etc/kubernetes/kubelet

KUBELET_ADDRESS="--address=0.0.0.0"

KUBELET_PORT="--port=10250"

KUBELET_HOSTNAME="--hostname-override=minion-1"

KUBELET_API_SERVER="--api-servers=http://master-1:8080"

KUBELET_ARGS=""

EOF'

Настроим flannel для поддержки Docker overlay сети, отредактировав файл /etc/sysconfig/flanneld:


# Настройки flanneld

# etcd url: указывает на сервер, на котором запущен etcd (в нашем случае master-1)

FLANNEL_ETCD_ENDPOINTS="http://master-1:2379"

# Ключ настроек в etcd. Это тот ключ настроек, по которому будет искаться информация о overlay сети

FLANNEL_ETCD_PREFIX="/kube-centos/network"

# Любые другие дополнительные опции

#FLANNEL_OPTIONS=""

$ sudo bash -c 'cat < /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://master-1:2379"

FLANNEL_ETCD_PREFIX="/kube-centos/network"

EOF'

Запустим все нужные для работы Kubernetes сервисы:


$ sudo bash -c '

for SERVICES in kube-proxy kubelet flanneld docker; do

    systemctl restart $SERVICES

    systemctl enable $SERVICES

    systemctl status $SERVICES

done

'

Настройка утилиты управления Kubectl

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


$ kubectl config set-cluster default-cluster --server=http://master-1.avmaksimov.ru:8080

$ kubectl config set-context default-context --cluster=default-cluster --user=default-admin

$ kubectl config use-context default-context

Теперь все готово к работе в вашим новым кластером. Давайте проверим, что он настроен и видит подключенного к нему миньона. С локального рабочего места, где вы настраивали kubectl, выполните команду:


$ kubectl get nodes

NAME       STATUS    AGE

minion-1   Ready     12m

Теперь вы можете запустить ваш первый тестовый Pod.

19 октября 2023
Контейнеры: технологии и процессы глазами разработчика

В выпуске#9 видеоподкаста «Откровенно об ИТ-инфраструктуре» поговорили о роли контейнеров в разработке. Приглашенные эксперты обсудили специфику использования Kubernetes и сокращение time-to-market в контексте контейнеризации.

В гостях Михаил Гудов, Orion soft, и Василий Колосов, Smartex.
1 минута
782
19 июня 2023
Семь трендов на рынке облачных услуг в 2023 году
До 2022 года на рынке облаков в России главенствовали мировые тренды, но сейчас наша страна пошла своим путем. О том, для чего сейчас компании используют облачные технологии и как меняется рынок, рассказал директор по развитию КРОК Облачные сервисы Сергей Зинкевич.
1 минута
2191
16 июня 2023
Рулевой в океане контейнеров
Выпуск#3 видеоподкаста «Откровенно об ИТ-инфраструктуре» посвящен Kubernetes и профессиональным платформам оркестрации контейнеров. Обсудили, как сегодня складывается ситуация на российском рынке контейнерных платформ, что востребовано и почему, особенности и перспективы работы с Kubernetes.

В гостях Александр Баталов, Генеральный директор Флант
1 минута
1508
29 марта 2023
Сетевые балансировщики нагрузки и другие обновления Облака КРОК

Мы рады вам представить новый сервис Облака КРОК для распределения трафика между экземплярами – Балансировщики нагрузки. Кроме того, мы автоматизировали обновление сертификатов Kubernetes и добавили возможность удаления рабочих узлов из кластера Kubernetes.

2 минуты
916
13 февраля 2023
Замена игрока: выбираем альтернативу зарубежному системному ПО (взгляд облачного провайдера)

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

Предлагаем вашему вниманию запись и расшифровку митапа.

2 минуты
2180
scrollup