Kubeadm - создание Kubernetes кластера за 10 минут
О технологиях

Kubeadm - создание Kubernetes кластера за 10 минут

2482
21 минута

В этой статье мы покажем как развернуть полностью рабочий и безопасный кластер Kubernetes на CentOS 7, состоящий из 1 мастер сервера и трех вычислительных узлов.

Начиная с Kubernetes 1.5 в состав этого фремворка начала входить утилита kubeadm, которая значительно упростила процесс создания и администрирования кластера Kubernetes. Kubeadm до сих пор находится в версии alpha, но тем не менее уже отлично выполняет свои функции и пригодна для использования.

В качестве системы виртуализации сети в кластере мы будем использовать flannel. Схема кластера приведена ниже.

Kubernetes-Intro-Compressor-Kubernetes-minimal-cluster.png 

Не смотря на то, что в качестве облачной платформы я буду использовать K2 Cloud, вы легко можете повторить эту установку в любом другом облаке, платформе виртуализации или “железе”.


Создаем и администрируем кластеры Kubernetes и стек DevOps
Развертываем и сопровождаем инфраструктуру для бизнес-приложений на базе микросервисов и контейнеров

Требования

Никаких предварительных специфических требований нет. Вам потребуется 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

kubernetes-web-ui-demo.png

Установка 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

А затем открыть в браузере адрес:

shoc-sock-microservice-app-demo.png

Запуск приложения

В качестве примера, как это сделано в официальной документации, предлагаю вам запустить тестовое микросервисное приложение 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, а также продолжить изучение этого потрясающего фреймворка.

19 июня 2023
Семь трендов на рынке облачных услуг в 2023 году
До 2022 года на рынке облаков в России главенствовали мировые тренды, но сейчас наша страна пошла своим путем. О том, для чего сейчас компании используют облачные технологии и как меняется рынок, рассказал директор бизнес-юнита K2 Cloud Сергей Зинкевич.
1 минута
1021
29 марта 2023
Сетевые балансировщики нагрузки и другие обновления К2 Облака

Мы рады вам представить новый сервис K2 Облака для распределения трафика между экземплярами – Балансировщики нагрузки. Кроме того, мы автоматизировали обновление сертификатов Kubernetes и добавили возможность удаления рабочих узлов из кластера Kubernetes.

2 минуты
320
12 января 2023
Российский Kubernetes, какой он? Знакомьтесь, платформа Deckhouse

Если бизнес работает в цифре, строит свои решения на базе микросервисной архитектуры и контейнеров и до последнего времени использовал для этого западную платформу контейнеризации, то актуальная задача сегодня — найти ей адекватную замену.

2 минуты
1568
26 декабря 2022
Что выгоднее — использовать готовую платформу для управления контейнерами или разрабатывать своими силами?
Совсем недавно мы провели опрос среди ИТ-руководителей, чтобы выяснить, насколько они знакомы с технологией Kubernetes и используют ли ее в ИТ-инфраструктуре своей компании, личных проектах и т.д. Результаты показали, что 63% опрошенных уже работает с Kubernetes прямо сейчас, 23% пока не дошли и 14% участников планируют в ближайшее время.
1 минута
551
4 декабря 2020
Дайджест обновлений К2 Облака осень 2020 г.
За осень в К2 Облаке многое изменилось. Мы активно писали код и не успевали сообщать обо всех переменах. Постараемся исправиться и информировать вас ASAP, чтобы вы могли сразу же использовать новые фичи.
1 минута
299
scrollup