Tokiso ea projeke kahare le kantle ho Kubernetes

Ke sa tsoa ngola araba ka bophelo ba projeke ho Docker le khoutu ea debugging kantle ho eona, moo a ileng a bolela ka bokhutšoanyane hore u ka iketsetsa tsamaiso ea hau ea tlhophiso e le hore tšebeletso e sebetse hantle ho Kuber, e hule liphiri, 'me e tsamaee hantle sebakeng sa heno, esita le ka ntle ho Docker ka ho feletseng. Ha ho letho le rarahaneng, empa "recipe" e hlalositsoeng e ka 'na ea e-ba molemo ho motho e mong :) Khoutu e Python, empa logic ha e tlameletsoe puong.

Tokiso ea projeke kahare le kantle ho Kubernetes

Semelo sa potso ke sena: ka nako e 'ngoe ho ne ho e-na le morero o le mong, qalong e ne e le monolith e nyenyane e nang le lisebelisoa le li-scripts, empa ha nako e ntse e ea e ile ea hōla, ea aroloa ka litšebeletso, tse ileng tsa qala ho aroloa ka li-microservices, le yaba e nyolohile. Qalong, sena sohle se ne se etsoa ka VPS e se nang letho, lits'ebetso tsa ho theha le ho tsamaisa khoutu eo ho eona ho neng ho sebelisoa Ansible, 'me tšebeletso e' ngoe le e 'ngoe e ne e hlophisitsoe ka tlhophiso ea YAML e nang le litlhophiso le linotlolo tse hlokahalang, mme faele e tšoanang ea config e ne e sebelisetsoa. ho qalisoa ha lehae, ho neng ho le bonolo haholo, hobane .k tlhophiso ena e kentsoe nthong ea lefats'e, e fumanehang ho tsoa kae kapa kae morerong.

Leha ho le joalo, kholo ea palo ea li-microservices, likhokahano tsa tsona, le tlhokahalo ea ho rema lifate le ho beha leihlo, e ne e tšoantšetsa ho fallela Kuber, e ntseng e tsoela pele. Hammoho le thuso ea ho rarolla mathata a boletsoeng, Kubernetes e fana ka mekhoa ea eona ea ho laola mekhoa ea litšebeletso, ho kenyelletsa le seo ho thoeng ke Liphiri и mekhoa ea ho sebetsa le bona. Mochini o tloaelehile ebile oa tšepahala, kahoo ke sebe ho se o sebelise! Empa ka nako e ts'oanang, ke rata ho boloka sebopeho sa ka sa hajoale sa ho sebetsa le config: pele, ho e sebelisa ka mokhoa o ts'oanang lits'ebetsong tse fapaneng tsa projeke, 'me ea bobeli, ho khona ho tsamaisa khoutu mochining oa lehae ke sebelisa e bonolo. config file.

Tabeng ena, mochine oa ho haha ​​​​ntho e hlophisitsoeng o ile oa fetoloa hore o khone ho sebetsa ka bobeli ka faele ea rona ea khale ea config le ka liphiri tse tsoang Kuber. Sebopeho se thata haholoanyane se ile sa hlalosoa, ka puo ea Python ea boraro, ka tsela e latelang:

Dict[str, Dict[str, Union[str, int, float]]

Ke hore, cogfig ea ho qetela ke dikishinari e nang le likarolo tse bitsoang, e 'ngoe le e' ngoe e le buka e hlalosang mantsoe e nang le litekanyetso tse tsoang mefuteng e bonolo. 'Me likarolo li hlalosa tlhophiso le phihlello ea lisebelisoa tsa mofuta o itseng. Mohlala oa karolo ea config ea rona:

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"

Ka nako e tšoanang, tšimo engine li-database li ka kenngoa ho SQLite, le redis set to mock, e hlalosang hape lebitso la faele e lokelang ho bolokoa - litekanyo tsena li tsejoa ka nepo le ho sebetsoa, ​​​​e leng se etsang hore ho be bonolo ho tsamaisa khoutu sebakeng sa heno bakeng sa ho lokisa liphoso, tlhahlobo ea yuniti le litlhoko tse ling. Sena ke sa bohlokoa haholo ho rona hobane ho na le litlhoko tse ling tse ngata - karolo ea khoutu ea rona e etselitsoe lipalo tse fapaneng tsa tlhahlobo, ha e sebetse feela ho li-server tse nang le orchestration, empa hape le ka lingoloa tse fapaneng, le likhomphutha tsa bahlahlobisisi ba lokelang ho sebetsa. le ho lokisa lipeipi tse rarahaneng tsa ts'ebetso ea data ntle le ho tšoenyeha ka litaba tsa morao-rao. Ka tsela, ho ne ho ke ke ha utloisa bohloko ho arolelana hore lisebelisoa tsa rona tsa mantlha, ho kenyeletsoa le khoutu ea sebopeho sa config, li kentsoe ka setup.py – mmoho sena se kopanya khoutu ya rona hore e be ecosystem e le nngwe, e ikemetseng ho sethala le mokgwa wa tshebediso.

Tlhaloso ea Kubernetes pod e shebahala tjena:

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

Ke hore, sephiri ka seng se hlalosa karolo e le 'ngoe. Liphiri ka botsona li entsoe ka tsela ena:

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

Ka kopanelo sena se fella ka ho theoa ha lifaele tsa YAML tseleng /etc/secrets/db-main/section_name.yaml

'Me bakeng sa ho qalisoa ha lehae, ho sebelisoa config, e fumanehang mohloling oa motso oa morero kapa tseleng e boletsoeng ho feto-fetoha ha tikoloho. Khoutu e ikarabellang bakeng sa boiketlo bona e ka bonoa ho mofosi.

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

Monahano o bonolo haholo: re kopanya li-configs tse kholo ho tsoa bukeng ea projeke le litsela ka ho feto-fetoha ha tikoloho, le likarolo tse nyane tsa tlhophiso ho tsoa liphiring tsa Kuber, ebe re li lokisa hanyane. Le tse ling tse fapaneng. Kea hlokomela hore ha u batla lifaele ho tloha liphiring, ho sebelisoa moeli o tebileng, hobane K8s e etsa folda e patiloeng sephiring se seng le se seng moo liphiri ka botsona li bolokiloeng teng, 'me sehokelo feela se fumaneha boemong bo phahameng.

Ke tšepa hore se hlalositsoeng se tla ba molemo ho motho e mong :) Maikutlo le litlhahiso leha e le life mabapi le tšireletso kapa libaka tse ling tsa ntlafatso li amoheloa. Maikutlo a sechaba a boetse a thahasellisa, mohlomong ho bohlokoa ho eketsa tšehetso bakeng sa ConfigMaps (morero oa rona ha o e-so e sebelise) le ho phatlalatsa khoutu ho GitHub / PyPI? Ka bonna, ke nahana hore lintho tse joalo ke tsa motho ka mong hore merero e ke ke ea e-ba teng hohle, 'me ke sheba hanyenyane ts'ebetsong ea batho ba bang, joalo ka e fanoeng mona, le puisano ea li-nuances, malebela le mekhoa e metle, eo ke tšepang ho e bona litlhalosong. , ho lekane 😉

Ke basebelisi ba ngolisitsoeng feela ba ka kenyang letsoho phuputsong. kenaka kopo.

Na ke lokela ho phatlalatsa joalo ka morero/laeborari?

  • 0,0%Ee, nka sebelisa /contribution0

  • 33,3%E, hoo ho utloahala ho le monate4

  • 41,7%Che, ke mang ea lokelang ho e etsa ka bobona ka mokhoa oa bona le ho lumellana le litlhoko tsa bona5

  • 25,0%Ke tla ithiba ho araba3

Basebelisi ba 12 ba ile ba khetha. Basebelisi ba 3 ba hanne.

Source: www.habr.com

Eketsa ka tlhaloso