Привет! Я Саша Хренников — руководитель DevOps-юнита в KTS.
На прошлой неделе завершился наш челлендж, посвященный запуску k8s v.0.1 из 2014. Челлендж оказался не из простых: быстрее всех справились @FdrvVldmr и @ne0ba — они решили задачу за ~130 минут. В этой статье мы пошагово разберём, как же всё-таки запустить k8s v.0.1. Скрины с пояснениями прилагаются.
Перед началом советую прочитать, как мы собирали компоненты для запуска Kubernetes v. 0.1, и ознакомиться с условием задачи.
Оглавление
Master-сервер — основа основ
Запуск стоит начать именно с master-сервера, так как без него могут возникнуть дополнительные проблемы с запуском minion-ов.
P.S. все команды ниже нужно выполнять из-под root пользователя.
etcd
В первую очередь нужно запустить etcd, который будет «краеугольным камнем» всего Kubernetes-кластера. Запускать полноценный кластер etcd нет необходимости, надёжность в данном случае нам не обязательна. Поэтому запускаем etcd в режиме одиночного инстанса. Обязательно указываем ему, какие адреса и порты слушать и предлагать клиентам.
etcd --data-dir /var/etcd --name kube --listen-client-urls
http://localhost:2379,http://0.0.0.0:4001 --advertise-client-urls
http://localhost:2379,http://0.0.0.0:4001 &
apiserver
Теперь запускаем apiserver, от которого зависит дальнейшая работа всего кластера. В качестве параметров указываем ему адрес etcd-сервиса, который является обязательной зависимостью. Также указываем адрес, на котором слушать, и список нод, которые впоследствии будут в нём зарегистрированы. Обратите внимание, что куб берет в качестве ключей для конфигураций fqdn будущей ноды, поэтому важно указать их правильно. Порт, который будет слушать apiserver, не указываем, пусть будет дефолтным (8080).
apiserver -etcd_servers=http://127.0.0.1:4001 --machines
kube01-minion1.ru-central1.internal,kube01-minion2.ru-central1.internal -address 0.0.0.0 &
controller-manager
Последний компонент, который нужно запустить на мастер-сервере, это controller-manager. Всё, что нужно ему знать, — адрес etcd и apiserver.
controller-manager --master=127.0.0.1:8080 -etcd_servers=http://localhost:4001 &
Заводим minion-машины
Теперь запустим ноды на двух предложенных minion-машинах. Порядок действий идентичен для обоих машин, поэтому далее не буду указывать, что действие нужно повторить на каждой.
Docker
Бинарник docker уже собран, но при запуске стандартным образом он сыпет ошибками. Запустим в debug-режиме и посмотрим, что происходит.
docker -d -D
[error] container.go:435 Error running container: mountpoint not found
В чём же проблема? В Ubuntu 14.04.6 LTS по умолчанию не установлены cgroup. А это значит, что у нас есть два варианта решения.
Первый — запустить docker на основе lxc.
docker -d -e lxc &
Второй — установить cgroup-lite.
apt-get install cgroup-lite
docker -d &
kubelet
Теперь docker заработает без проблем, и можно вернуться к запуску компонентов kubernetes. Kubelet должен управлять запуском контейнеров. Из параметров указываем ему адрес etcd для регистрации и адрес, на котором он будет отвечать на запросы apiserver.
kubelet -etcd_servers=http://192.168.10.29:4001 -address=0.0.0.0 &
Kube-proxy
И последний компонент нашего кластера — kube-proxy. Он совсем простой и требует только регистрации в etcd.
kube-proxy -etcd_servers=http://192.168.10.29:4001 &
Запуск nginx
Теперь, когда кластер запущен, мы можем развернуть в нем требуемый nginx. Для того, чтобы не усложнять задачу, используем команду из официального README.
Нужно обратить внимание, что для запуска нужно использовать локальный образ mirror.gcr.io/nginx:1.7.11, о причинах этого отдельно написано в описании челленджа.
cloudcfg -h https://<external_ip_kube01_master> -p 9999:80 run mirror.gcr.io/nginx:1.7.11 2 myNginx
Для проверки того, что запрос выполнен верно, можно снова воспользоваться cloudcfg.
cloudcfg -h https://<external_ip_kube01_master> list /tasks
Создание сервиса
И последнее, что мы делаем — создаём сервис балансировки. Для этого описываем его конфиг в json-формате.
{
"id": "myNginx",
"port": 10001,
"labels": {
"replicationController": "myNginx"
}
}
Осталось только применить его согласно всё тому же README.
cloudcfg -h https://<external_ip_kube01_master> -c myNginx.json create /services
И для проверки успешности решения запустим скрипт merctl.test. Если всё сделано правильно, то вывод должен быть таким.
$ merctl.test
> Setup completed
PASS
> Teardown completed
Отлично, мы справились — k8s v.0.1 запущен правильно.
На наше счастье, Kubernetes за эти годы не только сильно вырос, но и оброс большим количеством сопутствующего ПО, которое упрощает его запуск. Kubespray, Kubeadm и, конечно, запуск в облаках теперь не ограничивается только GKE.
Следующий челлендж с призами анонсируем уже скоро в нашем боте — чтобы не потеряться, пишите/start
.
Если хочется погрузиться в мир Kubernetes глубже, советую к ознакомлению другие наши статьи про DevOps: