GitLab autoscaling
1. Miért van rá szükség
A GitLab által nyújtott VM-ek a CI-hoz gyengébbek, lassabbak és drágábbak, mintha saját VM parkot tartanánk fenn a jobok futtatására, viszont a GitLab megoldásának előnye, hogy perc alapon számláz. (Így csak akkor kerül költségbe amennyiban ténylegesen használjuk.)
Annak érdekében, hogy a GitLab által nyújtott szolgáltatás előnyeit megtartva, de ahhoz képest olcsóbban/skálázhatóbban tudjunk működni, ezért van szükség az autoscaling manager megoldásra.
Ezzel a megoldással elérhető, hogy bármennyi runner rendelkezésünkre állhasson, csak akkor fussanak, amikor ténylegesen használatban vannak, továbbá ha erősebb gépekre lenne szükségünk, akkor azt is lehetséges legyen konfigurálni.
2. Hogyan épül fel
Van 2db manager VM ami 24/7 fut, ez a VM kommunikál a GitLab-bal és figyeli, hogy valamelyik projekten indulna-e job.
Annak érdekében van 2 manager, hogy tudjunk futtatni 2 különböző méretű gépet a jobokhoz. (t3.medium és t3.large)
-
Ha indulna job és már létezik szabad saját runner, akkor annak a gépnek delegálja a feladatot.
-
Ha még nem áll rendelkezésre gép, akkor elindít egy új VM-et, amire telepíti a gitlab runnert, majd ennek a gépnek delegálja a feladatot.
Részletesebben itt lehet róla olvasni.
3. Hogyan kell a managert konfigurálni
3.1 Telepítsük a leírás szerint
Már telepítve vannak N. Virginiában, a VM-ek neve: gitlab-autoscaling-manager-medium és gitlab-autoscaling-manager-large , de itt olvasható, hogyan kellene telepíteni.
A managerek és a runnerek is N.Virginiában futnak, mert ott olcsóbbak a gépek és a latency nem számít a runnerek esetében.
3.2 Konfigurációs fájl
A VM-en az /etc/gitlab-runner/config.toml fájlban tekinthető meg a config, ami a következőképpen néz ki:
3.2.1 Medium gépek managere
concurrent = 15 # ez határozza meg mennyi párhuzamos job futhat összesen, gépenként 1-et engedünk
check_interval = 0
[session_server]
# listen_address = "[::]:8093" # listen on all available interfaces on port 8093 # 409 Conflict hiba esetén legyen ez a sor kikommentezve
session_timeout = 1800
[[runners]]
name = "autoscaling-manager-medium"
url = "https://gitlab.com/"
token = ""
executor = "docker+machine"
output_limit = 40960
limit = 15 # ez határozza meg mennyi runner gép futhat összesen
[runners.custom_build_dir]
[runners.cache]
Type = "s3"
Path = "ci-cache"
Shared = true
[runners.cache.s3]
ServerAddress = "s3.amazonaws.com"
AccessKey = "" #AWS IAM gitlab-autoscaling-manager access-key
SecretKey = "" #AWS IAM gitlab-autoscaling-manager secret-key
BucketName = "gbs-gitlab-autoscaling" #AWS admin -> s3 -> buckets
[runners.docker]
tls_verify = false
image = "alpine"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
[runners.machine]
IdleCount = 0
IdleTime = 120
IdleScaleFactor = 0.0
IdleCountMin = 0
MaxBuilds = 1000
MaxGrowthRate = 1
MachineDriver = "amazonec2"
MachineName = "gitlab-runner-medium--%s"
MachineOptions = [
"amazonec2-ami=ami-09d56f8956ab235b3",
"amazonec2-access-key=", #AWS IAM gitlab-autoscaling-manager access-key
"amazonec2-secret-key=", #AWS IAM gitlab-autoscaling-manager secret-key
"amazonec2-region=us-east-1",
"amazonec2-vpc-id=vpc-d6bc02ac",
"amazonec2-subnet-id=subnet-e0a1c387",
"amazonec2-zone=c",
"amazonec2-use-private-address=true",
"amazonec2-tags=project,gitlab,environment,develop,application,ci-runner",
"amazonec2-security-group=gitlab-autoscaling-runner",
"amazonec2-root-size=30",
"amazonec2-instance-type=t3.medium",
]
[[runners.machine.autoscaling]] # ez a bekezdés írja le, hogy hétköznap 8-19 között mennyi gép fut minimum
Periods = ["* * 9-18 * * mon-fri *"]
IdleCount = 2
IdleTime = 300
Timezone = "Europe/Budapest"
3.2.2 Large gépek managere
concurrent = 10 # ez határozza meg mennyi párhuzamos job futhat összesen, gépenként 1-et engedünk
check_interval = 0
[session_server]
listen_address = "[::]:8093" # listen on all available interfaces on port 8093 # 409 Conflict hiba esetén legyen ez a sor kikommentezve
session_timeout = 1800
[[runners]]
name = "autoscaling-manager-large"
url = "https://gitlab.com/"
token = ""
executor = "docker+machine"
output_limit = 40960
limit = 10 # ez határozza meg mennyi runner gép futhat összesen
[runners.custom_build_dir]
[runners.cache]
Type = "s3"
Path = "ci-cache"
Shared = true
[runners.cache.s3]
ServerAddress = "s3.amazonaws.com"
AccessKey = "" #AWS IAM gitlab-autoscaling-manager access-key
SecretKey = "" #AWS IAM gitlab-autoscaling-manager secret-key
BucketName = "gbs-gitlab-autoscaling"
[runners.docker]
tls_verify = false
image = "alpine"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
[runners.machine]
IdleCount = 0
IdleTime = 120
IdleScaleFactor = 0.0
IdleCountMin = 0
MaxBuilds = 1000
MaxGrowthRate = 1
MachineDriver = "amazonec2"
MachineName = "gitlab-runner-large--%s"
MachineOptions = [
"amazonec2-ami=ami-09d56f8956ab235b3",
"amazonec2-access-key=", #AWS IAM gitlab-autoscaling-manager access-key
"amazonec2-secret-key=", #AWS IAM gitlab-autoscaling-manager secret-key
"amazonec2-region=us-east-1",
"amazonec2-vpc-id=vpc-d6bc02ac",
"amazonec2-subnet-id=subnet-e0a1c387",
"amazonec2-zone=c",
"amazonec2-use-private-address=true",
"amazonec2-tags=project,gitlab,environment,develop,application,ci-runner",
"amazonec2-security-group=gitlab-autoscaling-runner",
"amazonec2-root-size=30",
"amazonec2-instance-type=t3.large",
]
[[runners.machine.autoscaling]] # ez a bekezdés írja le, hogy hétköznap 8-19 között mennyi gép fut minimum
Periods = ["* * 9-18 * * mon-fri *"]
IdleCount = 2
IdleTime = 300
Timezone = "Europe/Budapest"
A konfigurációs fájl szerkesztése
Ha szerkesztjük a fájlt, akkor nem szükséges semmilyen restart, automatikusan életre lép az új konfig.
4. VM hol érhető el
Jelenleg a következő embereknek van a géphez root hozzáférése:
- Katona Áron (fő felelőse)
- Sevcsik-Zajácz András
- Kazsik Ádám
- Ivanics Ádám
- Surányi Ákos
SSH-n keresztül csatlakozni a gép aktuális IP-je, vagy a következő domain segítségével lehetséges: gitlab-autoscaling-manager.dev.gbsolutions.io
5. Gyakran használt parancsok
Miután SSH-n keresztül csatlakoztunk a manager-hez a következő parancsokat szoktuk használni:
-
Milyen runnereket lát a manager:
-
Logok megtekintése, hogy lássuk mit csinál a manager: