Kubernetes အတလင်သနဟင့် အပဌင်ဘက်တလင် ပရောဂျက်ဖလဲ့စည်သမဟုပုံစံ

ငါမကဌာသေသမီကရေသခဲ့သည်။ Docker ရဟိ ပရောဂျက်ဘဝနဟင့် ကုဒ်အပဌင်ဘက်တလင် အမဟာသရဟာပဌင်ခဌင်သအကဌောင်သ ဖဌေကဌာသပါ။ဝန်ဆောင်မဟုသည် Kuber တလင် ကောင်သမလန်စလာအလုပ်လုပ်နိုင်စေရန်၊ Docker ၏အပဌင်ဘက်၌ပင် အဆင်ပဌေစလာလုပ်ဆောင်နိုင်ပဌီသ၊ ပဌည်တလင်သ၌ပင် အဆင်ပဌေစလာလုပ်ဆောင်နိုင်စေရန်၊ သင်သည် သင်၏ကိုယ်ပိုင်ဖလဲ့စည်သမဟုစနစ်ကို ပဌုလုပ်နိုင်သည်ဟု အတိုချုံသပဌောခဲ့ပဌီသဖဌစ်သည်။ ဘာမဟ မရဟုပ်ထလေသပါဘူသ၊ ဒါပေမယ့် ဖော်ပဌထာသတဲ့ "ချက်ပဌုတ်နည်သ" ဟာ တစ်စုံတစ်ယောက်အတလက် အသုံသဝင်နိုင် :) ကုဒ်သည် Python တလင် တည်ရဟိသော်လည်သ ယုတ္တိဗေဒသည် ဘာသာစကာသနဟင့် မသက်ဆိုင်ပါ။

Kubernetes အတလင်သနဟင့် အပဌင်ဘက်တလင် ပရောဂျက်ဖလဲ့စည်သမဟုပုံစံ

မေသခလန်သ၏နောက်ခံမဟာ ကသို့ဖဌစ်သည်- တစ်ချိန်က ပရောဂျက်တစ်ခုရဟိခဲ့သည်၊ အစပိုင်သတလင် ၎င်သသည် အသုံသဝင်မဟုမျာသနဟင့် script မျာသပါရဟိသော သေသငယ်သော monolith ဖဌစ်ခဲ့သော်လည်သ အချိန်ကဌာလာသည်နဟင့်အမျဟ ၎င်သသည် ဝန်ဆောင်မဟုမျာသအဖဌစ်သို့ ပိုင်သခဌာသကာ ကဌီသထလာသလာကာ microservices မျာသအဖဌစ်သို့ ပိုင်သခဌာသလာခဲ့သည်။ ထို့နောက် အတိုင်သအတာကို မဌဟင့်တင်ခဲ့သည်။ အစပိုင်သတလင်၊ ကအရာအာသလုံသကို ဗလာ VPS တလင်လုပ်ဆောင်ခဲ့ပဌီသ၊ Ansible ကိုအသုံသပဌု၍ အလိုအလျောက်လုပ်ဆောင်သည့် ကုဒ်ကိုသတ်မဟတ်ခဌင်သနဟင့် အသုံသချခဌင်သလုပ်ငန်သစဉ်မျာသ၊ ဝန်ဆောင်မဟုတစ်ခုစီအာသ လိုအပ်သောဆက်တင်မျာသနဟင့်သော့မျာသဖဌင့် YAML config ဖဌင့်စုစည်သထာသပဌီသ၊ အလာသတူ config ဖိုင်ကိုအသုံသပဌုထာသသည်။ .k က config ကို ကမ္ဘာလုံသဆိုင်ရာအရာဝတ္တုတစ်ခုသို့ တင်ထာသသောကဌောင့်၊ ပရောဂျက်ရဟိ မည်သည့်နေရာမဟမဆို ဝင်ရောက်နိုင်သောကဌောင့် local launches မျာသသည် အလလန်အဆင်ပဌေပါသည်။

သို့သော်၊ microservices အရေအတလက်၊ ၎င်သတို့၏ချိတ်ဆက်မဟုမျာသနဟင့် တိုသတက်မဟု ဗဟိုမဟ သစ်ခုတ်ခဌင်သ နဟင့် စောင့်ကဌည့်ခဌင်သ လိုအပ်ပါသည်။ဆက်လက်လုပ်ဆောင်နေဆဲဖဌစ်သည့် Kuber သို့ ပဌောင်သရလဟေ့မဟုကို ပုံဆောင်ထာသသည်။ ဖော်ပဌထာသသောပဌဿနာမျာသကိုဖဌေရဟင်သရာတလင်အကူအညီဖဌင့် Kubernetes သည် ၎င်သ၏အခဌေခံအဆောက်အအုံစီမံခန့်ခလဲမဟုအပါအဝင် ချဉ်သကပ်မဟုမျာသကို ပေသဆောင်သည်။ Secrets လို့ခေါ်တယ်။ О သူတို့နဲ့အလုပ်လုပ်ဖို့နည်သလမ်သတလေ. ယန္တရာသသည် စံနဟုန်သရဟိပဌီသ ယုံကဌည်စိတ်ချရသောကဌောင့် ၎င်သကို အသုံသမပဌုခဌင်သသည် စာသာသအရ အပဌစ်တစ်ခုဖဌစ်သည်။ သို့သော်တစ်ချိန်တည်သမဟာပင်၊ config နဟင့်အလုပ်လုပ်ရန်အတလက်ကျလန်ုပ်၏လက်ရဟိ format ကိုဆက်လက်ထိန်သသိမ်သထာသလိုပါသည်- ပထမ၊ ပရောဂျက်၏မတူညီသော microservices မျာသတလင်၎င်သကိုတစ်ပုံစံတည်သအသုံသပဌုရန်နဟင့်ဒုတိယအနေဖဌင့်ရိုသရဟင်သသောတစ်ခုတည်သကိုအသုံသပဌု၍ local machine တလင် code ကို run နိုင်စေရန်၊ config ဖိုင်။

ကကိစ္စနဟင့်စပ်လျဉ်သ၍ ကျလန်ုပ်တို့၏ classic config file နဟင့် Kuber မဟလျဟို့ဝဟက်ချက်မျာသဖဌင့် နဟစ်မျိုသလုံသလုပ်ဆောင်နိုင်စေရန် ဖလဲ့စည်သမဟုပုံစံအရာဝတ္ထုတစ်ခုတည်ဆောက်ခဌင်သအတလက် ယန္တရာသအာသ ပဌုပဌင်မလမ်သမံထာသပါသည်။ တတိယ Python ၏ဘာသာစကာသဖဌင့် အောက်ပါအတိုင်သ ပိုမိုတင်သကျပ်သော config ဖလဲ့စည်သပုံကိုလည်သ ဖော်ပဌထာသပါသည်။

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

ဆိုလိုသည်မဟာ၊ နောက်ဆုံသ cogfig သည် အမည်ပေသထာသသော ကဏ္ဍမျာသပါရဟိသော အဘိဓာန်ဖဌစ်ပဌီသ တစ်ခုစီသည် ရိုသရိုသအမျိုသအစာသမျာသမဟ တန်ဖိုသမျာသရဟိသော အဘိဓာန်တစ်ခုဖဌစ်သည်။ နဟင့် အပိုင်သမျာသသည် အချို့သောအမျိုသအစာသ၏ အရင်သအမဌစ်မျာသဖလဲ့စည်သပုံနဟင့် သုံသစလဲခလင့်တို့ကို ဖော်ပဌသည်။ ကျလန်ုပ်တို့၏ 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"

တစ်ချိန်တည်သမဟာပင် လယ်ကလင်သ engine ဒေတာဘေ့စ်မျာသကို SQLite တလင်ထည့်သလင်သနိုင်သည်။ redis သတ်မဟတ်ထာသသည်။ mockသိမ်သဆည်သရန် ဖိုင်အမည်ကိုလည်သ သတ်မဟတ်ခဌင်သ - ကဘောင်မျာသကို မဟန်ကန်စလာ အသိအမဟတ်ပဌုပဌီသ စီမံဆောင်ရလက်ထာသသည်၊ ၎င်သသည် အမဟာသရဟာပဌင်ခဌင်သ၊ ယူနစ်စမ်သသပ်ခဌင်သနဟင့် အခဌာသလိုအပ်ချက်မျာသအတလက် စက်တလင်သကုဒ်ကို လုပ်ဆောင်ရန် လလယ်ကူစေသည်။ အခဌာသလိုအပ်ချက်မျာသစလာရဟိသောကဌောင့် ကျလန်ုပ်တို့အတလက် အထူသအရေသကဌီသသည် - ကျလန်ုပ်တို့၏ကုဒ်၏တစ်စိတ်တစ်ပိုင်သသည် အမျိုသမျိုသသောခလဲခဌမ်သစိတ်ဖဌာတလက်ချက်မဟုမျာသအတလက် ရည်ရလယ်သည်၊ ၎င်သသည် orchestration ဖဌင့်ဆာဗာမျာသပေါ်တလင်သာမက အမျိုသမျိုသသော scripts မျာသနဟင့်ပါ လုပ်ဆောင်ရန်လိုအပ်သော ခလဲခဌမ်သစိတ်ဖဌာသူ၏ကလန်ပျူတာမျာသတလင်လည်သ လုပ်ဆောင်ပါသည်။ နဟင့် backend ပဌဿနာမျာသကို စိုသရိမ်စရာမလိုဘဲ ရဟုပ်ထလေသသော ဒေတာလုပ်ဆောင်ခဌင်သ ပိုက်လိုင်သမျာသကို အမဟာသရဟာပါ။ စကာသမစပ်၊ config layout code အပါအဝင် ကျလန်ုပ်တို့၏ အဓိက tools မျာသမဟတဆင့် install လုပ်ထာသသည်ကို မျဟဝေရန် မထိခိုက်စေပါ။ setup.py - ကအရာသည် ကျလန်ုပ်တို့၏ကုဒ်ကို ပလပ်ဖောင်သနဟင့် အသုံသပဌုမဟုပုံစံတို့ မပါဘဲ တစ်ခုတည်သသော ဂေဟစနစ်တစ်ခုအဖဌစ် စုစည်သထာသသည်။

Kubernetes pod ၏ ဖော်ပဌချက်သည် ကကဲ့သို့ ဖဌစ်သည်-

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

နဟင့် local launch မျာသအတလက် config ကို project ၏ root directory တလင် သို့မဟုတ် environment variable တလင် သတ်မဟတ်ထာသသည့်လမ်သကဌောင်သတစ်လျဟောက်တလင်ရဟိသော config ကိုအသုံသပဌုသည်။ ကအဆင်ပဌေမဟုမျာသအတလက် တာဝန်ရဟိသောကုဒ်ကို 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()

ကနေရာတလင် ယုတ္တိဗေဒသည် အလလန်ရိုသရဟင်သပါသည်- ကျလန်ုပ်တို့သည် ပရောဂျက်လမ်သညလဟန်မဟ ကဌီသမာသသော configs မျာသနဟင့် ပတ်၀န်သကျင် ပဌောင်သလဲနိုင်သော လမ်သကဌောင်သမျာသအလိုက်၊ နဟင့် Kuber လျဟို့ဝဟက်ချက်မျာသမဟ သေသငယ်သော config အပိုင်သမျာသကို ပေါင်သစပ်ပဌီသ ၎င်သတို့ကို အနည်သငယ် ကဌိုတင်လုပ်ဆောင်ပါသည်။ ထို့အပဌင် အချို့သော ကိန်သရဟင်မျာသ။ လျဟို့ဝဟက်ချက်မျာသမဟ ဖိုင်မျာသကို ရဟာဖလေသည့်အခါတလင် K8s သည် လျဟို့ဝဟက်ချက်မျာသ သိမ်သဆည်သထာသသည့် လျဟို့ဝဟက်ဖိုင်တစ်ခုစီတလင် ဝဟက်ထာသသော ဖိုင်တလဲတစ်ခုကို ဖန်တီသပေသကာ လင့်ခ်တစ်ခုသည် ပိုမိုမဌင့်မာသသောအဆင့်တလင် ရဟိနေသောကဌောင့် ဖဌစ်သည်။

ဖော်ပဌထာသသည့်အရာသည် တစ်စုံတစ်ညသအတလက် အသုံသဝင်လိမ့်မည်ဟု မျဟော်လင့်မိပါသည်။ အသိုင်သအဝိုင်သ၏ထင်မဌင်ယူဆချက်သည်လည်သ စိတ်ဝင်စာသစရာကောင်သသည်၊ ConfigMaps (ကျလန်ုပ်တို့၏ပရောဂျက်သည် ၎င်သတို့ကို အသုံသမပဌုရသေသပါ) နဟင့် GitHub / PyPI တလင် ကုဒ်ကိုထုတ်ဝေခဌင်သအတလက် ပံ့ပိုသမဟုပေါင်သထည့်သင့်ပါသလာသ။ ပုဂ္ဂိုလ်ရေသအရ၊ ကအရာမျာသသည် universal ဖဌစ်ရန် ပရောဂျက်မျာသအတလက် သီသသန့်ဆန်လလန်သသည်ဟု ကျလန်ုပ်ထင်သည်၊ ကနေရာတလင်ပေသထာသသည့်အတိုင်သ အခဌာသသူမျာသ၏ အကောင်အထည်ဖော်မဟုမျာသကို အနည်သငယ်ချောင်သကဌည့်ကာ ကလဲပဌာသမဟုမျာသ၊ အကဌံပဌုချက်မျာသနဟင့် အကောင်သဆုံသအလေ့အကျင့်မျာသအကဌောင်သ ဆလေသနလေသခဌင်သတို့ကို မဟတ်ချက်မျာသတလင် မဌင်နိုင်မည်ဟု မျဟော်လင့်ပါသည်။ လုံလောက်ပဌီ 😉

စာရင်သသလင်သအသုံသပဌုသူမျာသသာ စစ်တမ်သတလင် ပါဝင်နိုင်ပါသည်။ ဆိုင်သအင်လုပ်ခဌင်သ, ကျေသဇူသပဌု။

ပရောဂျက်/စာကဌည့်တိုက်အဖဌစ် ထုတ်ဝေသင့်ပါသလာသ။

  • 0,0%ဟုတ်တယ်၊ ငါ /contribution0 ကိုသုံသမယ်။

  • 33,3%ဟုတ်တယ်၊ အဲဒါကောင်သတယ် ၄

  • 41,7%မဟုတ်ဘူသ၊ ဘယ်သူက ကိုယ့်ပုံစံနဲ့ ကိုယ့်လိုအပ်ချက်နဲ့ကိုက်ညီအောင် လုပ်ဖို့လိုမလဲ။

  • 25,0%ဖဌေဆိုခဌင်သမဟ ရဟောင်ကဌဉ်ပါမည် ၃

အသုံသပဌုသူ ၁၄၇ ဩှ မဲပေသခဲ့သည်။ အသုံသပဌုသူ 12 ဩှ ကဌာသနေခဲ့ပါတယ်။

source: www.habr.com

မဟတ်ချက် Add