Kubeadm - создание Kubernetes кластера за 10 минут
Содержание:
- 1. Требования
- 2. Подготовка серверов
- 3. Установка мастера
- 4. Настройка виртуальной сети
- 5. Подключение вычислительных узлов
- 6. Управление кластером с узлов, не принадлежащих кластеру
- 7. Установка Web-UI
- 8. Получение доступа к Web-UI
- 9. Установка Weave Scope
- 10. Запуск приложения
- 11. Удаление приложения
- 12. Ограничения kubeadm
В этой статье мы покажем как развернуть полностью рабочий и безопасный кластер Kubernetes на CentOS 7, состоящий из 1 мастер сервера и трех вычислительных узлов.
Начиная с Kubernetes 1.5 в состав этого фремворка начала входить утилита kubeadm
, которая значительно упростила процесс создания и администрирования кластера Kubernetes. Kubeadm
до сих пор находится в версии alpha, но тем не менее уже отлично выполняет свои функции и пригодна для использования.
В качестве системы виртуализации сети в кластере мы будем использовать 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 переданы:
- —api-advertise-addresses — устанавливает IP-адрес, на котором будет слушать API-сервис, нужный для взаимодействия с кластером утилиты kubectl. В нашем случае — 192.168.0.4. Если не указывать этот параметр, будет использоваться IP-адрес интерфейса, смотрящего в сеть шлюза по-умолчанию
- —pod-network-cidr — сообщает кластеру адресное пространство (10.244.0.0/16) виртуальных сетей используемых во flannel. Оно задается в файле конфигурации flannel, ссылка на который приведена по URL из вывода kubeadm
- —api-external-dns-names — указывает на внешнее DNS имя хоста (в нашем случае master-1.comp.avmaksimov.ru); это позволит вам пройти аутентификацию и авторизацию при использовании kubectl с рабочего места
В конце выполнения 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
Для установки 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
Для получение доступа к Web-UI интерфейсу кластера (по-умолчанию не открыт во внешние сети), с рабочего ПК выполните команду:
kubectl --kubeconfig ./admin.conf proxy
После чего подключиться к Web-UI можно будет по адресу http://localhost:8001/api/v1
Установка Weave Scope
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
Самые важные ограничения kubeadm
на текущий момент времени:
- не поддерживает кластеризацию матер серверов
- не поддерживает использование балансировщиков трафика (LoadBalancer)
Об остальных ограничениях можно подробнее узнать из соответствующего раздела документации.
После прочтения этой стати вы самостоятельно сможете развернуть кластер Kubernetes, а также продолжить изучение этого потрясающего фреймворка.