Введение
Kubernetes стал идеальным решением для оркестрации контейнеров, позволяющим разработчикам легко развертывать, управлять и масштабировать контейнерные приложения. Однако настройка кластера Kubernetes может оказаться сложным процессом, включающим множество шагов и настроек. Именно здесь на помощь приходит Ansible, инструмент автоматизации с открытым исходным кодом. Автоматизируя процесс развертывания, Ansible может значительно упростить создание кластера Kubernetes.
В этом руководстве мы познакомим вас с процессом создания кластера Kubernetes с помощью Ansible. Предполагается, что все узлы кластера K8 работают под управлением операционной системы Ubuntu Linux.
Предварительные условия
Прежде чем мы углубимся в процесс установки, убедитесь, что у вас есть следующие предварительные условия:
- Ansible — Ansible должен быть установлен на управляющей машине. На управляющей машине вы будете запускать сценарии Ansible, и она может быть вашей локальной машиной или сервером.
- Целевые узлы: это машины, на которых будет установлен Kubernetes. Вам понадобится как минимум два узла: один для главного узла и один для рабочего узла. Убедитесь, что на этих узлах работает совместимый дистрибутив Linux.
- Доступ по SSH: Ansible обменивается данными с целевыми узлами через SSH. Доступ по SSH должен быть настроен для всех целевых узлов с управляющей машины.
Шаг 1. Установка Ansible
Для начала настройте Ansible на своей управляющей машине. Процесс включает установку Ansible, которая зависит от операционной системы. Используйте следующие команды в зависимости от вашего дистрибутива:
sudo apt-get update
sudo apt-get install ansible
Шаг 2. Настройте файл инвентаризации
После установки Ansible приступите к настройке файла инвентаризации. Создайте файл с именем host.ini в своем рабочем каталоге, в котором будут перечислены все целевые узлы вместе с их IP-адресами. Для большей ясности разбейте их на группы, например, мастеров и рабочих. Вот пример:
[masters]
master ansible_host=192.168.1.100
[workers]
worker1 ansible_host=192.168.1.101
worker2 ansible_host=192.168.1.102
Шаг 3. Настройка кластера K8s Playbook
Эта книга поможет вам настроить кластер Kubernetes с использованием систем Ubuntu. Включает задачи по отключению брандмауэра, отключению подкачки, настройке параметров сети, добавлению репозитория Docker, установке Docker и его компонентов, настройке параметров среды выполнения контейнера, добавлению репозитория Kubernetes и установке компонентов Kubernetes (kubelet, kubeadm, kubectl). В частности, kubectl устанавливается только на узлы, идентифицированные как главные. Пособие демонстрирует комплексный подход к подготовке систем для Kubernetes с упором на необходимые сервисы, конфигурации безопасности и основные компоненты Kubernetes.
Создайте файл setup-playbook.yaml и добавьте следующий контент:
- name: Initialize master and worker nodes
hosts: all
tasks:
- name: disable UFW firewall for labs
service:
name: ufw
state: stopped
enabled: false
- name: Disable SWAP
shell: |
swapoff -a
- name: Disable SWAP in fstab
lineinfile:
path: /etc/fstab
regexp: '^.*swap.*$'
line: '#\0'
backrefs: yes
- name: ensure net.bridge.bridge-nf-call-ip6tables is set to 1
sysctl:
name: net.bridge.bridge-nf-call-iptables
value: '1'
state: present
reload: yes
- name: Installation of apt-utils
apt:
name: apt-transport-https
state: present
update_cache: yes
- name: Adding Docker GPG key
ansible.builtin.apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
- name: Adding Docker Repository
apt_repository:
repo: deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable
state: present
- name: Installation of Docker
apt:
name: "{{ item }}"
state: present
loop:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-compose
- name: Setting value of SystemdCgroup
shell: |
containerd config default | sudo tee /etc/containerd/config.toml | grep SystemdCgroup
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
- name: Starting Service of Docker
service:
name: docker
state: started
enabled: yes
- name: Add Kubernetes apt repository
apt_repository:
repo: deb https://apt.kubernetes.io/kubernetes-xenial main
state: present
- name: Install kubelet and kubeadm
apt:
name: "{{ item }}"
state: present
loop:
- kubeadm
- kubelet
- name: start kubelet
service:
name: kubelet
enabled: yes
state: started
- name: install kubectl
apt:
name: kubectl
state: present
when: "'masters' in group_names"
Запустите playbook, выполнив:
ansible-playbook -i hosts.ini setup-playbook.yml
Шаг 4. Настройка главного узла
Этот сборник сценариев Ansible предназначен для настройки главного узла кластера Kubernetes. Инициализируйте кластер Kubernetes с определенными сетевыми конфигурациями, создайте каталог .kube и скопируйте файл конфигурации kube в домашний каталог пользователя для управления кластером. Также установите сетевой плагин Calico для управления сетью модулей, гарантируя, что модули могут взаимодействовать друг с другом через узлы. Сборник сценариев автоматизирует процесс начальной настройки, упрощая развертывание кластера Kubernetes.
Создайте файл с именем master-playbook.yml и добавьте в него следующее содержимое:
- name: Configuration of master node
hosts: masters
tasks:
- name: initialize K8S cluster
shell: kubeadm init --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.100.5 --ignore-preflight-errors=all
- name: create.kube directoryi and copy kube config file
shell: "{{ item }}"
loop:
- mkdir -p $HOME/.kube
- cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- chown $(id -u):$(id -g) $HOME/.kube/config
- name: install Pod network
become: yes
shell: kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml >> pod_network_setup.txt
args:
chdir: $HOME
creates: pod_network_setup.txt
Запустите плейбук командой:
ansible-playbook -i hosts.ini master-playbook.yml
Шаг 5. Настройте сценарий рабочего узла.
Этот сборник сценариев используется для автоматизации процесса объединения узлов Kubernetes. Он работает на всех узлах, генерируя команду соединения на главном узле и распределяя ее по рабочим узлам. Первоначально он получает команду соединения с использованием токена kubeadm и сохраняет ее. Затем с помощью этой команды установите факт для использования на рабочих узлах. Наконец, рабочие узлы используют эту команду для присоединения к кластеру Kubernetes, минуя предполетные проверки. Этот сборник сценариев упрощает процесс расширения кластера за счет автоматизации процесса слияния узлов.
Создайте файл с именем worker-playbook.yml и добавьте в него следующее содержимое:
- name: Generating token on master node and token deployment to worker node
hosts: all
gather_facts: false
tasks:
- name: get join command
shell: kubeadm token create --print-join-command
register: join_command_raw
when: "'masters' in group_names"
- name: set join command
set_fact:
join_command: "{{ join_command_raw.stdout_lines[0] }}"
when: "'masters' in group_names"
- name: join cluster
shell: "{{ hostvars['master'].join_command }} --ignore-preflight-errors all >> node_joined.txt"
args:
chdir: $HOME
creates: node_joined.txt
when: "'workers' in group_names"
Запустите плейбук командой:
ansible-playbook -i hosts.ini worker-playbook.yml
Шаг 5. Проверьте кластер
Запустив плейбуки, вы сможете убедиться, что ваш кластер Kubernetes настроен правильно.
На главном узле запустите:
kubectl get nodes
Вы должны увидеть все узлы в списке со статусом «Готово».
Заключение
Выполнив эти шаги, вы успешно настроили кластер Kubernetes с помощью Ansible. Этот метод предлагает масштабируемый и повторяемый процесс, упрощающий управление и автоматизацию развертывания кластеров Kubernetes. По мере того, как вы лучше знакомитесь с Ansible и Kubernetes, вы можете дополнительно настраивать свои сборники сценариев в соответствии со своими конкретными требованиями, например добавлять больше рабочих узлов или настраивать расширенные функции. Удачной оркестровки!