Cumraíocht tionscadail laistigh agus lasmuigh de Kubernetes

Scríobh mé le déanaí freagra faoi shaol an tionscadail in Docker agus cód dífhabhtaithe lasmuigh de, áit a luaigh sé go hachomair gur féidir leat do chóras cumraíochta féin a dhéanamh ionas go n-oibríonn an tseirbhís go maith i Kuber, ag tarraingt suas rúin, agus go ritheann sé áisiúil go háitiúil, fiú lasmuigh de Docker ar fad. Ní dhéanfaidh aon ní casta, ach d'fhéadfadh go mbeadh an “oideas” a thuairiscítear úsáideach do dhuine :) Tá an cód i Python, ach níl an loighic ceangailte leis an teanga.

Cumraíocht tionscadail laistigh agus lasmuigh de Kubernetes

Is é seo a leanas cúlra na ceiste: uair amháin bhí tionscadal amháin ann, ar dtús bhí sé ina monolith beag le fóntais agus scripteanna, ach le himeacht ama d'fhás sé, roinnte i seirbhísí, a thosaigh ina dhiaidh sin a roinnt i microservices, agus ansin de réir scála suas. Ar dtús, rinneadh é seo go léir ar VPS lom, rinneadh na próisis chun cód a bhunú agus a imscaradh a uathoibriú ag baint úsáide as Ansible, agus tiomsaíodh gach seirbhís le cumraíocht YAML leis na socruithe agus na heochracha riachtanacha, agus úsáideadh comhad cumraíochta den chineál céanna le haghaidh seoltaí áitiúla, a bhí an-áisiúil, mar gheall ar .k tá an config seo luchtaithe isteach i réad domhanda, inrochtana ó áit ar bith sa tionscadal.

Mar sin féin, an fás ar líon na microservices, a gcuid naisc, agus gá le logáil láraithe agus monatóireacht, forshadowed bogadh go Kuber, atá fós ar siúl. In éineacht le cúnamh chun na fadhbanna luaite a réiteach, cuireann Kubernetes a chur chuige maidir le bainistíocht bonneagair, lena n-áirítear mar a thugtar Rúin и bealaí le bheith ag obair leo. Tá an mheicníocht caighdeánach agus iontaofa, mar sin is peaca é gan é a úsáid! Ach ag an am céanna, ba mhaith liom mo fhormáid reatha a choinneáil le haghaidh oibriú leis an config: ar an gcéad dul síos, é a úsáid go haonfhoirmeach i microservices éagsúla an tionscadail, agus sa dara háit, a bheith in ann an cód a rith ar an meaisín áitiúil ag baint úsáide as ceann simplí. comhad cumraíochta.

Maidir leis seo, athraíodh an mheicníocht chun réad cumraíochta a thógáil chun a bheith in ann oibriú lenár gcomhad cumraíochta clasaiceach agus le rúin ó Kuber. Sonraíodh struchtúr cumraíochta níos déine freisin, i dteanga an tríú Python, mar seo a leanas:

Dict[str, Dict[str, Aontas[str, int, snámh]]]

Is é sin, is foclóir é an cogfig deiridh le hailt ainmnithe, gach ceann acu ina foclóir le luachanna ó chineálacha simplí. Agus déanann ailt cur síos ar chumraíocht agus rochtain ar acmhainní de chineál áirithe. Sampla de phíosa dár cumraíochta:

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"

Ag an am céanna, an réimse engine is féidir bunachair shonraí a shuiteáil ar SQLite, agus redis leagtha chun mock, ag sonrú freisin ainm an chomhaid le sábháil - déantar na paraiméadair seo a aithint agus a phróiseáil i gceart, rud a fhágann go bhfuil sé éasca an cód a reáchtáil go háitiúil le haghaidh dífhabhtaithe, tástáil aonaid agus aon riachtanais eile. Tá sé seo tábhachtach go háirithe dúinn toisc go bhfuil go leor riachtanais eile - tá cuid dár gcód beartaithe le haghaidh ríomhaireachtaí anailíseacha éagsúla, ritheann sé ní hamháin ar fhreastalaithe le orchestration, ach freisin le scripteanna éagsúla, agus ar na ríomhairí na n-anailísithe a bhfuil gá acu a bheith ag obair tríd. agus píblínte próiseála sonraí casta dífhabhtaithe gan a bheith buartha faoi shaincheisteanna backend. Dála an scéil, ní ghortódh sé a roinnt go bhfuil ár bpríomhuirlisí, lena n-áirítear an cód leagan amach cumraíochta, suiteáilte trí setup.py – le chéile déanann sé seo ár gcód a aontú in éiceachóras aonair, neamhspleách ar ardán agus ar mhodh úsáide.

Breathnaíonn an cur síos ar pod Kubernetes mar seo:

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

Is é sin, déanann gach rún cur síos ar alt amháin. Cruthaítear na rúin féin mar seo:

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

Cruthaítear comhaid YAML feadh an chosáin mar thoradh air seo /etc/secrets/db-main/section_name.yaml

Agus le haghaidh seolta áitiúla, úsáidtear an cumraíocht, atá suite i bhfréamheolaire an tionscadail nó feadh an chosáin atá sonraithe san athróg timpeallachta. Tá an cód atá freagrach as na háiseanna seo le feiceáil sa spoiler.

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()

Tá an loighic anseo simplí go leor: cuirimid le chéile cumraíochtaí móra ón eolaire tionscadail agus cosáin de réir athróg timpeallachta, agus rannóga cumraíochta beaga ó rúin Kuber, agus ansin iad a réamhphróiseáil beagán. Plus roinnt athróg. Tugaim faoi deara, nuair a bhíonn comhaid rúnda á chuardach, go n-úsáidtear teorannú doimhneachta, toisc go gcruthaíonn K8s fillteán i bhfolach i ngach rún ina stóráiltear na rúin féin, agus níl ach nasc suite ar leibhéal níos airde.

Tá súil agam go mbeidh an méid a thuairiscítear úsáideach do dhuine éigin :) Glactar le haon tuairimí agus moltaí maidir le slándáil nó réimsí eile le feabhsú. Tá tuairim an phobail suimiúil freisin, b’fhéidir gur fiú tacaíocht a chur leis do ConfigMaps (ní úsáideann ár dtionscadal iad fós) agus an cód a fhoilsiú ar GitHub / PyPI? Go pearsanta, is dóigh liom go bhfuil rudaí den sórt sin ró-aonair chun tionscadail a bheith uilíoch, agus beagán peeking ar fheidhmiúcháin daoine eile, cosúil leis an gceann a thugtar anseo, agus plé ar nuances, leideanna agus cleachtais is fearr, a bhfuil súil agam a fheiceáil sna tuairimí. , is leor 😉

Ní féidir ach le húsáideoirí cláraithe páirt a ghlacadh sa suirbhé. Sínigh isteach, le do thoil.

Ar cheart dom foilsiú mar thionscadal/leabharlann?

  • 0,0%Sea, d’úsáidfinn /ranníocaíocht0

  • 33,3%Sea, is iontach an rud é sin4

  • 41,7%Ní hea, cé a chaithfidh é a dhéanamh iad féin ina bhformáid féin agus a oireann dá riachtanais5

  • 25,0%Staonfaidh mé ón bhfreagra3

Vótáil 12 úsáideoir. Staon 3 úsáideoir.

Foinse: will.com

Add a comment