init
This commit is contained in:
12
.env.example
Normal file
12
.env.example
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
PVE_USER=root
|
||||||
|
PVE_PASSWD=password
|
||||||
|
|
||||||
|
PVE_NODE="pve-nsk" # node name
|
||||||
|
PVE_HOST="192.168.9.2" # proxmox api ip
|
||||||
|
PVE_REALM="pam" # pam or pve
|
||||||
|
PVE_CPU="4" # qty
|
||||||
|
PVE_MEMORY="4" # Gb
|
||||||
|
PVE_STORAGE_SIZE="32" # Gb
|
||||||
|
PVE_STORAGE_TYPE="RAW" $ RAW or QCOW2
|
||||||
|
PVE_STORAGE_PATH="local" # name
|
||||||
|
PVE_IMAGE_FILE="hdd0:iso/rancheros-autoformat.iso" # full path with storage name
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.env
|
141
docker-compose-minio.yaml
Normal file
141
docker-compose-minio.yaml
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
version: '3.7'
|
||||||
|
|
||||||
|
services:
|
||||||
|
balancer:
|
||||||
|
image: nginx
|
||||||
|
hostname: balancer
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
networks:
|
||||||
|
- minio_distributed
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
delay: 10s
|
||||||
|
max_attempts: 10
|
||||||
|
window: 60s
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
- node.role==manager
|
||||||
|
configs:
|
||||||
|
- source: lb.conf
|
||||||
|
target: /etc/nginx/conf.d/lb.conf
|
||||||
|
|
||||||
|
minio1:
|
||||||
|
image: minio/minio:RELEASE.2020-11-13T20-10-18Z
|
||||||
|
hostname: minio1
|
||||||
|
volumes:
|
||||||
|
- minio1-data:/export
|
||||||
|
networks:
|
||||||
|
- minio_distributed
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
delay: 10s
|
||||||
|
max_attempts: 10
|
||||||
|
window: 60s
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
- node.labels.minio1==true
|
||||||
|
command: server http://minio{1...4}/export
|
||||||
|
secrets:
|
||||||
|
- secret_key
|
||||||
|
- access_key
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
minio2:
|
||||||
|
image: minio/minio:RELEASE.2020-11-13T20-10-18Z
|
||||||
|
hostname: minio2
|
||||||
|
volumes:
|
||||||
|
- minio2-data:/export
|
||||||
|
networks:
|
||||||
|
- minio_distributed
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
delay: 10s
|
||||||
|
max_attempts: 10
|
||||||
|
window: 60s
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
- node.labels.minio2==true
|
||||||
|
command: server http://minio{1...4}/export
|
||||||
|
secrets:
|
||||||
|
- secret_key
|
||||||
|
- access_key
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
minio3:
|
||||||
|
image: minio/minio:RELEASE.2020-11-13T20-10-18Z
|
||||||
|
hostname: minio3
|
||||||
|
volumes:
|
||||||
|
- minio3-data:/export
|
||||||
|
networks:
|
||||||
|
- minio_distributed
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
delay: 10s
|
||||||
|
max_attempts: 10
|
||||||
|
window: 60s
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
- node.labels.minio3==true
|
||||||
|
command: server http://minio{1...4}/export
|
||||||
|
secrets:
|
||||||
|
- secret_key
|
||||||
|
- access_key
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
minio4:
|
||||||
|
image: minio/minio:RELEASE.2020-11-13T20-10-18Z
|
||||||
|
hostname: minio4
|
||||||
|
volumes:
|
||||||
|
- minio4-data:/export
|
||||||
|
networks:
|
||||||
|
- minio_distributed
|
||||||
|
deploy:
|
||||||
|
restart_policy:
|
||||||
|
delay: 10s
|
||||||
|
max_attempts: 10
|
||||||
|
window: 60s
|
||||||
|
placement:
|
||||||
|
constraints:
|
||||||
|
- node.labels.minio4==true
|
||||||
|
command: server http://minio{1...4}/export
|
||||||
|
secrets:
|
||||||
|
- secret_key
|
||||||
|
- access_key
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 20s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
minio1-data:
|
||||||
|
minio2-data:
|
||||||
|
minio3-data:
|
||||||
|
minio4-data:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
minio_distributed:
|
||||||
|
driver: overlay
|
||||||
|
|
||||||
|
configs:
|
||||||
|
lb.conf:
|
||||||
|
external: true
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
secret_key:
|
||||||
|
external: true
|
||||||
|
access_key:
|
||||||
|
external: true
|
32
docker-init.sh
Executable file
32
docker-init.sh
Executable file
@@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
[[ ! -f .env ]] && {
|
||||||
|
cp .env.example .env
|
||||||
|
echo "put true envs in .env file"
|
||||||
|
}
|
||||||
|
|
||||||
|
source .env
|
||||||
|
|
||||||
|
VM_NAME="${1:-docker-master}"
|
||||||
|
|
||||||
|
docker-machine rm --force $VM_NAME >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
docker-machine --debug \
|
||||||
|
create \
|
||||||
|
-d proxmoxve \
|
||||||
|
--proxmoxve-proxmox-host $PVE_HOST \
|
||||||
|
--proxmoxve-proxmox-user-name $PVE_USER \
|
||||||
|
--proxmoxve-proxmox-realm $PVE_REALM \
|
||||||
|
--proxmoxve-proxmox-user-password $PVE_PASSWD \
|
||||||
|
--proxmoxve-proxmox-node "$PVE_NODE" \
|
||||||
|
--proxmoxve-vm-cpu-sockets $PVE_CPU \
|
||||||
|
--proxmoxve-vm-memory $PVE_MEMORY \
|
||||||
|
--proxmoxve-vm-image-file $PVE_IMAGE_FILE \
|
||||||
|
--proxmoxve-vm-storage-size $PVE_STORAGE_SIZE \
|
||||||
|
--proxmoxve-vm-storage-type $PVE_STORAGE_TYPE \
|
||||||
|
--proxmoxve-vm-storage-path $PVE_STORAGE_PATH \
|
||||||
|
$VM_NAME
|
||||||
|
|
||||||
|
echo "/================================/"
|
||||||
|
echo "/ VM $VM_NAME is started"
|
||||||
|
echo "/================================/"
|
41
lb.conf
Normal file
41
lb.conf
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
proxy_cache_path /var/cache/nginx/minio_cache levels=1:2 keys_zone=minio_cache:10m max_size=100m inactive=60m use_temp_path=off;
|
||||||
|
|
||||||
|
upstream minio_servers {
|
||||||
|
server minio1:9000;
|
||||||
|
server minio2:9000;
|
||||||
|
server minio3:9000;
|
||||||
|
server minio4:9000;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name minio.local;
|
||||||
|
|
||||||
|
client_max_body_size 1g;
|
||||||
|
sendfile on;
|
||||||
|
|
||||||
|
ignore_invalid_headers off;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
|
||||||
|
proxy_cache minio_cache;
|
||||||
|
add_header X-Cache-Status $upstream_cache_status;
|
||||||
|
proxy_cache_revalidate on;
|
||||||
|
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
|
||||||
|
proxy_cache_lock on;
|
||||||
|
proxy_ignore_headers Set-Cookie;
|
||||||
|
proxy_cache_valid 1m;
|
||||||
|
|
||||||
|
client_body_buffer_size 128k;
|
||||||
|
proxy_connect_timeout 90;
|
||||||
|
proxy_send_timeout 6000;
|
||||||
|
proxy_read_timeout 6000;
|
||||||
|
proxy_buffer_size 4k;
|
||||||
|
proxy_buffers 4 32k;
|
||||||
|
proxy_busy_buffers_size 64k;
|
||||||
|
proxy_temp_file_write_size 128m;
|
||||||
|
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_pass http://minio_servers;
|
||||||
|
}
|
||||||
|
}
|
63
readme.md
Normal file
63
readme.md
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
# Практическая работа по развовоту swarm-кластера на Proxmox VE
|
||||||
|
|
||||||
|
1. развернем кластер
|
||||||
|
2. запустим панель управления
|
||||||
|
3. развернем s3 хранилище с балансировщиком
|
||||||
|
|
||||||
|
## Предустановки
|
||||||
|
|
||||||
|
1. Само собой, имеем уже настроенный Proxmox VE
|
||||||
|
2. На локальной машине ставим docker-machine (`brew install docker-machine` - если у вас MacOS)
|
||||||
|
3. Просаживаем плагин для работы с Proxmox:
|
||||||
|
1. качаем от [сюда](https://github.com/lnxbil/docker-machine-driver-proxmox-ve/releases/download/v4/docker-machine-driver-proxmoxve.macos-amd64)
|
||||||
|
2. даем права на запуск - `chmod +x docker-machine-driver-proxmoxve.macos-amd64`
|
||||||
|
3. перемещаем рабочую папку - `mv docker-machine-driver-proxmoxve.macos-amd64 /usr/local/bin/docker-machine-driver-proxmoxve`
|
||||||
|
4. проверяем, что работает плагин `docker-machine create -d proxmoxve --help` (должен появится листинг параметров плагина)
|
||||||
|
4. качаем образ [докера](https://releases.rancher.com/os/v1.5.1/proxmoxve/rancheros-autoformat.iso) и заливаем его себе в Proxmox
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
1. переименовываем `.env.example` в `.env` и заполняем логопасс от доступа в ваш Proxmox
|
||||||
|
2. запускаем `swarm-init.sh` - он пробуем цепляться в Proxmox и создает 4 машины (одну мастера и 3 воркера - формально, пока просто 4 пустых машины)
|
||||||
|
3. идем на мастер `docker-machine ssh docker-master` и запускаем там:
|
||||||
|
1. `docker swarm init` - создает мастера и инициализирует рой
|
||||||
|
2. `docker swarm join-token worker` - показывает токен, копируем всю строчку в буфер
|
||||||
|
3. `exit` - выходим
|
||||||
|
4. далее, цепляемся к каждому воркеру `docker-machine ssh docker-1` и выполняем команду из буфера
|
||||||
|
5. после инициализации воркеров и идем снова на мастер `docker-machine ssh docker-master` и проверяем что воркеры подцепились `docker node ls`
|
||||||
|
|
||||||
|
## Portainer
|
||||||
|
|
||||||
|
1. на мастере запускаем установку стека
|
||||||
|
1. `wget https://downloads.portainer.io/portainer-agent-stack.yml --output-document portainer-agent-stack.yml`
|
||||||
|
2. `docker stack deploy --compose-file=portainer-agent-stack.yml portainer`
|
||||||
|
3. на мастере подсматриваем айпишник `ifconfig eth0` и идем на веб-морду http://ip:9000
|
||||||
|
|
||||||
|
## Minio
|
||||||
|
|
||||||
|
1. на мастере
|
||||||
|
1. создаем секреты (само собой - свои, а не из примера)
|
||||||
|
1. `echo "AKIAIOSFODNN7EXAMPLE" | docker secret create access_key -`
|
||||||
|
2. `echo "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" | docker secret create secret_key -`
|
||||||
|
2. проставляем метки на воркеры
|
||||||
|
1. `docker node update --label-add minio1=true docker-master`
|
||||||
|
2. `docker node update --label-add minio2=true docker-2`
|
||||||
|
3. `docker node update --label-add minio3=true docker-3`
|
||||||
|
4. `docker node update --label-add minio4=true docker-1`
|
||||||
|
3. импортируем
|
||||||
|
4. в конфиги файлик `lb.conf` и называем его там так же `lb.conf`
|
||||||
|
5. запускает новый стек используя код из файла `docker-compose-minio.yaml` и называем стек `minio`
|
||||||
|
6. стек поднимет 4 независимые реплики minio со своими дисками на каждой их четырех нод и одну реплику nginx на мастер-ноде, выставит ингресс-линк на порте `8080`
|
||||||
|
7. доменное имя для minio выглядит как `minio.local` (можно поменять в lb.conf перед его импортом), не забудьте прописать его у себя в /etc/hosts на айпишники нод (или хотя бы мастер-ноды)
|
||||||
|
|
||||||
|
|
||||||
|
## Чистим за собой
|
||||||
|
1. `./swarm-rm.sh`
|
||||||
|
|
||||||
|
## Видео к курсу
|
||||||
|
- [видео]()
|
||||||
|
|
||||||
|
##### Автор
|
||||||
|
- **Vassiliy Yegorov** [vasyakrg](https://github.com/vasyakrg)
|
||||||
|
- [сайт](vk.com/realmanual)
|
||||||
|
- [youtube](youtube.com/realmanual)
|
7
swarm-init.sh
Executable file
7
swarm-init.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
./docker-init.sh
|
||||||
|
|
||||||
|
./docker-init.sh docker-1
|
||||||
|
./docker-init.sh docker-2
|
||||||
|
./docker-init.sh docker-3
|
3
swarm-rm.sh
Executable file
3
swarm-rm.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
docker-machine rm docker-master docker-1 docker-2 docker-3
|
Reference in New Issue
Block a user