የፕሮጀክት ውቅር ከውስጥ እና ከኩበርኔትስ ውጭ

በቅርቡ ጽፌ ነበር። ስለፕሮጀክት ህይወት በዶከር እና ከእሱ ውጭ ያለውን ኮድ ማረም መልስ ይስጡአገልግሎቱ በኩቤር ውስጥ በደንብ እንዲሰራ፣ ሚስጥሮችን በመሳብ እና ከዶከር ውጭም ቢሆን በአገር ውስጥ ምቹ ሆኖ እንዲሰራ የእራስዎን የውቅር ስርዓት መስራት እንደሚችሉ በአጭሩ ጠቅሷል። ምንም የተወሳሰበ ነገር የለም፣ ነገር ግን የተገለጸው "የምግብ አዘገጃጀት" ለአንድ ሰው ጠቃሚ ሊሆን ይችላል :) ኮዱ በፓይዘን ውስጥ ነው, ግን አመክንዮው ከቋንቋው ጋር የተያያዘ አይደለም.

የፕሮጀክት ውቅር ከውስጥ እና ከኩበርኔትስ ውጭ

የጥያቄው ዳራ ይህ ነው-በአንድ ወቅት አንድ ፕሮጀክት ነበር ፣ መጀመሪያ ላይ መገልገያዎች እና ስክሪፕቶች ያሉት ትንሽ ሞኖሊት ነበር ፣ ግን ከጊዜ በኋላ እያደገ ፣ ወደ አገልግሎቶች ተከፋፈለ ፣ በምላሹም ወደ ማይክሮ ሰርቪስ መከፋፈል ጀመረ ፣ እና ከዚያም ወደላይ. በመጀመሪያ ፣ ይህ ሁሉ የተደረገው በባዶ ቪፒኤስ ላይ ነው ፣ ኮድን የማዘጋጀት እና የማሰማራት ሂደቶች Ansible ን በመጠቀም አውቶማቲክ የተደረጉ ናቸው ፣ እና እያንዳንዱ አገልግሎት በ YAML ውቅር አስፈላጊ በሆኑ መቼቶች እና ቁልፎች ተሰብስቧል ፣ እና ተመሳሳይ የማዋቀሪያ ፋይል ጥቅም ላይ ውሏል። የአካባቢ ማስጀመሪያዎች፣ ይህም በጣም ምቹ ነበር፣ ምክንያቱም .k ይህ ውቅረት በፕሮጀክቱ ውስጥ ከየትኛውም ቦታ ሊደረስበት ወደሚችል አለም አቀፍ ነገር ተጭኗል።

ሆኖም ግን, በማይክሮ ሰርቪስ ቁጥር እድገት, ግንኙነቶቻቸው እና የተማከለ ምዝግብ ማስታወሻ እና ክትትል አስፈላጊነትአሁንም በሂደት ላይ ወዳለው ወደ ኩቤር የሚደረገውን ጉዞ ጥላ ነበር። የተጠቀሱትን ችግሮች ለመፍታት ከእርዳታ ጋር, ኩበርኔትስ የመሠረተ ልማት አስተዳደርን ጨምሮ አቀራረቦቹን ያቀርባል ሚስጥሮች የሚባሉት и ከእነሱ ጋር ለመስራት መንገዶች. ዘዴው ደረጃውን የጠበቀ እና አስተማማኝ ነው, ስለዚህ እሱን አለመጠቀም በትክክል ኃጢአት ነው! ግን በተመሳሳይ ጊዜ ከውቅረት ጋር ለመስራት የአሁኑን ቅርፀቴን ማቆየት እፈልጋለሁ-በመጀመሪያ ፣ በፕሮጀክቱ የተለያዩ ማይክሮ አግልግሎቶች ውስጥ አንድ ወጥ በሆነ መንገድ ለመጠቀም እና ሁለተኛ ፣ ኮዱን በአከባቢው ማሽን ላይ አንድ ቀላል በመጠቀም ማስኬድ መቻል። config ፋይል.

በዚህ ረገድ፣ የማዋቀሪያ ዕቃን የሚሠራበት ዘዴ በሁለቱም በእኛ ክላሲክ ማዋቀር ፋይላችን እና ከኩበር ሚስጥሮች ጋር መሥራት እንዲችል ተስተካክሏል። በሦስተኛው ፓይዘን ቋንቋ በሚከተለው መልኩ ይበልጥ ጥብቅ የሆነ የማዋቀር መዋቅርም ተገልጿል፡

ዲክት[str, ዲክት[str, ህብረት[str, int, ተንሳፋፊ]]]

ማለትም ፣ የመጨረሻው ኮግፊግ የተሰየሙ ክፍሎች ያሉት መዝገበ ቃላት ነው ፣ እያንዳንዱም ከቀላል ዓይነቶች እሴቶች ያለው መዝገበ-ቃላት ነው። እና ክፍሎች የአንድ የተወሰነ አይነት ሀብቶች ውቅር እና መዳረሻን ይገልጻሉ። የእኛ ውቅረት ቁራጭ ምሳሌ፡-

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"

በተመሳሳይ ጊዜ, ሜዳው engine የውሂብ ጎታዎች በ SQLite ላይ ሊጫኑ ይችላሉ, እና redis አዘጋጅ mock, እንዲሁም ለማስቀመጥ የፋይሉን ስም በመጥቀስ - እነዚህ መለኪያዎች በትክክል ተለይተው የሚታወቁ እና የተካሄዱ ናቸው, ይህም ኮድን ለማረም, ለክፍል ፍተሻ እና ለማንኛውም ሌሎች ፍላጎቶች በአካባቢው ለማሄድ ቀላል ያደርገዋል. ይህ ለእኛ በጣም አስፈላጊ ነው ምክንያቱም ሌሎች ብዙ ፍላጎቶች አሉ - የእኛ ኮድ አካል ለተለያዩ የትንታኔ ስሌቶች የታሰበ ነው ፣ እሱ በኦርኬስትራ ውስጥ ባሉ አገልጋዮች ላይ ብቻ ሳይሆን በተለያዩ ስክሪፕቶች እና በተንታኞች ውስጥ መሥራት በሚፈልጉ ኮምፒተሮች ላይ ይሰራል ። እና የተወሳሰቡ የመረጃ ማቀነባበሪያ ቧንቧዎችን ያለምንም ጭንቀት የኋላ ችግርን ያርሙ። በነገራችን ላይ ዋና መሳሪያዎቻችን፣ የውቅረት አቀማመጥ ኮድን ጨምሮ በ በኩል መጫኑን ማጋራት አይጎዳም። setup.py - ይህ በአንድ ላይ የእኛን ኮድ ከመድረክ እና ከአጠቃቀም ዘዴ ነፃ የሆነ አንድ ነጠላ ሥነ-ምህዳር ያደርገዋል።

የኩበርኔትስ ፖድ መግለጫ ይህንን ይመስላል።

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

ያም ማለት እያንዳንዱ ሚስጥር አንድን ክፍል ይገልፃል. ምስጢሮቹ እራሳቸው የተፈጠሩት እንደሚከተለው ነው።

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

ይህ በአንድ ላይ የ YAML ፋይሎች በመንገዱ ላይ እንዲፈጠሩ ያደርጋል /etc/secrets/db-main/section_name.yaml

እና ለአካባቢያዊ ማስጀመሪያዎች, አወቃቀሩ ጥቅም ላይ ይውላል, በፕሮጀክቱ ስር ማውጫ ውስጥ ወይም በአከባቢው ተለዋዋጭ ውስጥ በተጠቀሰው መንገድ ላይ ይገኛል. ለእነዚህ ምቾቶች ተጠያቂ የሆነው ኮድ በአጥፊው ውስጥ ሊታይ ይችላል.

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

እዚህ ያለው አመክንዮ በጣም ቀላል ነው ከፕሮጀክት ማውጫው ትላልቅ ውቅሮችን እና ዱካዎችን በአከባቢው ተለዋዋጭ እና ትናንሽ የማዋቀሪያ ክፍሎችን ከኩበር ሚስጥሮች ጋር እናጣምራለን እና ከዚያ ትንሽ ቀድመን እናዘጋጃቸዋለን። በተጨማሪም አንዳንድ ተለዋዋጮች. ከምስጢር ፋይሎችን በሚፈልጉበት ጊዜ ጥልቅ ውስንነት ጥቅም ላይ እንደሚውል አስተውያለሁ ፣ ምክንያቱም K8s ምስጢሮች እራሳቸው የሚቀመጡበት በእያንዳንዱ ምስጢር ውስጥ የተደበቀ አቃፊ ስለሚፈጥር እና ማገናኛ ብቻ ከፍ ባለ ደረጃ ላይ ይገኛል።

የተገለፀው ለአንድ ሰው ጠቃሚ እንደሚሆን ተስፋ አደርጋለሁ :) ደህንነትን ወይም ሌሎች መሻሻልን በሚመለከት ማንኛውም አስተያየቶች እና ምክሮች ተቀባይነት አላቸው. የማህበረሰቡ አስተያየትም አስደሳች ነው ፣ ምናልባት ለ ConfigMaps ድጋፍ ማከል (ፕሮጀክታችን እስካሁን አልተጠቀመባቸውም) እና ኮዱን በ GitHub / PyPI ላይ ማተም ጠቃሚ ነው? በግሌ፣ እኔ እንደማስበው እንደዚህ ያሉ ነገሮች ለፕሮጀክቶች ሁለንተናዊ እንዳይሆኑ በጣም ግላዊ ናቸው ፣ እና እዚህ እንደተገለጸው የሌሎች ሰዎችን አፈፃፀሞች ላይ ትንሽ ማየት ፣ እና በአስተያየቶቹ ውስጥ ለማየት ተስፋ የምፈልገውን የልዩነት ፣ ምክሮች እና ምርጥ ልምዶች ውይይት። , ይበቃል 😉

በዳሰሳ ጥናቱ ውስጥ የተመዘገቡ ተጠቃሚዎች ብቻ መሳተፍ ይችላሉ። ስግን እንእባክህን።

እንደ ፕሮጀክት/ቤተ-መጽሐፍት ማተም አለብኝ?

  • 0,0%አዎ፣/አስተዋጽኦ0ን እጠቀማለሁ።

  • 33,3%አዎ በጣም ጥሩ ይመስላል4

  • 41,7%አይደለም፣ ማን በራሱ ፎርማት እና ፍላጎታቸውን ለማሟላት ራሳቸው ማድረግ አለባቸው5

  • 25,0%መልስ ከመስጠት እቆጠባለሁ3

12 ተጠቃሚዎች ድምጽ ሰጥተዋል። 3 ተጠቃሚዎች ድምፀ ተአቅቦ አድርገዋል።

ምንጭ: hab.com

አስተያየት ያክሉ