# Пособие для самостоятельного изучения "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
```