Запросить демо
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Дополнительные услуги
Оставить заявку
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Узнать стоимость
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Дополнительные услуги
Попробовать бесплатно
Я подтверждаю свое согласие на обработку компанией КРОК моих персональных данных, указанных в форме, в целях и пределах, установленных законодательством РФ о персональных данных в рамках проводимых мероприятий в течение неопределенного срока
Дополнительные услуги
Быть в теме

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

25.06.2018 10 минут 2607

В этой статье мы установим минимальный 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.

Сервисы упоминаемые в статье

  1. Публичное облако КРОК

Не пропустите самые важные, интересные и полезные статьи недели

Ваш e-mail успешно подписан.

Смотрите также