
Сегодня мы поговорим о том, как на CentOS 7 развернуть полноценный и безопасный кластер Kubernetes из одного мастер-сервера и трех вычислительных узлов.
Начиная с версии 1.5, в состав Kubernetes входит утилита kubeadm, благодаря которой процессы создания и администрирования кластера Kubernetes стали гораздо проще.
Хотя kubeadm все еще пребывает в стадии альфа-тестирования, она отлично выполняет свои функции и ее с успехом можно применять.
Для виртуализации сети в кластере будем использовать flannel. Схема кластера показана на рисунке ниже.

В качестве облачной платформы мы взяли K2 Cloud, однако, ничто не мешает вам повторить наши действия в любом другом облаке, на платформе виртуализации или «железе».
Никаких предварительных специфических требований нет. Вам потребуется 1-4 виртуальные машины (в зависимости от того, какое количество вычислительных узлов вам нужно) с CentOS 7, объединенные общей сетью и с доступом в Интернет.
Для удобства работы я рекомендую выполнить базовые операции по предварительной настройке ваших серверов:
yum -y update
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
hostnamectl set-hostname master-1.comp.avmaksimov.ru
Если вы повторяете эту установку в K2 Cloud, я рекомендую вам дополнительно для удобства отключить обновление имени хоста в cloud-init. Для этого вам необходимо отредактировать файл /etc/cloud/cloud.cfg и закомментировать следующие строчки:
cloud_init_modules:
- migrator
- bootcmd
- write-files
- growpart
- resizefs
# - set_hostname
# - update_hostname
# - update_etc_hosts
- rsyslog
- users-groups
- ssh
Далее идут обязательные операции, которые необходимо выполнить на каждом из серверов вашего кластера перед началом установки Kubernetes.
Добавьте Kubernetes репозиторий:
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
После добавления репозитория обязательно отключите SELinux, т.к. Kubernetes еще не очень хорошо с ним работает. Для этого выполните следующую команду:
setenforce 0
А также отредактируйте файл /etc/sysconfig/selinux, изменив значение переменной SELINUX на disabled:
sed -i --follow-symlinks's/^SELINUX=.*/SELINUX=disabled/g'
/etc sysconfig/selinux
Далее нужно установить необходимые для инсталляции кластера пакеты:
yum -y install docker kubelet kubeadm kubectl kubernetes-cni
Далее необходимо запустить сервис docker:
systemctl enable docker
systemctl start docker
И сервис kubelet:
systemctl enable kubelet
systemctl start kubelet
Установка кластера
Процесс установки кластера очень прост и фактически сводится к выполнению всего пары команд.
Если что-то пошло не так, вы всегда можете начать с начала, выполнив на нужном вам узле кластера команду:
kubeadm reset
На мастер-сервере выполните команду:
kubeadm init --api-advertise-addresses=192.168.0.4
--api-external-dns-names=master-1.comp.avmaksimov.ru
--pod-network-cidr 10.244.0.0/16
Вывод команды будет примерно следующим:
[kubeadm] WARNING: kubeadm is in alpha, please do not use
it for production clusters.
[preflight] Running pre-flight checks
[init] Using Kubernetes version: v1.5.3
[tokens] Generated token: "aecc37.5d0fc1b9a673ecaa"
[certificates] Generated Certificate Authority key and certificate.
[certificates] Generated API Server key and certificate
[certificates] Generated Service Account signing keys
[certificates] Created keys and certificates
in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk:
"/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk:
"/etc/kubernetes/admin.conf"
[apiclient] Created API client, waiting for the control
plane to become ready
[apiclient] All control plane components are healthy
after 44.788287 seconds
[apiclient] Waiting for at least one node to
register and become ready
[apiclient] First node is ready after 2.502671 seconds
[apiclient] Creating a test deployment
[apiclient] Test deployment succeeded
[token-discovery] Created the kube-discovery deployment,
waiting for it to become ready
[token-discovery] kube-discovery is ready after 16.002846 seconds
[addons] Created essential addon: kube-proxy
[addons] Created essential addon: kube-dns
Your Kubernetes master has initialized successfully!
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with
one of the options listed at:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines
by running the following on each node:
kubeadm join --token=aecc37.5d0dfasdf673ecaa 192.168.0.4
Эта команда подготовит и установит все необходимое для работы вашего Kubernetes кластера, а также протестирует его работоспособность. В качестве параметров для kubeadm переданы:
В конце выполнения kubeadm выдаст вам команду и токен для подключения ваших вычислительных узлов.
Для настройки виртуальной сети на мастере Kubernetes необходимо выполнить следующую команду:
kubectl apply -f
https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true
Убедиться в правильной настройке виртуальной сети можно по запущенному Pod kube-dns из вывода команды:
kubectl get pods --all-namespaces
Вывод должен быть похож на следующий:
NAMESPACE NAME
READY STATUS RESTARTS AGE
default kube-flannel-ds-76mm0
2/2 Running 0 2m
kube-system dummy-2088944543-6t4fs
1/1 Running 0 15m
kube-system etcd-master-1.comp.avmaksimov.ru
1/1 Running 0 14m
kube-system kube-apiserver-master-1.comp.avmaksimov.ru
1/1 Running 0 15m
kube-system kube-controller-manager-master-1.comp.avmaksimov.ru
1/1 Running 0 14m
kube-system kube-discovery-1769846148-vmzw9
1/1 Running 0 15m
kube-system kube-dns-2924299975-9slml
4/4 Running 0 15m
kube-system kube-proxy-k8f4m
1/1 Running 0 15m
kube-system kube-scheduler-master-1.comp.avmaksimov.ru
1/1 Running 0 14m
Для подключения вычислительных узлов к кластеру необходимо выполнить команду, сообщенную вам kubeadm:
kubeadm join --token=aecc37.5d0dfasdf673ecaa 192.168.0.4
Проверить корректность подключения узла можно командой:
kubectl get nodes
В случае успешного подключения всех узлов вывод будет следующим:
master-1.comp.avmaksimov.ru Ready,master 5m
node-1.comp.avmaksimov.ru Ready 1m
node-2.comp.avmaksimov.ru Ready 1m
node-3.comp.avmaksimov.ru Ready 1m
Для того, чтобы иметь возможность управлять вашим кластером не с мастер сервера, а, например, с рабочего ноутбука, скопируйте себе на него файл /etc/kubernetes/admin.conf. В этом файле в секции clusters необходимо изменить IP-адрес подключение к серверу на его внешнее DNS имя, если вы используете VPC как и я:
clusters:
- cluster:
certificate-authority-data: ...
server: https://master-1.comp.avmaksimov.ru:6443
name: kubernetes
Важно: убедитесь, что в правилах межсетевого экрана в VPC вашей виртуальной сети разрешен трафик на порт 6443/TCP.
Запуск kubectl в таком случае будет выглядеть, например, следующим образом:
kubectl --kubeconfig ./admin.conf get nodes
Для установки Web-UI (Dashboard) для вашего кластера Kubernetes, необходимо выполнить команду:
kubectl --kubeconfig ./admin.conf create -f
https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml
Контейнер с Web-UI автоматически определит ваш сервер API и подключится к нему.
Проверить запуск контейнера можно командой:
kubectl --kubeconfig ./admin.conf get pods -n kube-system
Pod с Web-UI (kubernetes-dashboard) должен быть запущен:
NAME
READY STATUS RESTARTS AGE
dummy-2088944543-pttw1
1/1 Running 0 4h
etcd-master-1.comp.avmaksimov.ru
1/1 Running 0 4h
kube-apiserver-master-1.comp.avmaksimov.ru
1/1 Running 1 4h
kube-controller-manager-master-1.comp.avmaksimov.ru
1/1 Running 0 4h
kube-discovery-1769846148-hzl49
1/1 Running 0 4h
kube-dns-2924299975-2ljvn
4/4 Running 0 4h
kube-proxy-6l5k6
1/1 Running 0 4h
kube-proxy-hwgr7
1/1 Running 0 4h
kube-proxy-q1krp
1/1 Running 0 4h
kube-proxy-x2ll1
1/1 Running 0 4h
kube-scheduler-master-1.comp.avmaksimov.ru
1/1 Running 0 4h
kubernetes-dashboard-3203831700-tsk1c
1/1 Running 0 3h
Если по каким-то причинам получить доступ к Web-UI не получится (как, описано далее), необходимо скачать актуальный файл конфигурации:
wget https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml
Раскомментировать и отредактировать строку подключения к API-серверу —apiserver-host:
spec:
containers:
- name: kubernetes-dashboard
image:
gcr.io/google_containers/kubernetes-dashboard-amd64:v1.5.1
imagePullPolicy: Always
ports:
- containerPort: 9090
protocol: TCP
args:
# Uncomment the following line to manually specify
Kubernetes API server Host
# If not specified, Dashboard will attempt to auto
discover the API server and connect
# to it. Uncomment only if the default does not work.
- --apiserver-host=http://192.168.0.4:8080
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
Применить конфигурацию:
kubectl --kubeconfig ./admin.conf create -f kubernetes-dashboard.yaml
Для получение доступа к Web-UI интерфейсу кластера (по-умолчанию не открыт во внешние сети), с рабочего ПК выполните команду:
kubectl --kubeconfig ./admin.conf proxy
После чего подключиться к Web-UI можно будет по адресу http://localhost:8001/api/v1

Weave Scope — это отличный инструмент, предназначенный для графического отображения ваших контейнеров, pod, сервисов и других компонент кластера, а также связей между ними.
Weave Scope может быть установлен как с подключением к Облаку Weave Cloud, так и без него. Для того, чтобы установить Weave Scope с подключением к их облаку, воспользуйтесь документацией. Сейчас мы остановимся на том, что установим Weave Scope в автономном режиме. Для того, чтобы это сделать, выполните команду:
kubectl --kubeconfig ./admin.conf apply -f 'https://cloud.weave.works/launch/k8s/weavescope.yaml'
Чтобы получить доступ к Web-интерфейсу, отображающему всю вашу инфраструктуру, необходимо выполнить другую команду:
kubectl --kubeconfig ./admin.conf port-forward $(kubectl --kubeconfig ./admin.conf get pod --selector=weave-scope-component=app -o jsonpath='{.items..metadata.name}') 4040
А затем открыть в браузере адрес:

В качестве примера, как это сделано в официальной документации, предлагаю вам запустить тестовое микросервисное приложение sock-shop (Интернет-магазин носков).
Для этого создайте для него отдельное пространство имен (namespace) sock-shop:
kubectl --kubeconfig ./admin.conf create namespace sock-shop
А затем выполните запуск приложения:
kubectl --kubeconfig ./admin.conf apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true"
Здесь ключ -n предназначен для указания пространства пространства имен, в котором необходимо запустить приложение.
Смотреть за процессом запуска контейнеров приложения можно командой:
kubectl --kubeconfig ./admin.conf get pods -n sock-shop
Как только все контейнеры будут запущены, необходимо выяснить, на каком порту опубликовано это приложение, т.к. мы не используем никакие балансировщики. Сделать это можно выполнив команду:
kubectl --kubeconfig ./admin.conf describe svc front-end -n sock-shop
Данная команда предназначена для вывода информации о сервисе front-end. Вы получите следующий вывод:
Name: front-end
Namespace: sock-shop
Labels: name=front-end
Selector: name=front-end
Type: NodePort
IP: 10.103.253.240
Port: 80/TCP
NodePort: 30001/TCP
Endpoints: 10.244.2.4:8079
Session Affinity: None
No events.
В строке NodePort обозначен порт, на котором слушает подключения сервис front-end.
Теперь вы сможете получить доступ к только что опубликованному микросервиному приложению вбив в адресную строку браузера внешний IP-адрес одной из вычислительных нод и порт подключения. Не забудьте открыть на межсетевом экране виртуальной сети в VPC.

Также вы можете посмотреть на все сущности, которые были созданы в соответствующем пространстве имен в Web-UI Kubernetes.
Для того, чтобы удалить тестовое приложение, можно просто удалить пространство имен sock-shop, а Kubernetes самостоятельно удалит все в нужной последовательности и освободит ресурсы. Сделать это можно командой:
kubectl --kubeconfig ./admin.conf delete namespace sock-shop
Самые важные ограничения kubeadm на текущий момент времени:
Об остальных ограничениях можно подробнее узнать из соответствующего раздела документации.
После прочтения этой стати вы самостоятельно сможете развернуть кластер Kubernetes, а также продолжить изучение этого потрясающего фреймворка.