Kubernetes ඇතුළත සහ පිටත ව්‍යාපෘති වින්‍යාසය

මම මෑතකදී ලිව්වා Docker හි ව්‍යාපෘති ජීවිතය සහ ඉන් පිටත දෝශ නිරාකරණ කේතය පිළිබඳ පිළිතුරු, එහිදී ඔහු කෙටියෙන් සඳහන් කළේ ඔබට ඔබේම වින්‍යාස පද්ධතියක් සෑදිය හැකි අතර එමඟින් සේවාව Kuber තුළ හොඳින් ක්‍රියාත්මක වන පරිදි, රහස් උදුරා ගැනීමට සහ ඩොකර් වෙතින් පිටත වුවද පහසුවෙන් දේශීයව ධාවනය වේ. කිසිවක් සංකීර්ණ නැත, නමුත් විස්තර කරන ලද "වට්ටෝරුව" කෙනෙකුට ප්රයෝජනවත් විය හැක :) කේතය Python හි ඇත, නමුත් තර්කනය භාෂාවට බැඳී නැත.

Kubernetes ඇතුළත සහ පිටත ව්‍යාපෘති වින්‍යාසය

ප්‍රශ්නයට පසුබිම මෙයයි: වරෙක එක් ව්‍යාපෘතියක් විය, මුලදී එය උපයෝගිතා සහ ස්ක්‍රිප්ට් සහිත කුඩා ඒකලිතයක් විය, නමුත් කාලයත් සමඟ එය වර්ධනය වී, සේවා වලට බෙදා, අනෙක් අතට ක්ෂුද්‍ර සේවා වලට බෙදීමට පටන් ගත්තේය. පසුව පරිමාණය කර ඇත. මුලදී, මේ සියල්ල හිස් වීපීඑස් මත සිදු කරන ලදී, ඇන්සිබල් භාවිතයෙන් ස්වයංක්‍රීය කරන ලද කේත සැකසීමේ සහ යෙදවීමේ ක්‍රියාවලීන්, සහ සෑම සේවාවක්ම අවශ්‍ය සැකසුම් සහ යතුරු සහිත YAML වින්‍යාසයකින් සම්පාදනය කරන ලද අතර ඒ සඳහා සමාන වින්‍යාස ගොනුවක් භාවිතා කරන ලදී. දේශීය දියත් කිරීම්, ඉතා පහසු විය, මන්ද .k මෙම වින්‍යාසය ගෝලීය වස්තුවකට පටවා ඇති අතර, ව්‍යාපෘතියේ ඕනෑම තැනක සිට ප්‍රවේශ විය හැක.

කෙසේ වෙතත්, ක්ෂුද්ර සේවා සංඛ්යාව වර්ධනය, ඔවුන්ගේ සම්බන්ධතා, සහ මධ්යගත ලොග් කිරීම සහ අධීක්ෂණය සඳහා අවශ්ය වේ, තවමත් ක්‍රියාත්මක වෙමින් පවතින කුබර් වෙත යාමක් පුරෝකථනය කළේය. සඳහන් කළ ගැටළු විසඳීමේ සහය සමඟ එක්ව, Kubernetes යටිතල පහසුකම් කළමනාකරණය සඳහා එහි ප්‍රවේශයන් ඉදිරිපත් කරයි. ඊනියා රහස් и ඔවුන් සමඟ වැඩ කිරීමට ක්රම. යාන්ත්‍රණය සම්මත සහ විශ්වාසදායක ය, එබැවින් එය භාවිතා නොකිරීමට වචනාර්ථයෙන් පාපයකි! නමුත් ඒ සමඟම, වින්‍යාසය සමඟ වැඩ කිරීම සඳහා මගේ වර්තමාන ආකෘතිය පවත්වා ගැනීමට මම කැමතියි: පළමුව, ව්‍යාපෘතියේ විවිධ ක්ෂුද්‍ර සේවා වල එය ඒකාකාරව භාවිතා කිරීමට, සහ දෙවනුව, එක් සරල භාවිතයෙන් දේශීය යන්ත්‍රයේ කේතය ක්‍රියාත්මක කිරීමට හැකි වීම. config ගොනුව.

මේ සම්බන්ධයෙන්, අපගේ සම්භාව්‍ය වින්‍යාස ගොනුව සමඟ සහ Kuber වෙතින් රහස් සමඟ ක්‍රියා කිරීමට හැකි වන පරිදි වින්‍යාස වස්තුවක් තැනීමේ යාන්ත්‍රණය වෙනස් කරන ලදී. වඩාත් දෘඩ වින්‍යාස ව්‍යුහයක් ද තුන්වන පයිතන් භාෂාවෙන් පහත පරිදි දක්වා ඇත:

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

එනම්, අවසාන cogfig යනු නම් කරන ලද කොටස් සහිත ශබ්ද කෝෂයක් වන අතර, ඒ සෑම එකක්ම සරල වර්ගවල අගයන් සහිත ශබ්ද කෝෂයකි. තවද කොටස් වින්‍යාසය සහ යම් ආකාරයක සම්පත් වෙත ප්‍රවේශය විස්තර කරයි. අපගේ වින්‍යාසයේ කොටසක උදාහරණයක්:

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 - මෙය එක්ව අපගේ කේතය වේදිකාවෙන් සහ භාවිත ක්‍රමයෙන් ස්වාධීනව තනි පරිසර පද්ධතියකට ඒකාබද්ධ කරයි.

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

එනම්, සෑම රහසක්ම එක් කොටසක් විස්තර කරයි. රහස් නිර්මාණය කර ඇත්තේ මේ ආකාරයට ය:

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

දේශීය දියත් කිරීම් සඳහා, ව්‍යාපෘතියේ මූල නාමාවලියෙහි හෝ පාරිසරික විචල්‍යයේ දක්වා ඇති මාර්ගයෙහි පිහිටා ඇති වින්‍යාසය භාවිතා වේ. මෙම පහසුව සඳහා වගකිව යුතු කේතය 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()

මෙහි තර්කනය ඉතා සරල ය: අපි ව්‍යාපෘති නාමාවලියෙන් විශාල වින්‍යාස සහ පාරිසරික විචල්‍ය අනුව මාර්ග සහ Kuber රහස් වලින් කුඩා වින්‍යාස කොටස් ඒකාබද්ධ කර ඒවා ටිකක් පෙර සකසන්නෙමු. ඊට අමතරව සමහර විචල්‍යයන්. රහස් වලින් ලිපිගොනු සෙවීමේදී ගැඹුරු සීමාවක් භාවිතා කරන බව මම සටහන් කරමි, මන්ද K8s රහස් ගබඩා කර ඇති සෑම රහසකම සැඟවුණු ෆෝල්ඩරයක් නිර්මාණය කරන අතර සබැඳියක් ඉහළ මට්ටමක පිහිටා ඇත.

විස්තර කර ඇති දේ යමෙකුට ප්‍රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි :) ආරක්ෂාව හෝ වැඩිදියුණු කිරීම සඳහා වෙනත් ක්ෂේත්‍ර සම්බන්ධයෙන් ඕනෑම අදහස් සහ නිර්දේශ පිළිගනු ලැබේ. ප්‍රජාවගේ මතය ද සිත්ගන්නා සුළුය, සමහර විට එය ConfigMaps සඳහා සහය එක් කිරීම වටී (අපගේ ව්‍යාපෘතිය තවමත් ඒවා භාවිතා නොකරයි) සහ GitHub / PyPI හි කේතය ප්‍රකාශයට පත් කිරීම වටී ද? පුද්ගලිකව, මම සිතන්නේ එවැනි දේවල් ව්‍යාපෘති විශ්වීය වීමට නොහැකි තරම් තනි පුද්ගල වන අතර, මෙහි දක්වා ඇති ආකාරයට අන් අයගේ ක්‍රියාත්මක කිරීම් දෙස මඳක් එබී බැලීම සහ සූක්ෂ්මතා, ඉඟි සහ හොඳම භාවිතයන් පිළිබඳ සාකච්ඡාවක්, මම අදහස් දැක්වීමේදී දැකීමට බලාපොරොත්තු වෙමි. , ඇති 😉

සමීක්ෂණයට සහභාගී විය හැක්කේ ලියාපදිංචි පරිශීලකයින්ට පමණි. පුරන්නකරුණාකර.

මම ව්‍යාපෘතියක්/පුස්තකාලයක් ලෙස ප්‍රකාශ කළ යුතුද?

  • 0,0%ඔව්, මම /contribution0 භාවිතා කරමි

  • 33,3%ඔව්, එය විශිෂ්ටයි 4

  • 41,7%නැත, එය ඔවුන්ගේම ආකෘතියෙන් සහ ඔවුන්ගේ අවශ්‍යතාවලට සරිලන පරිදි කළ යුත්තේ කවුද?

  • 25,0%මම පිළිතුරු දීමෙන් වළකිමි3

පරිශීලකයින් 12 දෙනෙක් ඡන්දය දුන්හ. පරිශීලකයින් 3 දෙනෙක් ඡන්දය දීමෙන් වැළකී සිටියහ.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න