Kādā brīdī es aizdomājos par sava projekta izvietošanas automatizāciju. gitlab.com labprāt nodrošina visus rīkus tam, un es, protams, nolēmu izmantot, izpratnē un uzrakstot nelielu izvietošanas scenāriju. Šajā rakstā dalos ar savu pieredzi ar kopienu.
TL;DR
- Iestatīt VPS: atslēgt root, ieeja ar paroli, uzstādīt dockerd, konfigurēt ufw
- Generēt sertifikātus serverim un klientam Ieslēgt dockerd pārvaldību, izmantojot TCP socket: no konfigurācijas jānoņem opcija -H fd://.
- Прописать пути до сертификатов в docker.json
- Jāieraksta mainīgajos gitlab CI/CD iestatījumos sertifikātu saturs. Jāuzraksta .gitlab-ci.yml skripts izvietošanai.
Visus piemērus es rādīšu uz Debian distribūcijas.
Pirmais VPS iestatījums
Jūs esat iegādājies instance, piemēram, pie , pirmais, kas jādara, ir aizsargāt savu serveri no agresīvā ārējā pasaules. Es neko pierādīt negribu un neapgalvoju, vienkārši parādīšu žurnālu /var/log/messages no sava virtuālā servera:
Ekrānuzņēmums
Vispirms uzstādām ugunsmūri ufw:
apt-get update && apt-get install ufwIeslēgsim noklusējuma politiku: bloķējam visus ienākošos savienojumus, atļaujam visus izejošos savienojumus:
ufw default deny incoming
ufw default allow outgoingSvarīgi: neaizmirstiet atļaut savienojumu pa ssh:
ufw allow OpenSSHVispārējā sintakse ir šāda: atļaut savienojumu pa portu: ufw allow 12345, kur 12345 ir portu numurs vai pakalpojuma nosaukums. Aizliegt: ufw deny 12345
Ieslēdzam ugunsmūri:
ufw enableIziet no sesijas un vēlreiz pieslēgties, izmantojot ssh.
Pievienojiet lietotāju, piešķiriet tam paroli un pievienojiet to sudo grupai.
apt-get install sudo
adduser scoty
usermod -aG sudo scotyTālāk plāns ir atslēgt ieeju ar paroli. Lai to izdarītu, kopējiet savu ssh atslēgu uz serveri:
ssh-copy-id root@10.101.10.28servera IP jānorāda jūsu. Tagad mēģiniet pieslēgties ar iepriekš izveidoto lietotāju, paroli vairs nav jāievada. Tālāk konfigurācijas iestatījumos nomainām sekojošo:
sudo nano /etc/ssh/sshd_configatzīmējam ieejas atslēgšanu ar paroli:
PasswordAuthentication noPārstartējam sshd demon:
sudo systemctl reload sshdTagad, ja jūs vai kāds cits mēģinās ieiet ar root lietotāju, tam nekas nesanāks.
Tālāk uzstādam dockerd, šeit es procesu aprakstīt vairs neplānoju, jo viss var būt jau mainīts, dodieties uz oficiālo vietni un izpildiet soļus docker uzstādīšanai uz jūsu virtuālā datora:
Sertifikātu ģenerēšana
Lai attālināti pārvaldītu Docker deamonu, ir nepieciešama šifrēta TLS savienojums. Tam ir nepieciešams sertifikāts un atslēga, kurus ir jāģenerē un jāpārnes uz jūsu attālināto mašīnu. Izpildiet oficiālajā Docker tīmekļa vietnē sniegtos norādījumus: Visus ģenerētos *.pem failus serverim, proti, ca.pem, server.pem, key.pem, jāpārvieto direktorijā /etc/docker uz servera.
dockerd konfigurācija
Docker deamona startēšanas skriptā noņemam opciju -H df://, šī opcija nosaka, kādā hostā var pārvaldīt Docker deamonu.
# At /lib/systemd/system/docker.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerdTālāk jāizveido iestatījumu fails, ja tāda vēl nav, un jānorāda opcijas:
/etc/docker/docker.json
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2376"
],
"labels": [
"is-our-remote-engine=true"
],
"tls": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server.pem",
"tlskey": "/etc/docker/key.pem",
"tlsverify": true
}Atļausim savienojumus pa 2376 portu:
sudo ufw allow 2376Pārliecināsimies, ka dockerd tiek restartēts ar jaunajiem iestatījumiem:
sudo systemctl daemon-reload && sudo systemctl restart dockerPārbaudīsim:
sudo systemctl status dockerJa viss ir „zaļš”, uzskatām, ka serverī mēs veiksmīgi esam konfigurējuši Docker.
Continuous Delivery konfigurācija GitLabā
Lai GitLab darba izpildītājs varētu veikt komandas attālinātajā Docker hostā, ir jānosaka, kā un kur glabāt sertifikātus un atslēgu šifrētajam savienojumam ar dockerd. Es šo problēmu atrisināju, vienkārši ierakstot iestatījumos GitLab mainīgajos:
Spoileru virsraksts
Vienkārši izvadiet sertifikātu un atslēgas saturu ar cat: cat ca.pem. Nokopējiet un ielīmējiet mainīgo vērtībās.
Izveidosim skriptu izvietošanai ar GitLab. Tiks izmantots docker-in-docker (dind) attēls.
.gitlab-ci.yml
image:
name: docker/compose:1.23.2
# pārakstīsim entrypoint, lai darbotos dind
entrypoint: ["/bin/sh", "-c"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
services:
- docker:dind
stages:
- deploy
deploy:
stage: deploy
script:
- bin/deploy.sh # izvietošanas skripts šeit
Izvietošanas skripta saturs ar komentāriem:
bin/deploy.sh
#!/usr/bin/env sh
# Падаем сразу, если возникли какие-то ошибки
set -e
# Выводим, то , что делаем
set -v
#
DOCKER_COMPOSE_FILE=docker-compose.yml
# Куда деплоим
DEPLOY_HOST=185.241.52.28
# Путь для сертификатов клиента, то есть в нашем случае - gitlab-воркера
DOCKER_CERT_PATH=/root/.docker
# проверим, что в контейнере все имеется
docker info
docker-compose version
# создаем путь (сейчас работаем в клиенте - воркере gitlab'а)
mkdir $DOCKER_CERT_PATH
# изымаем содержимое переменных, при этом удаляем лишние символы добавленные при сохранении переменных.
echo "$CA_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/ca.pem
echo "$CERT_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/cert.pem
echo "$KEY_PEM" | tr -d 'r' > $DOCKER_CERT_PATH/key.pem
# на всякий случай даем только читать
chmod 400 $DOCKER_CERT_PATH/ca.pem
chmod 400 $DOCKER_CERT_PATH/cert.pem
chmod 400 $DOCKER_CERT_PATH/key.pem
# далее начинаем уже работать с удаленным docker-демоном. Собственно, сам деплой
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST=tcp://$DEPLOY_HOST:2376
# проверим, что коннектится все успешно
docker-compose
-f $DOCKER_COMPOSE_FILE
ps
# логинимся в docker-регистри, тут можете указать свой "местный" регистри
docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
docker-compose
-f $DOCKER_COMPOSE_FILE
pull app
# поднимаем приложение
docker-compose
-f $DOCKER_COMPOSE_FILE
up -d app
Galvenā problēma bija „izvilkt” no GitLab CI/CD mainīgajiem sertifikātu saturu normālā veidā. Es nevarēju saprast, kāpēc savienojums ar attālināto hostu nedarbojās. Uz hosta pārbaudīju žurnālu sudo journalctl -u docker, tur bija kļūda rokas spiedienā. Izdomāju paskatīties, kas vispār glabājas mainīgajos, to var izdarīt tā: cat -A $DOCKER_CERT_PATH/key.pem. Kļūdu novēršu, pievienojot neskatīšanas simbolu (carriage return) tr -d ' '.
Tālāk scenārijā varat pievienot pēcizlaiduma uzdevumus pēc saviem ieskatiem. Ar darba versiju varat iepazīties manā repozitorijā.
Avots: habr.com
