Hoʻonohonoho papahana ma loko a ma waho o Kubernetes

Ua kākau koke wau pane e pili ana i ke ola o ka papahana ma Docker a me ka debugging code ma waho, kahi āna i ʻōlelo pōkole ai e hiki iā ʻoe ke hana i kāu ʻōnaehana hoʻonohonoho ponoʻī i hana maikaʻi ka lawelawe ma Kuber, huki i nā mea huna, a holo maʻalahi ma ka ʻāina, ʻoiai ma waho o Docker holoʻokoʻa. ʻAʻohe mea paʻakikī, akā hiki ke hoʻohana ʻia ka "recipe" i hōʻike ʻia i kekahi :) Aia ke code ma Python, akā ʻaʻole pili ka loiloi i ka ʻōlelo.

Hoʻonohonoho papahana ma loko a ma waho o Kubernetes

ʻO ka hope o ka nīnau penei: i kekahi manawa aia hoʻokahi papahana, i ka manawa mua he monolith liʻiliʻi me nā mea pono a me nā palapala, akā i ka manawa i ulu aʻe, māhele ʻia i nā lawelawe, a laila hoʻomaka e māhele ʻia i microservices, a a laila hoʻonui ʻia. I ka wā mua, ua hana ʻia kēia mau mea āpau ma VPS wale nō, nā kaʻina hana o ka hoʻonohonoho ʻana a me ka hoʻokau ʻana i nā code i hoʻohana ʻia me ka hoʻohana ʻana iā Ansible, a ua hui pū ʻia kēlā me kēia lawelawe me kahi YAML config me nā hoʻonohonoho pono a me nā kī, a ua hoʻohana ʻia kahi faila config like. nā hoʻokuʻu kūloko, kahi i kūpono loa, no ka mea, ua hoʻouka ʻia kēia config i kahi mea honua, hiki ke loaʻa mai nā wahi āpau o ka papahana.

Eia nō naʻe, ʻo ka ulu ʻana o ka nui o nā microservices, kā lākou pili, a pono no ka hoʻopaʻa ʻana a me ka nānā ʻana, i hōʻike mua i ka neʻe ʻana i Kuber, ke holomua nei. Me ke kōkua ʻana i ka hoʻoponopono ʻana i nā pilikia i ʻōlelo ʻia, hāʻawi ʻo Kubernetes i kāna mau ala i ka hoʻokele waiwai, me i kapa ʻia ʻo Nā mea huna и nā ala e hana pū ai me lākou. He kūlana a hilinaʻi ka mīkini, no laila he hewa maoli ka hoʻohana ʻole ʻana! Akā i ka manawa like, makemake wau e mālama i kaʻu ʻano o kēia manawa no ka hana ʻana me ka config: ʻo ka mea mua, e hoʻohana like ia i nā microservices like ʻole o ka papahana, a ʻo ka lua, e hiki ke holo i ke code ma ka mīkini kūloko me ka hoʻohana ʻana i kahi maʻalahi. config file.

Ma kēia mea, ua hoʻololi ʻia ke ʻano o ke kūkulu ʻana i kahi mea hoʻonohonoho i hiki ke hana pū me kā mākou faila config maʻamau a me nā mea huna mai Kuber. Ua kuhikuhi ʻia kahi ʻano hoʻonohonoho ʻoi aku ka paʻakikī, ma ka ʻōlelo o ke kolu o ka Python, penei:

Dict[str, Dict[str, Union[str, int, lana]]]

ʻO ia, ʻo ka cogfig hope he puke wehewehe ʻōlelo me nā ʻāpana i kapa ʻia, ʻo kēlā me kēia mea he puke wehewehe ʻōlelo me nā waiwai mai nā ʻano maʻalahi. A wehewehe nā ʻāpana i ka hoʻonohonoho ʻana a me ke komo ʻana i nā kumuwaiwai o kekahi ʻano. ʻO kahi laʻana o kahi ʻāpana o kā mākou 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"

I ka manawa like, ke kahua engine hiki ke hoʻokomo i nā waihona ma SQLite, a redis hoʻonoho i mock, e hōʻike pū ana i ka inoa o ka faila e mālama ai - ʻike pono ʻia kēia mau ʻāpana a hana ʻia, e maʻalahi ai ka holo ʻana i ke code kūloko no ka debugging, hoʻāʻo ʻana a me nā pono ʻē aʻe. He mea koʻikoʻi kēia no mākou no ka mea he nui nā pono ʻē aʻe - ʻo kahi hapa o kā mākou code i manaʻo ʻia no nā helu analytical like ʻole, holo ia ʻaʻole wale ma nā kikowaena me ka orchestration, akā me nā palapala like ʻole, a ma nā kamepiula o nā mea loiloi e pono ai ke hana ma o a me ka debug i nā paipu hoʻoili ʻikepili paʻakikī me ka hopohopo ʻole i nā pilikia hope. Ma ke ala, ʻaʻole ia e ʻeha ke kaʻana like i kā mākou mau mea hana nui, me ka code layout config, ua hoʻokomo ʻia ma o setup.py - hui pū kēia i kā mākou code i hoʻokahi kaiaolaola, kūʻokoʻa i ka paepae a me ke ʻano o ka hoʻohana ʻana.

ʻO ka wehewehe ʻana o kahi pod Kubernetes e like me kēia:

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

ʻO ia hoʻi, wehewehe kēlā me kēia mea huna i hoʻokahi ʻāpana. Ua hana ʻia nā mea huna e like me kēia:

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

ʻO kēia ka hopena i ka hana ʻana i nā faila YAML ma ke ala /etc/secrets/db-main/section_name.yaml

A no nā hoʻokuʻu kūloko, hoʻohana ʻia ka config, aia ma ka papa kuhikuhi kumu o ka papahana a i ʻole ma ke ala i kuhikuhi ʻia i ka ʻano hoʻololi kaiapuni. Hiki ke ʻike ʻia ke code kuleana no kēia mau ʻoluʻolu ma ka 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()

He mea maʻalahi ka manaʻo maʻaneʻi: hoʻohui mākou i nā configs nui mai ka papa kuhikuhi papahana a me nā ala e ka hoʻololi kaiapuni, a me nā ʻāpana hoʻonohonoho liʻiliʻi mai nā mea huna Kuber, a laila e hoʻomākaukau mua iā lākou. Hoʻohui i kekahi mau mea hoʻololi. Hoʻomaopopo wau i ka ʻimi ʻana i nā faila mai nā mea huna, hoʻohana ʻia kahi palena hohonu, no ka mea, hana ʻo K8s i kahi waihona huna i kēlā me kēia mea huna kahi i mālama ʻia ai nā mea huna, a aia kahi loulou i kahi kiʻekiʻe.

Manaʻo wau he mea pono ka mea i wehewehe ʻia i kekahi :) ʻAe ʻia nā manaʻo a me nā ʻōlelo paipai e pili ana i ka palekana a i ʻole nā ​​​​wahi ʻē aʻe no ka hoʻomaikaʻi ʻana. He mea hoihoi nō hoʻi ka manaʻo o ke kaiāulu, pono paha e hoʻohui i ke kākoʻo no ConfigMaps (ʻaʻole hoʻohana kā mākou papahana iā lākou) a hoʻopuka i ke code ma GitHub / PyPI? ʻO wau iho, manaʻo wau he ʻokoʻa loa ia mau mea no nā papahana i ke ao holoʻokoʻa, a me ka nānā iki ʻana i ka hoʻokō ʻana o nā poʻe ʻē aʻe, e like me ka mea i hāʻawi ʻia ma aneʻi, a me kahi kūkākūkā o nā nuances, nā ʻōlelo aʻoaʻo a me nā hana maikaʻi loa, aʻu e manaʻo nei e ʻike ma nā ʻōlelo. , ua lawa 😉

Hiki i nā mea hoʻohana i hoʻopaʻa inoa ʻia ke komo i ka noiʻi. Eʻe, e 'oluʻolu.

Pono au e paʻi ma ke ʻano he papahana/ hale waihona puke?

  • 0,0%ʻAe, hoʻohana wau i /contribution0

  • 33,3%ʻAe, maikaʻi kēlā

  • 41,7%ʻAʻole, ʻo wai ka mea pono e hana iā lākou iho ma kā lākou ʻano ponoʻī a kūpono i kā lākou pono5

  • 25,0%ʻAʻole wau e pane3

12 mea hoʻohana i koho. Ua hōʻole nā ​​mea hoʻohana 3.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka