Qaabeynta mashruuca gudaha iyo dibadda Kubernetes

Waxaan dhawaan qoray ka jawaab nolosha mashruuca ee Docker iyo koodka qaladka ee ka baxsan, halkaas oo uu si kooban u sheegay in aad samayn karto nidaamka qaabeynta adiga kuu gaar ah si uu adeeggu si fiican ugu shaqeeyo Kuber, soo jiidan siraha, oo u shaqeeya si habboon gudaha, xitaa meel ka baxsan Docker gebi ahaanba. Ma jiraan wax adag, laakiin "recipe" lagu tilmaamay ayaa laga yaabaa inay faa'iido u leedahay qof :) Koodhku wuxuu ku yaalaa Python, laakiin caqligu kuma xidhna luqadda.

Qaabeynta mashruuca gudaha iyo dibadda Kubernetes

Dulucda su'aashu waa sidan: beri hore waxaa jiray hal mashruuc, markii hore wuxuu ahaa monolith yar oo leh adeeg iyo qoraal, laakiin muddo ka dib way kortay, oo u qaybsantay adeegyo, taas oo bilaabay in loo qaybiyo adeeg yar, iyo ka dibna kor loo qaaday. Markii hore, waxaas oo dhan waxaa lagu sameeyay VPS qaawan, hababka dejinta iyo geynta koodka kuwaas oo si otomaatig ah loo adeegsaday iyadoo la adeegsanayo macquul, adeeg kastana waxaa lagu soo ururiyay qaabeynta YAML oo leh goobaha lagama maarmaanka ah iyo furayaasha, iyo faylka isku midka ah ayaa loo adeegsaday bilaabista maxaliga ah, taas oo ahayd mid aad u habboon, sababtoo ah .k qaabkan waxaa lagu dhejiyaa shay caalami ah, oo laga heli karo meel kasta oo mashruuca ah.

Si kastaba ha ahaatee, kobaca tirada adeegyada yar yar, isku xirka, iyo baahida loo qabo gooynta iyo la socodka dhexe, waxay saadaalisay u dhaqaaqista Kuber, taas oo wali socota. Si wada jir ah looga caawiyo xallinta mashaakilaadka la soo sheegay, Kubernetes waxay soo bandhigtaa hababkeeda maaraynta kaabayaasha, oo ay ku jiraan waxa loo yaqaan siraha ΠΈ siyaabaha loola shaqeeyo. Habkani waa mid caadi ah oo la isku halayn karo, markaa waa dembi in aan la isticmaalin! Laakiin isla mar ahaantaana, waxaan jeclaan lahaa inaan sii wado qaabkayga hadda ee la shaqeynta qaabeynta: marka hore, si aan ugu isticmaalo si isku mid ah microservices kala duwan ee mashruuca, iyo marka labaad, si aan u awoodo inaan ku socodsiiyo koodhka mashiinka maxalliga ah adoo isticmaalaya mid fudud. faylka config.

Marka tan la eego, habka lagu dhisayo shayga qaabeynta ayaa la bedelay si ay ugu shaqeyso labadaba faylka qaabeynta caadiga ah iyo siraha Kuber. Qaab dhismeed aad u adag ayaa sidoo kale lagu qeexay, luqadda Python saddexaad, sida soo socota:

Dict[str, Dict[str, Midowga[str, int, float]]]

Taasi waa, cogfig kama dambaysta ah waa qaamuus leh qaybo la magacaabay, mid kasta oo ka mid ah waa qaamuus leh qiyamka noocyada fudud. Qaybuhuna waxay qeexayaan habaynta iyo gelitaanka ilaha nooc gaar ah. Tusaale qayb ka mid ah habaynteena:

adminka:
  django_secret: "ExtraLongAndHardCode"

db_main:
  engine: mysql
  host: 256.128.64.32
  user: cool_user
  password: "SuperHardPassword"

redis:
  host: 256.128.64.32
  pw: "SuperHardPassword"
  port: 26379

smtp:
  server: smtp.gmail.com
  port: 465
  email: [email protected]
  pw: "SuperHardPassword"

Isla mar ahaantaana, garoonka engine database-yada waxaa lagu rakibi karaa SQLite, iyo redis dhigay mock, qeexida sidoo kale magaca faylka si loo badbaadiyo - xuduudahan si sax ah ayaa loo aqoonsaday oo loo habeeyey, taas oo sahlaysa in lagu socodsiiyo koodka gudaha gudaha si loo saxo, tijaabinta cutubka iyo baahi kasta oo kale. Tani waxay si gaar ah muhiim noogu tahay sababtoo ah waxaa jira baahiyo kale oo badan - qayb ka mid ah koodkayaga waxaa loogu talagalay xisaabinta falanqaynta kala duwan, waxay ku shaqeysaa ma aha oo kaliya server-yada leh orchestration, laakiin sidoo kale qoraallo kala duwan, iyo kombuyuutarrada falanqeeyayaasha u baahan inay ka shaqeeyaan. iyo khaladka tubooyinka habaynta xogta adag iyada oo aan laga welwelin arrimaha dhabarka. Jid ahaan, ma dhaawacayso in la wadaago in agabkayaga ugu muhiimsan, oo ay ku jiraan koodhka qaabaynta, lagu rakibay iyada oo loo marayo setup.py - si wadajir ah tani waxay midaynaysaa koodkayaga hal nidaam deegaan, oo ka madax bannaan madal iyo habka loo isticmaalo.

Sharaxaadda boodhka Kubernetes waxay u egtahay sidan:

containers:
  - name : enter-api
    image: enter-api:latest
    ports:
      - containerPort: 80
    volumeMounts:
      - name: db-main-secret-volume
        mountPath: /etc/secrets/db-main

volumes:
  - name: db-main-secret-volume
    secret:
      secretName: db-main-secret

Taasi waa, sir kastaa waxay qeexaysaa hal qayb. Siraha laftooda ayaa loo abuuray sida tan:

apiVersion: v1
kind: Secret
metadata:
  name: db-main-secret
type: Opaque
stringData:
  db_main.yaml: |
    engine: sqlite
    filename: main.sqlite3

Si wada jir ah tani waxay keenaysaa abuurista faylasha YAML ee jidka /etc/secrets/db-main/section_name.yaml

Iyo bilaabista maxalliga ah, qaabeynta ayaa loo isticmaalaa, oo ku taal tusaha xididka mashruuca ama jidka lagu qeexay doorsoomiyaha deegaanka. Koodhka ka mas'uulka ah fududayntan waxa lagu arki karaa qaswadayaasha.

config.py

__author__ = 'AivanF'
__copyright__ = 'Copyright 2020, AivanF'

import os
import yaml

__all__ = ['config']
PROJECT_DIR = os.path.abspath(__file__ + 3 * '/..')
SECRETS_DIR = '/etc/secrets'
KEY_LOG = '_config_log'
KEY_DBG = 'debug'

def is_yes(value):
    if isinstance(value, str):
        value = value.lower()
        if value in ('1', 'on', 'yes', 'true'):
            return True
    else:
        if value in (1, True):
            return True
    return False

def update_config_part(config, key, data):
    if key not in config:
        config[key] = data
    else:
        config[key].update(data)

def parse_big_config(config, filename):
    '''
    Parse YAML config with multiple section
    '''
    if not os.path.isfile(filename):
        return False
    with open(filename) as f:
        config_new = yaml.safe_load(f.read())
        for key, data in config_new.items():
            update_config_part(config, key, data)
        config[KEY_LOG].append(filename)
        return True

def parse_tiny_config(config, key, filename):
    '''
    Parse YAML config with a single section
    '''
    with open(filename) as f:
        config_tiny = yaml.safe_load(f.read())
        update_config_part(config, key, config_tiny)
        config[KEY_LOG].append(filename)

def combine_config():
    config = {
        # To debug config load code
        KEY_LOG: [],
        # To debug other code
        KEY_DBG: is_yes(os.environ.get('DEBUG')),
    }
    # For simple local runs
    CONFIG_SIMPLE = os.path.join(PROJECT_DIR, 'config.yaml')
    parse_big_config(config, CONFIG_SIMPLE)
    # For container's tests
    CONFIG_ENVVAR = os.environ.get('CONFIG')
    if CONFIG_ENVVAR is not None:
        if not parse_big_config(config, CONFIG_ENVVAR):
            raise ValueError(
                f'No config file from EnvVar:n'
                f'{CONFIG_ENVVAR}'
            )
    # For K8s secrets
    for path, dirs, files in os.walk(SECRETS_DIR):
        depth = path[len(SECRETS_DIR):].count(os.sep)
        if depth > 1:
            continue
        for file in files:
            if file.endswith('.yaml'):
                filename = os.path.join(path, file)
                key = file.rsplit('.', 1)[0]
                parse_tiny_config(config, key, filename)
    return config

def build_config():
    config = combine_config()
    # Preprocess
    for key, data in config.items():
        if key.startswith('db_'):
            if data['engine'] == 'sqlite':
                data['filename'] = os.path.join(PROJECT_DIR, data['filename'])
    # To verify correctness
    if config[KEY_DBG]:
        print(f'** Loaded config:n{yaml.dump(config)}')
    else:
        print(f'** Loaded config from: {config[KEY_LOG]}')
    return config

config = build_config()

Macnaha halkan waa mid aad u fudud: waxaan isku daraynaa habab waaweyn oo ka socda tusaha mashruuca iyo waddooyinka doorsoomayaasha deegaanka, iyo qaybo yaryar oo ka mid ah siraha Kuber, ka dibna wax yar ka sii horumariyo. Oo lagu daray doorsoomayaasha qaarkood. Waxaan ogsoonahay in marka la raadinayo faylasha sirta ah, xaddidaad qoto dheer ayaa la isticmaalaa, sababtoo ah K8s waxay abuurtaa galka qarsoon ee sirta kasta halkaasoo sirta laftooda lagu kaydiyo, oo kaliya isku xirka ayaa ku yaal heer sare.

Waxaan rajeynayaa in waxa lagu tilmaamay ay faa'iido u yeelan doonaan qof :) Wixii faallooyin iyo talooyin ah oo ku saabsan amniga ama meelaha kale ee horumarinta la aqbalo. Fikradda bulshadu sidoo kale waa mid xiiso leh, laga yaabee inay mudan tahay in lagu daro taageerada ConfigMaps (mashruucayagu weli ma isticmaalo) oo ku daabaca koodka GitHub / PyPI? Shakhsi ahaan, waxaan u maleynayaa in waxyaalahan oo kale ay yihiin kuwo aad shakhsi u ah mashaariicda si ay u noqdaan kuwo caalami ah, iyo in yar oo fiirinaya fulinta dadka kale, sida midda halkan lagu bixiyay, iyo dood ku saabsan nuances, talooyin iyo hababka ugu fiican, taas oo aan filayo inaan ku arko faallooyinka. , waa ku filan πŸ˜‰

Isticmaalayaasha diiwaangashan oo keliya ayaa ka qaybqaadan kara sahanka. Soo gal, soo dhawoow.

Miyaan u daabacaa mashruuc/maktabad ahaan?

  • 0,0%Haa, waxaan isticmaali lahaa/wax ku darsiga0

  • 33,3%Haa, taasi way fiicantahay4

  • 41,7%Maya, yaa u baahan in uu isagu u sameeyo qaab u gaar ah oo ku habboon baahidooda5

  • 25,0%Waxaan ka gaabsaday in aan ka jawaabo3

12 isticmaale ayaa codeeyay. 3 isticmaale ayaa ka aamusay.

Source: www.habr.com

Add a comment