test2
5 years ago
2 changed files with 387 additions and 0 deletions
After Width: | Height: | Size: 106 KiB |
@ -0,0 +1,387 @@ |
|||||
|
= Swarm Storage HowTo! |
||||
|
Apostolos rootApostolos@swarmlab.io |
||||
|
:description: IoT Εισαγωγή στο Cloud |
||||
|
:keywords: Cloud, swarm |
||||
|
:data-uri: |
||||
|
:toc: right |
||||
|
:toc-title: Πίνακας περιεχομένων |
||||
|
:toclevels: 4 |
||||
|
:source-highlighter: coderay |
||||
|
:icons: font |
||||
|
:sectnums: |
||||
|
|
||||
|
include::header.adoc[] |
||||
|
|
||||
|
|
||||
|
{empty} + |
||||
|
|
||||
|
== Install Minio |
||||
|
|
||||
|
=== Create Docker secrets for MinIO |
||||
|
|
||||
|
.create secrets |
||||
|
[source,sh] |
||||
|
---- |
||||
|
KEY=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n' ; echo) |
||||
|
SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n' ; echo) |
||||
|
echo $KEY > key |
||||
|
echo $SECRET > secret |
||||
|
echo $KEY | docker secret create access_key - |
||||
|
echo $SECRET | docker secret create secret_key - |
||||
|
---- |
||||
|
|
||||
|
|
||||
|
|
||||
|
=== Create node labels |
||||
|
|
||||
|
.create labels |
||||
|
[source,sh] |
||||
|
---- |
||||
|
docker node update --label-add minio1=true [node-name] // <1> |
||||
|
docker node update --label-add minio2=true [node-name] |
||||
|
docker node update --label-add minio3=true [node-name] |
||||
|
docker node update --label-add minio4=true [node-name] |
||||
|
|
||||
|
docker node update --label-add group==minio [node-name] //<2> |
||||
|
docker node update --label-add group==minio [node-name] |
||||
|
---- |
||||
|
<1> node name from command: docker node ls e.g. *snf-12118* (minio) |
||||
|
<2> node name from command: docker node ls e.g. *snf-12118* (proxy) |
||||
|
|
||||
|
|
||||
|
=== Generate a Certificate |
||||
|
|
||||
|
.Create a configuration file (openssl.conf) |
||||
|
[source,sh] |
||||
|
---- |
||||
|
[req] |
||||
|
distinguished_name = req_distinguished_name |
||||
|
x509_extensions = v3_req |
||||
|
prompt = no |
||||
|
|
||||
|
[req_distinguished_name] |
||||
|
C = US //<1> |
||||
|
ST = VA //<1> |
||||
|
L = Somewhere //<1> |
||||
|
O = MyOrg //<1> |
||||
|
OU = MyOU //<1> |
||||
|
CN = MyServerName //<1> |
||||
|
|
||||
|
[v3_req] |
||||
|
subjectAltName = @alt_names |
||||
|
|
||||
|
[alt_names] |
||||
|
IP.1 = 127.0.0.1 //<2> |
||||
|
---- |
||||
|
<1> change to the correct values |
||||
|
<2> change to the correct IP address |
||||
|
|
||||
|
.Run openssl and specify the configuration file |
||||
|
[source,sh] |
||||
|
---- |
||||
|
openssl req -x509 -nodes -days 730 -newkey rsa:2048 -keyout private.key -out public.crt -config openssl.conf |
||||
|
---- |
||||
|
|
||||
|
|
||||
|
=== Create Yaml file |
||||
|
|
||||
|
.docker-compose |
||||
|
[source,yaml] |
||||
|
---- |
||||
|
services: |
||||
|
minio1: //<1> |
||||
|
image: minio/minio:RELEASE.2020-04-10T03-34-42Z //<2> |
||||
|
hostname: minio1 |
||||
|
volumes: |
||||
|
- minio1-data:/export //<3> |
||||
|
ports: |
||||
|
- "9001:9000" //<4> |
||||
|
networks: |
||||
|
- minio_distributed //<5> |
||||
|
deploy: |
||||
|
restart_policy: |
||||
|
delay: 10s |
||||
|
max_attempts: 10 |
||||
|
window: 60s |
||||
|
placement: |
||||
|
constraints: |
||||
|
- node.labels.minio1==true //<6> |
||||
|
command: server http://minio{1...4}/export //<7> |
||||
|
secrets: //<8> |
||||
|
- secret_key |
||||
|
- access_key |
||||
|
healthcheck: |
||||
|
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] //<9> |
||||
|
interval: 30s |
||||
|
timeout: 20s |
||||
|
retries: 3 |
||||
|
|
||||
|
minio2: //<10> |
||||
|
image: minio/minio:RELEASE.2020-04-10T03-34-42Z |
||||
|
hostname: minio2 //<10> |
||||
|
volumes: |
||||
|
- minio2-data:/export //<11> |
||||
|
ports: |
||||
|
- "9002:9000" //<12> |
||||
|
networks: |
||||
|
- minio_distributed //<5> |
||||
|
deploy: |
||||
|
restart_policy: |
||||
|
delay: 10s |
||||
|
max_attempts: 10 |
||||
|
window: 60s |
||||
|
placement: |
||||
|
constraints: |
||||
|
- node.labels.minio2==true //<13> |
||||
|
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-04-10T03-34-42Z |
||||
|
hostname: minio3 |
||||
|
volumes: |
||||
|
- minio3-data:/export |
||||
|
ports: |
||||
|
- "9003:9000" |
||||
|
networks: |
||||
|
- minio_distributed //<5> |
||||
|
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-04-10T03-34-42Z |
||||
|
hostname: minio4 |
||||
|
volumes: |
||||
|
- minio4-data:/export |
||||
|
ports: |
||||
|
- "9004:9000" |
||||
|
networks: |
||||
|
- minio_distributed //<5> |
||||
|
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 |
||||
|
|
||||
|
web: |
||||
|
image: nginx:1.17.9-alpine |
||||
|
deploy: |
||||
|
mode: replicated |
||||
|
restart_policy: |
||||
|
delay: 10s |
||||
|
max_attempts: 10 |
||||
|
window: 60s |
||||
|
replicas: 2 |
||||
|
placement: |
||||
|
max_replicas_per_node: 1 |
||||
|
constraints: |
||||
|
- node.labels.group==minio //<14> |
||||
|
ports: |
||||
|
- "8080:80" |
||||
|
- "9443:443" |
||||
|
volumes: //<15> |
||||
|
- /PATH_to_FILE/minio.conf:/etc/nginx/conf.d/default.conf //<16> |
||||
|
- /PATH_to_FILE/public.crt:/etc/nginx/public.crt //<17> |
||||
|
- /PATH_to_FILE/private.key:/etc/nginx/private.key //<17> |
||||
|
networks: |
||||
|
- minio_distributed //<5> |
||||
|
|
||||
|
|
||||
|
volumes: |
||||
|
minio1-data: |
||||
|
|
||||
|
minio2-data: |
||||
|
|
||||
|
minio3-data: |
||||
|
|
||||
|
minio4-data: |
||||
|
|
||||
|
|
||||
|
networks: |
||||
|
minio_distributed: //<5> |
||||
|
driver: overlay |
||||
|
|
||||
|
secrets: |
||||
|
secret_key: |
||||
|
external: true |
||||
|
access_key: |
||||
|
external: true |
||||
|
|
||||
|
---- |
||||
|
<1> Service name |
||||
|
<2> Image name |
||||
|
<3> Volume to Use |
||||
|
<4> Expose port |
||||
|
<5> Network to Use |
||||
|
<6> Node Placement |
||||
|
<7> Start server |
||||
|
<8> insert secrets |
||||
|
<9> health check command |
||||
|
<10> *NEW* Service name |
||||
|
<11> *NEW* Volume |
||||
|
<12> *NEW* Port |
||||
|
<13> *NEW* Label |
||||
|
<14> Node Placement (Proxy) |
||||
|
<15> Bind mount config files |
||||
|
<16> Nginx config file |
||||
|
<17> ssl keys |
||||
|
|
||||
|
|
||||
|
|
||||
|
=== Create config file (proxy) |
||||
|
|
||||
|
.nginx config |
||||
|
[source,yaml] |
||||
|
---- |
||||
|
upstream minio_servers { |
||||
|
server minio1:9000; //<1> |
||||
|
server minio2:9000; //<1> |
||||
|
server minio3:9000; //<1> |
||||
|
server minio4:9000; //<1> |
||||
|
} |
||||
|
proxy_cache_path /var/tmp levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; |
||||
|
server { |
||||
|
listen 80; |
||||
|
server_name name.example.org; //<2> |
||||
|
return 301 https://name.example.org$request_uri; // <3> |
||||
|
} |
||||
|
server { |
||||
|
listen 443 ssl; |
||||
|
server_name name.example.org; |
||||
|
|
||||
|
# To allow special characters in headers |
||||
|
ignore_invalid_headers off; |
||||
|
# Allow any size file to be uploaded. |
||||
|
# Set to a value such as 1000m; to restrict file size to a specific value |
||||
|
client_max_body_size 0; |
||||
|
# To disable buffering |
||||
|
proxy_buffering off; |
||||
|
|
||||
|
ssl_certificate /etc/nginx/public.crt; //<4> |
||||
|
ssl_certificate_key /etc/nginx/private.crt; //<4> |
||||
|
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; |
||||
|
ssl_ciphers HIGH:!aNULL:!MD5; |
||||
|
|
||||
|
location / { |
||||
|
proxy_cache my_cache; |
||||
|
proxy_set_header X-Real-IP $remote_addr; |
||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
||||
|
proxy_set_header X-Forwarded-Proto $scheme; |
||||
|
proxy_set_header Host $http_host; |
||||
|
|
||||
|
proxy_set_header X-NginX-Proxy true; |
||||
|
proxy_ssl_session_reuse off; |
||||
|
proxy_redirect off; |
||||
|
|
||||
|
|
||||
|
proxy_connect_timeout 300; |
||||
|
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1 |
||||
|
proxy_http_version 1.1; |
||||
|
proxy_set_header Connection ""; |
||||
|
chunked_transfer_encoding off; |
||||
|
|
||||
|
#proxy_pass http://minio1:9000; # If you are using docker-compose this would be the hostname i.e. minio |
||||
|
proxy_pass http://minio_servers; // <5> |
||||
|
# Health Check endpoint might go here. See https://www.nginx.com/resources/wiki/modules/healthcheck/ |
||||
|
# /minio/health/live; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
---- |
||||
|
<1> Service names from yaml |
||||
|
<2> Server name or IP |
||||
|
<3> Redirect to https |
||||
|
<4> keys |
||||
|
<5> pass to servers |
||||
|
|
||||
|
=== Copy files to nodes |
||||
|
|
||||
|
.cp files |
||||
|
[source,yaml] |
||||
|
---- |
||||
|
scp minio.conf zeus@*ip*:/PATH_to_FILE/minio.conf // <1> |
||||
|
scp minio.conf zeus@*ip*:/PATH_to_FILE/minio.conf // <1> |
||||
|
---- |
||||
|
<1> change *ip* (see <2> in http://docs.swarmlab.io/lab/swarm-volumes-storage-howto.adoc#_create_node_labels[create_node_labels]) and *PATH_to_FILE* (see <16> in http://docs.swarmlab.io/lab/swarm-volumes-storage-howto.adoc#_create_yaml_file[create_yaml_file]) |
||||
|
|
||||
|
|
||||
|
=== deploy |
||||
|
|
||||
|
.stack deploy |
||||
|
[source,yaml] |
||||
|
---- |
||||
|
docker stack deploy --compose-file=docker-compose.yaml minio_stack |
||||
|
---- |
||||
|
|
||||
|
=== Test MinIO in Browser |
||||
|
|
||||
|
Point your web browser to http://ip:9443 |
||||
|
|
||||
|
image:./minio-browser.png[] |
||||
|
|
||||
|
== Install tools |
||||
|
|
||||
|
|
||||
|
=== Install AWS CLI |
||||
|
|
||||
|
Universal Command Line Interface for Amazon Web Services |
||||
|
|
||||
|
.aws cli |
||||
|
[source,sh] |
||||
|
---- |
||||
|
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" |
||||
|
unzip awscliv2.zip |
||||
|
sudo ./aws/install |
||||
|
---- |
||||
|
|
||||
|
The AWS Command Line Interface (AWS CLI) is an open source tool that enables you to interact with AWS services using commands in your command-line shell |
||||
|
|
||||
|
|
||||
|
=== Install mc client |
||||
|
|
||||
|
MinIO Client (mc) provides a modern alternative to UNIX commands like ls, cat, cp, mirror, diff, find etc. It supports filesystems and Amazon S3 compatible cloud storage service (AWS Signature v2 and v4). |
||||
|
|
||||
|
.mc |
||||
|
[source,yaml] |
||||
|
---- |
||||
|
wget https://dl.min.io/client/mc/release/linux-amd64/mc |
||||
|
chmod +x mc |
||||
|
./mc --help |
||||
|
---- |
||||
|
|
||||
|
|
||||
|
|
Loading…
Reference in new issue