Usanidi wa mradi ndani na nje ya Kubernetes

Niliandika hivi majuzi jibu juu ya maisha ya mradi katika Docker na msimbo wa kurekebisha nje yake, ambapo alitaja kwa ufupi kwamba unaweza kutengeneza mfumo wako wa usanidi ili huduma ifanye kazi vizuri katika Kuber, kuvuta siri, na kukimbia kwa urahisi ndani ya nchi, hata nje ya Docker kabisa. Hakuna ngumu, lakini "kichocheo" kilichoelezwa kinaweza kuwa na manufaa kwa mtu :) Kanuni iko kwenye Python, lakini mantiki haijafungwa kwa lugha.

Usanidi wa mradi ndani na nje ya Kubernetes

Asili ya swali ni hii: mara moja kulikuwa na mradi mmoja, mwanzoni ilikuwa monolith ndogo na huduma na maandishi, lakini baada ya muda ilikua, imegawanywa katika huduma, ambayo ilianza kugawanywa katika huduma ndogo, na. kisha kuongezwa. Hapo awali, haya yote yalifanyika kwenye VPS tupu, michakato ya kusanidi na kupeleka nambari ambayo ilijiendesha kwa kutumia Ansible, na kila huduma iliundwa na usanidi wa YAML na mipangilio na funguo muhimu, na faili kama hiyo ya usanidi ilitumika kwa uzinduzi wa ndani, ambao ulikuwa rahisi sana, kwa sababu .k usanidi huu umepakiwa kwenye kitu cha kimataifa, kinachoweza kufikiwa kutoka mahali popote kwenye mradi.

Hata hivyo, ukuaji wa idadi ya microservices, uhusiano wao, na haja ya ukataji miti wa kati na ufuatiliaji, ilitangulia kuhamia Kuber, ambayo bado inaendelea. Pamoja na usaidizi katika kutatua matatizo yaliyotajwa, Kubernetes inatoa mbinu zake za usimamizi wa miundombinu, ikiwa ni pamoja na zinazoitwa Siri ΠΈ njia za kufanya kazi nao. Utaratibu ni wa kawaida na wa kuaminika, kwa hivyo ni dhambi kutoutumia! Lakini wakati huo huo, ningependa kudumisha muundo wangu wa sasa wa kufanya kazi na usanidi: kwanza, kuitumia kwa usawa katika huduma ndogo tofauti za mradi, na pili, kuweza kuendesha nambari kwenye mashine ya ndani kwa kutumia moja rahisi. config faili.

Katika suala hili, utaratibu wa kuunda kitu cha usanidi ulirekebishwa ili kuweza kufanya kazi na faili yetu ya usanidi wa kawaida na kwa siri kutoka Kuber. Muundo mgumu zaidi wa usanidi pia ulibainishwa, katika lugha ya Python ya tatu, kama ifuatavyo.

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

Hiyo ni, cogfig ya mwisho ni kamusi iliyo na sehemu zilizotajwa, ambayo kila moja ni kamusi iliyo na maadili kutoka kwa aina rahisi. Na sehemu zinaelezea usanidi na ufikiaji wa rasilimali za aina fulani. Mfano wa kipande cha usanidi wetu:

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"

Wakati huo huo, shamba engine hifadhidata zinaweza kusanikishwa kwenye SQLite, na redis kuweka kwa mock, ikibainisha pia jina la faili ya kuhifadhi - vigezo hivi vinatambuliwa kwa usahihi na kusindika, ambayo inafanya kuwa rahisi kuendesha msimbo ndani ya nchi kwa ajili ya kurekebisha, kupima kitengo na mahitaji mengine yoyote. Hii ni muhimu sana kwetu kwa sababu kuna mahitaji mengine mengi - sehemu ya nambari yetu imekusudiwa kwa mahesabu anuwai ya uchambuzi, haifanyiki tu kwenye seva zilizo na orchestration, lakini pia na maandishi anuwai, na kwenye kompyuta za wachambuzi wanaohitaji kufanya kazi. na utatue mabomba changamano ya kuchakata data bila kuwa na wasiwasi kuhusu masuala ya nyuma. Kwa njia, haitaumiza kushiriki kwamba zana zetu kuu, ikiwa ni pamoja na msimbo wa mpangilio wa usanidi, umewekwa kupitia setup.py - kwa pamoja hii inaunganisha msimbo wetu kuwa mfumo mmoja wa ikolojia, usiotegemea jukwaa na njia ya matumizi.

Maelezo ya ganda la Kubernetes inaonekana kama hii:

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

Hiyo ni, kila siri inaelezea sehemu moja. Siri zenyewe zimeundwa kama hii:

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

Kwa pamoja hii inasababisha kuundwa kwa faili za YAML kwenye njia /etc/secrets/db-main/section_name.yaml

Na kwa ajili ya uzinduzi wa ndani, usanidi hutumiwa, ulio kwenye saraka ya mizizi ya mradi au kando ya njia iliyotajwa katika kutofautiana kwa mazingira. Nambari inayohusika na matumizi haya inaweza kuonekana kwenye kiharibu.

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

Mantiki hapa ni rahisi sana: tunachanganya usanidi mkubwa kutoka kwa saraka ya mradi na njia kwa kutofautisha kwa mazingira, na sehemu ndogo za usanidi kutoka kwa siri za Kuber, na kisha kuzishughulikia kidogo. Plus baadhi ya vigezo. Ninaona kwamba wakati wa kutafuta faili kutoka kwa siri, upungufu wa kina hutumiwa, kwa sababu K8s huunda folda iliyofichwa katika kila siri ambapo siri yenyewe huhifadhiwa, na kiungo tu iko kwenye ngazi ya juu.

Natumaini kile kilichoelezwa kitakuwa na manufaa kwa mtu :) Maoni na mapendekezo yoyote kuhusu usalama au maeneo mengine ya kuboresha yanakubaliwa. Maoni ya jumuiya pia yanavutia, labda inafaa kuongeza usaidizi kwa ConfigMaps (mradi wetu bado hautumii) na kuchapisha msimbo kwenye GitHub / PyPI? Binafsi, nadhani vitu kama hivyo ni vya kibinafsi sana kwa miradi kuwa ya ulimwengu wote, na kutazama kidogo utekelezwaji wa watu wengine, kama ile iliyotolewa hapa, na mjadala wa nuances, vidokezo na mazoea bora, ambayo natumai kuona kwenye maoni. , inatosha πŸ˜‰

Watumiaji waliojiandikisha pekee ndio wanaweza kushiriki katika utafiti. Weka sahihitafadhali.

Je, nichapishe kama mradi/maktaba?

  • 0,0%Ndio, ningetumia /contribution0

  • 33,3%Ndiyo, hiyo inasikika vizuri4

  • 41,7%Hapana, ni nani anayehitaji kuifanya wenyewe katika umbizo lao na kukidhi mahitaji yao5

  • 25,0%Nitaacha kujibu3

Watumiaji 12 walipiga kura. Watumiaji 3 walijizuia.

Chanzo: mapenzi.com

Kuongeza maoni