# Пособие для самостоятельного изучения "hashicorp vault" ::: success Задача этой практики заключается в том, что нужно закепить знания Kubernetes, Vagrant и Ansible для того чтобы развернуть HashiCorp. Vault. ::: ## Vagrant файл Разворачивание кластера предполагается через конфигурацию виртуальной среды VBox. Исходный код для первичного развертывания: ```ruby= Vagrant.configure("2") do |config| config.vm.base_mac = nil config.vm.synced_folder ".", "/vagrant", disabled: false config.vm.provider "virtualbox" do |vb| vb.gui = false vb.memory = "2048" vb.cpus = 2 vb.linked_clone = true end config.vm.define "master" do |n| n.vm.provider "virtualbox" do |r| r.memory = "2048" r.cpus = 2 end n.vm.box = "ubuntu/bionic64" n.vm.hostname = "master" n.vm.network "private_network", ip: "192.168.56.10" n.vm.network "forwarded_port", guest: 80, host: 80, guest_ip: "192.168.56.10" end N = 3 (1..N).each do |machine_id| config.vm.define "node-#{machine_id}" do |n| n.vm.hostname = "node-#{machine_id}" n.vm.network "private_network", ip: "192.168.56.#{20+machine_id}" n.vm.box = "ubuntu/bionic64" if machine_id == N n.vm.provision :ansible do |ansible| ansible.limit = "all" ansible.playbook = "site.yaml" ansible.groups = { "kubernetes" => [ "master", "node-[1:#{N}]" ], "kubernetes-master" => [ "master" ], "kubernetes-node" => [ "node-[1:#{N}]" ], "all:vars" => { "kubernetes_default_interface" => "enp0s8", "kubernetes_base_ip" => "{{ hostvars[inventory_hostname]['ansible_'+kubernetes_default_interface]['ipv4']['address'] }}", "kubernetes_master_pod_subnet" => "172.16.0.0/16", "kubernetes_repo_version" => "1.19.7-*", "kubernetes_cni_version" => "0.8.*" } } ansible.raw_arguments = [ "-D" ] end end end end end ``` ::: danger Как и в прошлых практических задачах, нужно иметь в виду, что запуск ansible на одной машине с Vagrant будет полностью выполняться конфигом, который описан выше. В случае, если Vagrant и ansible находятся на разных машинах, то нужно закомментировать часть provision и запустить установку k8s отдельно. ::: ## Ansible Основной файл, который используется для развертывания кластера Kubernetes: ```yaml= - hosts: kubernetes become: yes roles: - docker - kubernetes_repo - hosts: kubernetes-master become: yes roles: - kubernetes_master - calico - hosts: kubernetes-master become: yes pre_tasks: - name: Create token shell: kubeadm token create --print-join-command 2>/dev/null register: token_create changed_when: no run_once: yes - name: Join kubernetes delegate_to: "{{ item }}" shell: "{{ token_create.stdout | replace('10.0.2.15', '192.168.56.10') }}" args: creates: /etc/kubernetes/kubelet.conf loop: "{{ groups['kubernetes-node'] }}" roles: - { role: install_charts, tags: [install_charts] } ``` Для работы с Kubernetes используется kubeadm - оснастка для конфигурации Kubernetes. Пройдемся по структуре проекта: 1. vagrant - оркестратор виртуальных машин, его задача - поднять 4 ВМ, запустить ansible и пробросить порт 2. ansible - инструмент для установки и настройки компонент 3,4,5. 3. docker - используется в качестве container runtime в k8s 4. kubernetes - оркестратор контейнеров 5. helm - пакетный менеджер в k8s. используется для установки компонент 6,7,8. 6. etcd - база данных в кластерном отказоустойчивом режиме для хранения данных vault 7. nginx ingress - веб сервер и контроллер для обеспечения доступа к vault по веб-интерфейсу 8. vault - распределенное отказоустойчивое хранилище секретов ::: danger **Предупреждение! Проект может не отрабатывать полностью, главной проблемой может стать версионность. Желательно использовать последние стабильные версии.** В репозиториях убунты\дебиана находятся сильно устаревшие пакеты и Vagrant из "apt-get" не будет работать с последней версией VBox. Могут также не сработать случайным образом команды для автовыполнения задач. Происходит это из-за добавления/убирания функционала. ::: ### Инструкции для запуска проекта #### Инициализация машин и установка софта 1. Скопировать репозиторий в любую директорию и зайти в корень. 2. Запустить команду, если vagrant стоит совместно с ansilble на одной машине: ```vagrant up``` Команда поднимет всю инфраструктуру - оно может выполняться до 10-20 минут, в зависимости от железа и вашей скорости интернета. Если вы запускаете ansible и Vagrant отдельно, то вводить нужно следующие команды: 1. vagrant up 2. данные из раздела provision нужно заменить в нескольких местах: 1. Inventory 2. vars файл 3. Запустить команду: ``` ansible-playbook -i hosts site.yaml -D ``` #### Инициализация данных После того как кластер установился необходимо выполнить первичную инициализацию `vault`. 1. Нужно добавить в `/etc/hosts` на основной ОС следующую строку: ```127.0.0.1 vault.local``` 2. (находясь в папке с проектом) ```sh $ vagrant ssh master $ sudo su # kubectl -n vault exec -ti vault-0 sh # vault operator init ``` Как только завершится выполнение команды вы получите 5 `Unseal key` и `Initial Root Token`. ::: warning Сохраните их для дальнейшей работы со стендом! ::: #### Распечатка хранилища Выполнить команды нужно в каждом отдельном контейнере и ввести в них 3 раза `Unseal key`. Всего ключей 5 для распечатываиня можно использовать любые 3. Ключи длякаждого контейнера должны быть разными, но вполне можно использовать одни и те же для распечатывания в разных контейнерах. Далее пример для vault-0, то же самое надо сделать для vault-1 и vault-2: ``` kubectl -n vault exec -ti vault-0 sh vault operator unseal # ввести любой из Unseal key vault operator unseal # ввести любой из Unseal key, кроме введенного на предыдущем шаге vault operator unseal # ввести любой из Unseal key, кроме введенного на предыдущих шагах # если после 3 операции мы увидели "Sealed false", считаем что для данного контейнера все готово, можно выходить exit ``` :::info После проведенных действий можно считать стенд настроенным и готовым к использованию. Но, перед тем как начать им пользоваться нужно провести тесты. ::: #### Тестирование работоспособности стенда 1. Зайти в машину master и выполнить команду: ``` kubectl -n vault get pods ``` Результат должен быть аналогичным приведенному ниже: ``` NAME READY STATUS RESTARTS AGE etcd-vault-0 1/1 Running 0 37m etcd-vault-1 1/1 Running 0 37m etcd-vault-2 1/1 Running 0 37m vault-0 1/1 Running 2 37m vault-1 1/1 Running 2 37m vault-2 1/1 Running 2 37m vault-agent-injector-784ccfc788-ltdt4 1/1 Running 0 37m ``` 2. Открыть браузер на основной ОС и ввести в адресную строку: vault.local:8080. В открывшейся странице ввести в качестве пароля root token. Если авторизация прошла успешно - стенд готов к работе. Весь проект по развертыванию vault можно найти в личном кабинете lms. ## Известные проблемы 1. Недоступен хост - нужно выполнить команды ниже на всех нодах: ``` systemctl stop kubelet systemctl stop docker iptables --flush iptables -tnat --flush systemctl start kubelet systemctl start docker ```