Railshot
AI deployment & operations platform
Vietoje sukurtą žiniatinklio programą įdiegti į paruoštas debesų ir vietines aplinkas, o paskui ją eksploatuoti.
DI diegimo ir eksploatacijos platforma, kuri vietoje sukurtą žiniatinklio programą perkelia į paruoštas debesų ar vietines aplinkas ir toliau ją eksploatuoja.
Eksploatacijos ir klientų programų klasteriai atskirti, o viešas kelias laikomas atskirai nuo diegimo valdymo.
Eksploatacijos K3s informacinis skydelis, produkto API ir build controller išdėstyti platform vaidmens mazguose, o runner Job – build vaidmens mazge, tuo tarpu diegimą atlieka Argo CD. Klientų programos veikia nurodytoje vardų srityje atskirame vieno mazgo K3s + Cilium klasteryje kiekvienam užregistruotam taikiniui.
Build → atvaizdo publikavimas
Produkto API prašo GitHub Actions paleidimo, o runner build mazge paima ir patikrina job. Tik tą pačių patikrų praėjusį bundle į GHCR publikuoja GitHub-hosted release job.
produkto API · cd.js → bridge.py
railshot-systempaleisti · taikyti: workflow_dispatchloop job · self-hosted runnerrailshot-deploy.ymlProdukto API prašo GitHub Actions paleidimo su tenant, app, šaltinio komitu ir taikiniu. API niekada tiesiogiai nekviečia runner Job.
build controller · CronJob
railshot-systempaleisti · taikyti: papildyti runner Jobrunner Job · hostNetwork · Docker socketrailshot-buildBuild controller CronJob (kas minutę, platform mazge) kuria runner Job vardų srityje railshot-build. Jo Role leidžia tik Job get, list ir create bei get, update ir patch vienam runner registracijos Secret; jis negali kurti vardų sričių ar kitų Secret.
runner Job · hostNetwork · Docker socket
railshot-buildpaleisti · taikyti: paimti jobloop job · self-hosted runnerrailshot-deploy.ymlRunner build vaidmens mazge (tikslus hostname, NoSchedule toleration) paima loop job pagal self-hosted žymes ir jį vykdo. Kliento šaltinis vykdomas esamuose apribotuose Docker build ir patikros konteineriuose.
runner Job · hostNetwork · Docker socket
railshot-buildduomenys: patikrintas bundlerelease job · GitHub-hostedrailshot-deploy.ymlLoop job palieka bundle, praėjusį tas pačias patikras, o release job paima tik tą bundle.
release job · GitHub-hosted
railshot-deploy.ymlduomenys: publikuoti pagal maišąGHCRGitHub-hosted release job (ubuntu-24.04) patikrinto bundle atvaizdą publikuoja į GHCR jo neperkurdamas. Atvaizdai niekada nepublikuojami klientų programų klasterio viduje.
Config Git → Argo → kliento vardų sritis
Config Git neša norimus išteklius, o GHCR – atvaizdo baitus. Argo CD pakeitimus taiko tik užregistruotai kliento vardų sričiai.
produkto API · cd.js → bridge.py
railshot-systemduomenys: workload commit · pushconfig Git saugyklacd.js paleidžia bridge.py, kuris komituoja ir išstumia workload.json tik tada, kai publikacijos įrašas ir užregistruotas taikinys sutampa, o tada perskaito nuotolinę reviziją. Git neša norimus išteklius; GHCR neša atvaizdo baitus.
config Git saugykladuomenys: revisionArgo CD · Application
argocdApplication skaito tik savo apribotą konfigūracijos saugyklą, kelią ir reviziją.
produkto API · cd.js → bridge.py
railshot-systempaleisti · taikyti: Application syncArgo CD · ApplicationargocdĮvardytas Application nustatomas per server-side apply, ir prašoma vienos tikslios revizijos sinchronizavimo be prune. Produkto API ServiceAccount railshot-product turi ir operatoriaus įdiegtą registracijos bootstrap (create Secret, AppProject ir Application argocd srityje; get, update ir escalate įvardytoms Role), ir kiekvienam patikrintam taikiniui tiksliu pavadinimu pridedamus get ir patch leidimus. Kubernetes create negalima apriboti pavadinimu, todėl pavadinimus apimties ribose taip pat palaiko produkto įvesčių validacija.
Argo CD · Application
argocdpaleisti · taikyti: taikyti vardų sričiai<app namespace>Argo CD pakeitimus taiko nurodytai kliento klasterio vardų sričiai su užregistruoto cluster Secret prisijungimo duomenimis. AppProject leidžia tik vardų srities ribose esančius kind ir jokių viso klasterio išteklių.
Deployment · Pod · atvaizdas pagal maišą
<app namespace>duomenys: pull pagal maišąGHCRPublikuotas atvaizdas pagal maišą atsisiunčiamas su pull Secret, į kurį nurodoma pavadinimu toje pačioje vardų srityje. Secret reikšmės niekada nepatenka į artefaktą ar config Git.
Viešas užklausos kelias
Programos užklausos eina keliu: tiekėjo L7 įėjimo taškas → mazgo NodePort → Service → programos Pod. Cilium politikos taikymas yra atskira kontrolė, o ne grandis, nešanti užklausą. Įėjimas į eksploatacijos skydelį – atskiras kelias.
Programos naudotojasduomenys: HTTPS 443Tiekėjo L7 įėjimo taškas
Programos naudotojai pasiekia tiekėjo L7 įėjimo tašką per užregistruotą hostname. Kiekvienas tiekėjas įgyvendina savo įėjimo tašką.
Tiekėjo L7 įėjimo taškasduomenys: NodePortNodePort Service · Local
<app namespace>Įėjimo taškas persiunčia į mazgo privatų adresą ir NodePort. NodePort yra tas, kuris paskirtas registruojant taikinį.
NodePort Service · Local
<app namespace>duomenys: į PodDeployment · Pod · atvaizdas pagal maišą<app namespace>Service siunčia užklausą programos Pod (Deployment) tame pačiame mazge. Su externalTrafficPolicy Local šaltinio adresas nepakitęs pasiekia NetworkPolicy užregistruotų CIDR patikrą.
Cilium · Helm · VXLAN
kube-systempaleisti · taikyti: taikyti politikąNetworkPolicy · tik užregistruoti CIDR<app namespace>Cilium taiko NetworkPolicy: įeinantis srautas tik iš užregistruotų CIDR į programos prievadą; pagal numatymą jokio išeinančio srauto, išskyrus patvirtintą duomenų bazės adresą. Debesų užkardos ir pagrindinio kompiuterio taisyklės vis tiek svarbios.
Railshot naudotojasduomenys: informacinis skydelis · APIdashboard · nginx
railshot-systemNaudotojai per eksploatacijos įėjimo tašką patenka į nginx informacinį skydelį, o nginx stovi prieš produkto API. Skydelio Service yra NodePort tik nurodžius patvirtintą mazgo prievadą; API lieka ClusterIP.
Patikra · stebėjimas
Diegimo verdiktas remiasi tik Argo būsena ir viešo URL patikra. Pod diagnostika, dabartiniai žurnalai ir eksploatacijos metrikos yra atskiri signalai, kurie jo niekada nekeičia.
produkto API · cd.js → bridge.py
railshot-systemstebėti: revizija · health · atvaizdaiArgo CD · ApplicationargocdBūsenai deployed reikia Application sinchronizavimo revizijos, Synced ir Healthy, operation Succeeded ir kad Argo Application būsenoje įrašytos atvaizdų nuorodos sutaptų su peržiūrėto Deployment atvaizdais pagal maišą. Tai nėra tiesioginis Pod imageID slenkstis, ir vien žalia Argo būsena sutapimo nenustato.
produkto API · cd.js → bridge.py
railshot-systemstebėti: vieša HTTPS patikraTiekėjo L7 įėjimo taškasUžregistruotas viešas URL tikrinamas be peradresavimų. Succeeded įrašoma tik esant ir Argo verdiktui, ir šiai patikrai.
produkto API · cd.js → bridge.py
railshot-systemstebėti: Pod diagnostika · ne verdiktasDeployment · Pod · atvaizdas pagal maišą<app namespace>Po Argo verdikto ir viešos patikros Deployment, ReplicaSet ir Pod atskirai perskaitomi su užregistruotais prisijungimo duomenimis, o imageID ir parengtis pridedami kaip ready, progressing ar unavailable diagnostika. Nepavykusi ar besiskirianti diagnostika niekada nekeičia deployed ar succeeded verdikto.
produkto API · cd.js → bridge.py
railshot-systemstebėti: žurnalo pabaiga · 100 eilučių kiekvienam PodDeployment · Pod · atvaizdas pagal maišą<app namespace>Tik dabartinei įdiegtai operacijai, su patikima konfigūracija ir užregistruotais prisijungimo duomenimis. Kiekvienam dabartiniam Pod (ne daugiau kaip trims) veikiančio atvaizdo maiša turi sutapti su laukiama; tada baitų limito ribose perskaitoma iki 100 išvalytų eilučių kiekvienam Pod. Senesnis bandymas atsako superseded; be konfigūracijos – not_configured. Tai nėra žurnalų agregavimas.
Stebėjimo VMstebėti: rinkimas · NodePortrailshot-observability
Prometheus stebėjimo VM renka node-exporter ir kube-state-metrics per du užkarda apribotus NodePort. Trūkstamos ar pasenusios reikšmės yra nežinomos, o ne nulis.
Stebėjimo VMstebėti: Blackbox probeTiekėjo L7 įėjimo taškas
probe_success=1 reiškia 2xx toje zondo vietoje. Tai neįrodo nei kiekvieno naudotojo prieigos, nei įdiegtos versijos ir niekada nepakelia published iki deployed.
Operatoriaus diegimas · registracija
Klasterio diegimas, registracijos bootstrap ir taikinio įvestys, Secret ir prisijungimo duomenų atnaujinimo sąranka yra operatoriaus įvestys, niekada ne nuomininko programos payload dalis.
Operatoriaus bootstrappaleisti · taikyti: platformos generavimas · Secretrailshot-system
Operatorius su render-platform.py sugeneruoja platformos deklaraciją ir pateikia privačią eksploatacijos konfigūraciją bei Secret. Nuotolinis MCP įtraukiamas tik pateikus jo atvaizdą, o asmeninis gateway (WireGuard) – tik su --personal.
Operatoriaus bootstrappaleisti · taikyti: registracijos bootstrapAppProject · cluster Secret
argocdOperatorius argocd srityje įdiegia registracijos bootstrap Role ir tuščią registracijų Role bei paruošia taikinio įvestis. Tada produkto API paleidžiami registracijos pagalbininkai (environment.py, applications.py) įrašo railshot-<target> Secret su apriboto apimties prisijungimo duomenimis (clusterResources false, išvardytos leidžiamos vardų sritys) ir prideda patikrintus tikslius pavadinimus prie registracijų Role. Registracija kiekvienai programai susieja app-<id> vardų sritį su tokio paties pavadinimo AppProject.
Operatoriaus bootstrappaleisti · taikyti: įdiegti K3s · CiliumCilium · Helm · VXLAN
kube-systeminstall-k3s.sh įdiegia vieno mazgo K3s serverį (flannel, network policy, traefik ir servicelb išjungti; kube-proxy išlaikytas), o Cilium įdiegiamas kaip Helm leidimas (kubeProxyReplacement false, VXLAN, Hubble išjungtas).
atnaujinimo CronJob · kas 2 h
argocdpaleisti · taikyti: TokenRequest · 6 hrailshot-argocd SA · žetonas<app namespace>railshot-credentials CronJob kas dvi valandas prašo naujo šešių valandų žetono kliento SA. Kliento pusės Role leidžia tik žetono create savam SA. Šešios valandos yra vieno žetono TTL, o ne laikas, kai baigiasi operatoriaus prieiga.
Visi ryšiai vienodo storio. Pasirinkite srautą, kad būtų paryškintas tik jo kelias su sunumeruotais žingsniais.
- Ištisinė · kryptis, kuria keliauja užklausos, bundle, atvaizdai ir deklaracijos
- Brūkšninė · paleidimo užklausos, taikymas, diegimas, prisijungimo duomenys
- Ilga brūkšninė-taškinė · būsenos, žurnalų, zondų, metrikų skaitymas; atskirai nuo verdikto
- Stora juoda linija · pasirinktas srautas; skaičiai rodo tvarką
- Rėmelis · vardų sritis, jos pavadinimas antraštėje (ne mazgas)
- Vidinė plokštelė · komponentas toje vardų srityje
- Brūkšninis rėmelis · už klasterių ribų
- railshot-system · produktas
- argocd · diegimo įgaliojimai
- railshot-build · pagrindinio kompiuterio Docker įgaliojimai
- GitHub · kliento klasteris
October 2 išdėstymo sprendimas docs/architecture (du vaidmenų mazgai) ir viešo README schema yra istorija; šis žemėlapis atitinka deklaracijas ir kodą ties 645e28a. Rodyklės rodo priežastį ir kryptį, o ne įrodymą, kad kiekvienas tiekėjo kelias dabar veikia.
- Vardų sritys ir mazgai
- Vardų sritis yra pavadinimų apimtis: ne aparatinė įranga ir savaime ne saugumo riba. Platform ir build vaidmenys yra planavimo išdėstymas per nodeSelector ir taint; šis žemėlapis nenustato eksploatacijos klasterio mazgų skaičiaus. Argo CD išdėstymas mazguose taip pat yra atskira patikra.
- Build mazgo įgaliojimai
- Runner Job veikia su hostNetwork, pagrindinio kompiuterio Docker lizdu, NET_ADMIN ir root. Vardų sritis, taint ar RBAC nepanaikina pagrindinio kompiuterio Docker įgaliojimų, todėl tai nėra nei izoliacija nuo VM administratoriaus, nei smėlio dėžė savavališkam kodui.
- Kliento vardų sritis
- Kiekvienas užregistruotas taikinys naudoja nenumatytąją vardų sritį ir AppProject (pavyzdžiui, tenant-demo arba app-<id> kiekvienai programai). Kuriami tik vienos paslaugos Deployment (ServiceAccount žetono automatinis prijungimas išjungtas), NodePort Service ir NetworkPolicy bei pasirenkamas PVC ar migracijos Job; į Secret tik nurodoma pavadinimu (pull Secret ir patvirtintas DATABASE_URL), jie niekada nekuriami.
- AWS įėjimas
- Route 53 Alias → bendras ALB HTTPS 443 → kliento mazgo privatus adresas ir NodePort. Daug programų pakartotinai naudoja vieną mazgą, kiekviena su savo vardų sritimi, Application ir NodePort.
- GCP įėjimas
- Globalus EXTERNAL_MANAGED HTTPS LB → zoninis GCE_VM_IP_PORT NEG → esamos VM privatus NodePort. Sertifikatus išduoda Certificate Manager su DNS autorizacija. Modulis nevaldo nei VM, nei VPC, o viena VM lieka vieninteliu gedimo tašku.
- OpenStack įėjimas
- Amphora TLS klausytojas 443 su Host ir kelio L7 politikomis → HTTP NodePort. Numatytasis adresas yra privatus VIP; Octavia, K3s, duomenų bazė ir DNS yra už modulio ribų. Viešam pasiekiamumui ir Amphora parengčiai vietoje reikia atskiro priėmimo, o su šiuo moduliu dar nepatikrintas nė vienas taikymas vietoje.
- Tarp tiekėjų
- Trys įėjimo taškai yra atskiri įgyvendinimai, be automatinio failover ar replikacijos tarp tiekėjų. Klientų programų klasteris yra užregistruoto taikinio pavyzdys, o ne teiginys, kad tas pats diegimas veikia visuose debesyse vienu metu.
- Operatoriaus parinktys
- Asmeninis gateway (WireGuard) prie platformos prisijungia tik operatoriui įjungus --personal; tai nėra privalomas kelias klientų debesims. Palaikomame tiesioginiame režime stebėjimo VM gali dalytis eksploatacijos valdymo VM.