Maskirane jedinice: Zašto se orkestratori ponovno pokreću i kontrolirati
U Linux‑sustavima sistemd je najčešće korišten servisni menadžer. Jedna od njegovih značajki je maskiranje jedinice – to je način da se sistemd obavijesti da ne želi pokrenuti određeni servis ili uslugu. Maskiranje se obično radi povezivanjem jedinice na /dev/null, čime se onemogućuje bilo kakav pokretni proces.
Međutim, u modernim okruženjima – posebno u kontejnerskim orkestratorima poput Kubernetes, OpenShift ili Docker Swarm – maskirane jedinice ne ostaju nepokrenute. Orkestratori i agenti za upravljanje konfiguracijom (npr. Ansible, Chef, Puppet) često ne uzimaju u obzir maskiranje i nastavljaju pokušavati pokrenuti servis. Rezultat je da se maskirane jedinice „obnavljaju“ ili ponovno postavljaju u aktivno stanje, što može uzrokovati neočekivane greške ili sigurnosne propuste.
Zašto se maskirane jedinice vraćaju?
- Neodgovarajući konfiguracijski agent: Agent koji upravlja konfiguracijom može biti postavljen da automatski pokrene sve jedinice, bez obzira na maskiranje. To je često slučaj u DevOps‑pipeline‑ima gdje se želi osigurati da sve usluge rade.
- Orkestrator s vlastitim pravilima: Kubernetes, na primjer, koristi
initContainersisidecarkontejnere koji mogu pokrenuti sistemd unutar podova, ignorirajući maskiranje na hostu. - Watchdog i recovery mehanizmi: Uređaji poput systemd‑service‑watchdog ili custom scripts često provjeravaju status servisa i automatski ga restartuju ako je neaktivni.
- Konflikt između hosta i kontejnera: Maskiranje na hostu ne utječe na jedinice unutar kontejnera, pa se unutar kontejnera može pokrenuti ista usluga.
Kako kontrolirati maskirane jedinice u orkestratorima?
1. Koristite labeling i selektore: U Kubernetesu možete označiti resurse systemd.mask=true i koristiti nodeSelector ili taints da izbjegnete pokretanje maskiranih servisa na određenim čvorovima.
2. Konfigurirajte agent: U Ansible‑playbooku ili Chef‑recipe‑u postavite systemd_unit { name: "myservice", masked: true } kako bi agent znao da ne pokreće servis.
3. Koristite systemctl mask unutar kontejnera: Ako je servis unutar kontejnera, možete ga maskirati unutar samog kontejnera kako bi se izbjeglo njegovo pokretanje.
4. Implementirajte watchdog‑policy: U postavkama watchdog‑a postavite WatchdogSec=0 ili Restart=no za maskirane jedinice.
Primjer: Maskiranje u Kubernetesu
Recimo da imate servis nginx.service koji želite maskirati na svim čvorovima. U vašem deployment‑file‑u dodajte:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
systemd.mask: "true"
spec:
containers:
- name: nginx
image: nginx:latest
command: ["/bin/sh", "-c", "systemctl mask nginx.service && nginx -g 'daemon off;'"]
Ovaj pristup osigurava da se nginx.service maskira prije pokretanja samog Nginx‑a, čime se sprječava bilo kakav konflikt s host‑sistemd‑om.
Zaključak
Maskiranje je moćan alat za upravljanje sistemd jedinicama, ali u orkestriranim okruženjima zahtijeva dodatnu pažnju. Pravilnim konfiguriranjem agenata, orkestratora i watchdog‑a, možete osigurati da maskirane jedinice ostanu onemogućene i da se izbjegnu neočekivani restartovi.
Zanima vas ovakva AI tehnologija?
RiNET gradi sovereign AI rjesenja za javni sektor i poduzeca - od civic intelligence do automatizacije nabave.
Kontaktirajte nas →
Komentari