Fanofanana tetikasa ao anatiny sy ivelan'ny Kubernetes

Nanoratra aho vao haingana valiny momba ny fiainan'ny tetikasa ao amin'ny Docker sy ny kaody debugging ivelan'izany, izay nilazany fohifohy fa afaka manamboatra ny rafitrao manokana ianao mba hiasa tsara ao amin'ny Kuber ny serivisy, misintona tsiambaratelo ary mandeha tsara eo an-toerana, na dia ivelan'ny Docker tanteraka aza. Tsy misy sarotra, fa ny "recette" voalaza dia mety hahasoa olona iray :) Ny code dia amin'ny Python, fa ny lojika dia tsy mifamatotra amin'ny fiteny.

Fanofanana tetikasa ao anatiny sy ivelan'ny Kubernetes

Ny fototry ny fanontaniana dia izao: nisy tetik'asa iray taloha, tamin'ny voalohany dia monolith kely miaraka amin'ny fitaovana sy script, saingy rehefa nandeha ny fotoana dia nitombo, nizara ho serivisy, izay nanomboka nizara ho microservices, ary dia nitombo. Tamin'ny voalohany, izany rehetra izany dia natao tamin'ny VPS miboridana, ny fizotran'ny fametrahana sy ny fametrahana kaody izay mandeha ho azy amin'ny fampiasana Ansible, ary ny serivisy tsirairay dia natambatra miaraka amin'ny YAML config miaraka amin'ny fanovana sy ny fanalahidy ilaina, ary ny rakitra config mitovy amin'izany dia nampiasaina ho an'ny. ny fandefasana eo an-toerana, izay tena nety tokoa, satria .k ity config ity dia ampidirina amina zavatra manerantany, azo idirana na aiza na aiza ao amin'ilay tetikasa.

Na izany aza, ny fitomboan'ny isan'ny microservices, ny fifandraisany, ary ilaina ny fitrandrahana sy ny fanaraha-maso foibe, naneho mialoha ny fifindra-monina ho any Kuber, izay mbola mitohy. Miaraka amin'ny fanampiana amin'ny famahana ireo olana voalaza, Kubernetes dia manolotra ny fomba fiasany amin'ny fitantanana fotodrafitrasa, anisan'izany atao hoe Tsiambaratelo и fomba hiarahana miasa aminy. Ny mekanika dia manara-penitra sy azo itokisana, noho izany dia fahotana ara-bakiteny ny tsy fampiasana azy! Saingy miaraka amin'izay koa, tiako ny hitazona ny endrika ankehitriny amin'ny fiasana amin'ny config: voalohany, hampiasa azy io ho mitovy amin'ny microservices isan-karazany amin'ny tetikasa, ary faharoa, mba hahafahana mampandeha ny code amin'ny milina eo an-toerana amin'ny fampiasana tsotra iray. config file.

Amin'io lafiny io, ny mekanika amin'ny fananganana zavatra fikajiana dia novaina mba ho afaka miasa miaraka amin'ny rakitra config mahazatra anay sy miaraka amin'ny tsiambaratelo avy amin'i Kuber. Nisy rafitra config henjana kokoa ihany koa nofaritana, amin'ny fitenin'ny Python fahatelo, toy izao manaraka izao:

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

Izany hoe, ny cogfig farany dia rakibolana misy fizarana nomena anarana, ny tsirairay amin'izy ireo dia rakibolana misy soatoavina avy amin'ny karazana tsotra. Ary ny fizarana dia mamaritra ny fanamafisana sy ny fidirana amin'ny loharanon'ny karazana iray. Ohatra iray amin'ny ampahany amin'ny config:

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"

Mandritra izany fotoana izany, ny saha engine azo apetraka amin'ny SQLite ny databases, ary redis napetraka amin'ny mock, manondro ihany koa ny anaran'ny rakitra hotehirizina - ireo masontsivana ireo dia fantatra sy voakarakara tsara, izay manamora ny fampandehanana ny kaody eo an-toerana ho an'ny debugging, fitiliana unit ary izay ilaina hafa. Tena zava-dehibe ho antsika izany satria misy filàna maro hafa - ny ampahany amin'ny kaody ataontsika dia natao ho an'ny kajy famakafakana isan-karazany, tsy amin'ny lohamilina misy orkestra ihany no mandeha, fa amin'ny script isan-karazany, ary amin'ny solosain'ny mpandinika izay mila miasa. ary debug ny fantsona fanodinana angon-drakitra sarotra nefa tsy manahy ny olana any aoriana. Raha ny marina, tsy maninona ny mizara fa ny fitaovana fototra, anisan'izany ny kaody layout config, dia napetraka amin'ny alàlan'ny setup.py – miaraka izany dia mampiray ny kaodinay ho lasa tontolo iainana tokana, tsy miankina amin'ny sehatra sy ny fomba fampiasana.

Toy izao ny famaritana ny pod Kubernetes:

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

Izany hoe, ny tsiambaratelo tsirairay dia mamaritra fizarana iray. Ny tsiambaratelo dia noforonina toy izao:

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

Miaraka izany dia miteraka famoronana rakitra YAML eny an-dalana /etc/secrets/db-main/section_name.yaml

Ary ho an'ny fandefasana eo an-toerana dia ampiasaina ny config, hita ao amin'ny lahatahiry fototry ny tetikasa na amin'ny lalana voafaritra ao amin'ny fari-piainan'ny tontolo iainana. Ny kaody tompon'andraikitra amin'ireo fanamorana ireo dia azo jerena ao amin'ny 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()

Tsotra ny lojika eto: manambatra ny config lehibe avy amin'ny lahatahiry sy ny lalan'ny tetikasa amin'ny fari-piainan'ny tontolo iainana, ary ny fizarana config kely avy amin'ny tsiambaratelo Kuber, ary avy eo amboary kely. Miampy variables sasany. Marihiko fa rehefa mikaroka rakitra avy amin'ny tsiambaratelo, dia misy fetra lalina no ampiasaina, satria K8s dia mamorona lahatahiry miafina ao amin'ny tsiambaratelo tsirairay izay itahirizana ny tsiambaratelo, ary rohy iray fotsiny no misy amin'ny ambaratonga ambony.

Manantena aho fa hahasoa olona iray ny voalaza :) Ekena izay fanehoan-kevitra sy tolo-kevitra momba ny fiarovana na sehatra hafa ho fanatsarana. Mahaliana ihany koa ny hevitry ny vondrom-piarahamonina, mety ilaina ny manampy fanohanana ny ConfigMaps (mbola tsy mampiasa azy ireo ny tetikasanay) ary mamoaka ny kaody ao amin'ny GitHub / PyPI? Amiko manokana dia mihevitra aho fa ny zavatra toy izany dia tena manokana ho an'ny tetikasa ho an'ny rehetra, ary mijery kely amin'ny fampiharana ny olon-kafa, toy ny voalaza eto, ary ny fifanakalozan-kevitra momba ny nuances, toro-hevitra ary fomba fanao tsara indrindra, izay antenaiko ho hita ao amin'ny fanehoan-kevitra. , ampy 😉

Ireo mpampiasa voasoratra anarana ihany no afaka mandray anjara amin'ny fanadihadiana. HiditraPlease.

Tokony havoaka ho tetikasa/fitehirizam-boky ve aho?

  • 0,0%Eny, hampiasa /contribution0 aho

  • 33,3%Eny, toa mahafinaritra izany4

  • 41,7%Tsia, iza no mila manao izany amin'ny endriny manokana sy mifanaraka amin'ny filany5

  • 25,0%Tsy hamaly aho3

Mpampiasa 12 no nifidy. Mpampiasa 3 no nifady.

Source: www.habr.com

Add a comment