• DevOps
  • Защита информации
  • ИТ-поддержка
  • Существует несколько вариантов развертывания кластера Kubernetes. Самый простой из них — Minikube или кластер на одну ноду. Подробный процесс его установки описан на официальном сайте Kubernetes. Мы же рассмотрим установку кластера на нескольких нодах, используя kubespray.

    Kubespray — это набор Ansible-ролей для установки и конфигурации Kubernetes. Он обеспечивает:

    1. кластер высокой доступности
    2. поддержку большинства популярных дистрибутивов Linux
    3. тесты CI

    Для понимания процесса установки рассмотрим структуру кластера. Кластер Kubernetes состоит из двух типов ресурсов:

    1. Master отвечает за управление кластером. Мастер координирует все действия в вашем кластере, такие как планирование приложений, поддержание желаемого состояния приложений, масштабирование приложений и развертывание новых обновлений.
    2. Node (узел) — это виртуальная машина или физический компьютер, который служит рабочим компьютером в кластере Kubernetes. У каждого узла есть Kubelet, который является агентом для управления узлом и взаимодействия с мастером Kubernetes. Узел также должен иметь инструменты для обработки контейнерных операций, такие как containerd или Docker.

    При разворачивании приложения в Kubernetes, мы сообщаем Мастеру, что нужно запустить контейнеры приложений. Мастер планирует запуск контейнеров на узлах кластера. Узлы связываются с мастером с помощью Kubernetes API , который предоставляет Мастер.

    Подготовка ВМ

    Перейдем непосредственно к процессу установки. Подготавливаем несколько виртуальных машин. У нас будет 3 виртуальных машины с ОС Centos 7 minimal. В дальнейших статьях, посвященных Kubernetes, мы будем добавлять виртуальные машины для демонстрации всех возможностей кластера.

    Адресация виртуальных машин:

    1. k8s-1 ip 10.15.73.41
    2. k8s-3 ip 10.15.73.42
    3. k8s-3 ip 10.15.73.43

    Для каждой виртуальной машины меняем имя командой внутри гостевой ОС. Выполняем команду:

    [[email protected] ~]# hostnamectl set-hostname k8s-1 
    

    Здесь k8s-1 — имя первой виртуальной машины, k8s-2 и k8s-3 — второй и третьей соответственно. После применения перегружаем виртуальные машины.

    Устанавливаем дополнительное ПО:

    [[email protected] ~]# yum install wget curl git screen python-pip sshpass
    

    Генерируем ключ SSH:

    [[email protected] ~]# ssh-keygen
    

    Копируем ключ на удаленные серверы. Выполняем команды:

    [[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
    [[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
    [[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
    

    Устанавливаем ansible:

    [[email protected] ~]# yum install ansible pip
    

    Редактируем файл хостов для ansible:

    [[email protected] ~]# nano /etc/ansible/hosts
    

    Добавляем строчки:

    [k8sservers]
    k8s-1
    k8s-2
    k8s-3
    

    Создаем новый playbook для ansible. Данный playbook необходим для подготовки серверов:

    [[email protected] ~]#  nano  pb1.yml
    

    Содержимое файла pb1.yml:

    ---
    - hosts: all
      tasks:
    
      - name: Install EPEL repo
        yum:
          name: epel-release
          state: present
    
      - name: Disable SELinux
        selinux:
          state: disabled
    
      - name: Disable SWAP since kubernetes can't work with swap enabled (1/2)
        shell: |
          swapoff -a
    
      - name: Disable SWAP in fstab since kubernetes can't work with swap enabled (2/2)
        replace:
          path: /etc/fstab
          regexp: '^([^#].*?\sswap\s+sw\s+.*)$'
          replace: '# \1'
    
      - name: set timezone to Europe/Moscow
        timezone:
          name: Europe/Moscow
    
      - name: Ensure firewalld service is disabled and stopped
        systemd:
          name: firewalld
          state: stopped
          enabled: no
          masked: yes
        register: firewalld_result
        failed_when: "firewalld_result is failed and 'Could not find the requested service' not in firewalld_result.msg"
        when: ansible_os_family == 'RedHat' and ansible_distribution_major_version >= '7'
    
      - name: restart server
        shell: 'sleep 1 && shutdown -r now "Reboot triggered by Ansible" && sleep 1'
        async: 1
        poll: 0
        become: true
    

    Данный файл выполняет следующие действия на всех нодах:

    1. Подключает репозиторий EPEL
    2. Отключает Selinux
    3. Отключает Swap
    4. Отключает firewalld
    5. Меняет timezone

    Эти действия необходимы для дальнейшей корректной установки и работы Kubernetes.

    Выполняем команду:

     [[email protected] ~]# ansible-playbook pb1.yml
    

    После выполнения, все серверы автоматически перезагрузятся. Подготовка серверов закончена, можно переходить к установке Kubernetes.

    Установка Kubernetes

    Делаем клон репозитория kubespray. Выполняем команду:

    [[email protected] ]# git clone https://github.com/kubernetes-sigs/kubespray
    

    Последняя версия Kubespray не поддерживает установку Kubernetes ниже 1.17.0. В нашем примере мы будем устанавливать версию 1.16.x для демонстрации возможности обновления через Kubespray в дальнейших статьях. Для установки версии 1.16.14 переключаемся в ветку remotes/origin/release-2.13 репозитория.

    [[email protected] ]#cd kubespray
    [[email protected] kubespray]# git checkout  remotes/origin/release-2.13
    

    Выполняем установку необходимых зависимостей:

    [[email protected] kubespray ]# pip install -r requirements.txt
    

    Редактируем файл где описываем хосты и кто какую роль будет выполнять. Так же прописываем IP-адреса, которые будут использоваться:

    [[email protected] ]# nano  /root/kubespray/inventory/sample/inventory.ini
    k8s-1 ansible_ssh_host=10.15.73.41  ip=10.15.73.41
    k8s-2 ansible_ssh_host=10.15.73.42  ip=10.15.73.42
    k8s-3 ansible_ssh_host=10.15.73.43  ip=10.15.73.43
    
    [kube-master]
    k8s-1
    
    [etcd]
    k8s-1
    k8s-2
    k8s-3
    
    [kube-node]
    k8s-2
    k8s-3
    
    
    [k8s-cluster:children]
    kube-node
    kube-master
    
    

    Меняем устанавливаемую версию. На момент написания статьи была версия 1.16.14. Редактируем файл:

    [[email protected] ]# nano /root/kubespray/inventory/sample/group_vars/k8s-cluster/k8s-cluster.yml
    

    Меняем следующее значение:

    ## Change this to use another Kubernetes version, e.g. a current beta release
    kube_version: v1.16.14
    

    Запускаем установку кластера:

    [[email protected] ]# cd  /root/kubespray
    [[email protected] kubespray]#  ansible-playbook -u root -b -i inventory/sample/inventory.ini cluster.yml
    

    Во время не должно быть ошибок. Если же они возникли, то необходимо исправить найденные проблемы и запустить установку кластера снова.

    После установки проверяем информацию по кластеру (должно выдавать kubernetes master is running at ...):

    [[email protected] kubespray]# kubectl cluster-info
    

    Проверяем статус узлов (покажется список узлов, роль и статус Ready с таймингом работы):

    [[email protected] kubespray]# kubectl get nodes
    

    Проверяем статус подов:

    [[email protected] ]# kubectl get pod -A
    

    На этом базовая установка k8s закончена.

    Мы можем помочь в настройке k8s и поддержке кластера. Оставьте заявку!

    Не нашли ответа на свой вопрос?
    Содержание

    Есть вопросы?

    Закажите звонок специалиста!

    Есть вопросы?

    Закажите звонок специалиста!
    *нажимая на кнопку, Вы даете согласие на обработку персональных данных