# Warstwa danych i logiki WYŁĄCZNIE dla wersji demo (PRE-29). # # DLACZEGO OSOBNY KOMPLET, A NIE WSPÓŁDZIELONY. Warstwa logiczna zna JEDEN adres # warstwy danych, więc astrodemo korzystający z produkcyjnej logiki i tak trafiłby # na produkcyjne bazy. Izolacja demo musi więc sięgnąć obu warstw naraz, inaczej # nie ma jej wcale. # # Udział `astrololo-astrodemo` jest PUSTY na starcie i nigdy nie zawiera oryginalnych # baz. Każde konto demo dostaje w nim własny podkatalog (pulę) — patrz PRE-29. --- apiVersion: apps/v1 kind: Deployment metadata: name: data-demo namespace: astrololo spec: replicas: 1 selector: matchLabels: { app: data-demo } template: metadata: labels: { app: data-demo } spec: # Ta usługa liczy na pandas, a przez nią na NumPy. Koła NumPy z PyPI są # budowane z bazą x86-64-v2, więc na węźle bez tych rozszerzeń kontener # NIE WSTAJE: `import numpy` kończy się RuntimeError, pod wpada w pętlę # restartów, a komunikat mówi o „baseline optimizations" — czyli o niczym, # po czym dałoby się poznać, że chodzi o węzeł. # # Wymagana ETYKIETA, a nie wykluczony konkretny węzeł. Nowy węzeł jest # domyślnie NIEOZNACZONY, więc nie dostanie tu poda, dopóki ktoś go nie # sprawdzi (skrypt w README) i nie oznaczy świadomie. Pending z czytelnym # powodem jest lepszy niż pętla restartów z komunikatem o optymalizacjach — # a wykluczanie węzłów po nazwie znaczyłoby, że każdy KOLEJNY źle # postawiony węzeł znów zbiera się przez awarię. affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: astrololo.czernobog.pl/cpu-x86-64-v2 operator: In values: ["true"] containers: - name: data # TEN SAM obraz co produkcja — różni się wyłącznie udziałem, na którym # pracuje. Osobny obraz oznaczałby drugi kod do utrzymania i pewność, # że kiedyś się rozjadą. image: gitea.czernobog.pl/gitea/astrololo-data:latest ports: [{ containerPort: 8002 }] env: - name: DATA_PROVIDER value: "excel" - name: EXCEL_DIR value: "/app/data_files" - name: CACHE_DIR value: "/app/.cache" - name: INTERNAL_TOKEN valueFrom: secretKeyRef: { name: astrololo-auth, key: INTERNAL_TOKEN } - name: LINK_KEY_LOGIC_DATA valueFrom: secretKeyRef: { name: astrololo-link, key: LINK_KEY_LOGIC_DATA } - name: LINK_ENCRYPTION_REQUIRED value: "true" volumeMounts: - name: cache mountPath: /app/.cache - name: demo mountPath: /app/data_files resources: requests: { cpu: "100m", memory: "256Mi" } limits: { cpu: "500m", memory: "512Mi" } volumes: - name: cache emptyDir: {} - name: demo nfs: server: 192.168.1.34 # OSOBNY udział, pusty na starcie. NIE /mnt/Tank1/astrololo — # to jest cała istota izolacji demo. path: /mnt/Tank1/astrololo-demo --- apiVersion: v1 kind: Service metadata: name: data-demo namespace: astrololo spec: type: ClusterIP selector: { app: data-demo } ports: [{ port: 8002, targetPort: 8002 }] --- apiVersion: apps/v1 kind: Deployment metadata: name: logic-demo namespace: astrololo spec: replicas: 1 selector: matchLabels: { app: logic-demo } template: metadata: labels: { app: logic-demo } spec: containers: - name: logic image: gitea.czernobog.pl/gitea/astrololo-logic:latest ports: [{ containerPort: 8001 }] env: # JEDYNA różnica wobec produkcyjnej logiki — i zarazem cała izolacja. - name: DATA_URL value: "http://data-demo:8002" - name: EPHEMERIS_ENGINE value: "own" - name: INTERNAL_TOKEN valueFrom: secretKeyRef: { name: astrololo-auth, key: INTERNAL_TOKEN } - name: LINK_KEY_PRESENTATION_LOGIC valueFrom: secretKeyRef: { name: astrololo-link, key: LINK_KEY_PRESENTATION_LOGIC } - name: LINK_KEY_LOGIC_DATA valueFrom: secretKeyRef: { name: astrololo-link, key: LINK_KEY_LOGIC_DATA } - name: LINK_ENCRYPTION_REQUIRED value: "true" # Bez kluczy do modeli językowych. Astroklient nie umie o nie prosić, # więc ich tu nie ma — czego nie ma w podzie, tego nie wyniesie. resources: requests: { cpu: "100m", memory: "128Mi" } limits: { cpu: "500m", memory: "512Mi" } --- apiVersion: v1 kind: Service metadata: name: logic-demo namespace: astrololo spec: type: ClusterIP selector: { app: logic-demo } ports: [{ port: 8001, targetPort: 8001 }]