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