Кубернетес дотор болон гаднах төслийн тохиргоо

Би саяхан бичсэн Docker дээрх төслийн амьдрал болон түүний гаднах кодыг дибаг хийх талаар хариулна уу, Та өөрийн тохиргооны системийг хийж болно гэж товч дурьдсан бөгөөд ингэснээр үйлчилгээ Kuber-д сайн ажиллаж, нууцыг задалж, Docker-ээс гадуур ч гэсэн дотоодод тохиромжтой ажиллах боломжтой. Ямар ч төвөгтэй зүйл байхгүй, гэхдээ тайлбарласан "жор" нь хэн нэгэнд хэрэгтэй байж магадгүй юм :) Код нь Python дээр байгаа боловч логик нь хэлтэй холбоогүй.

Кубернетес дотор болон гаднах төслийн тохиргоо

Асуултын үндэс нь: Нэгэн цагт нэг төсөл байсан бөгөөд энэ нь эхэндээ хэрэгслүүд, скриптүүдтэй жижиг цул байсан боловч цаг хугацаа өнгөрөх тусам томорч, үйлчилгээнд хуваагдаж, улмаар микро үйлчилгээ болон хуваагдаж эхэлсэн. дараа нь томруулсан. Эхлээд энэ бүгдийг нүцгэн VPS дээр хийж, кодыг тохируулах, байршуулах үйл явцыг Ansible ашиглан автоматжуулсан бөгөөд үйлчилгээ бүрийг шаардлагатай тохиргоо, түлхүүр бүхий YAML тохиргоогоор эмхэтгэж, ижил төстэй тохиргооны файлыг ашигласан. .k энэ тохиргоог төслийн хаанаас ч ашиглах боломжтой глобал объект руу ачаалдаг тул локал эхлүүлсэн нь маш тохиромжтой байсан.

Гэсэн хэдий ч, микро үйлчилгээний тооны өсөлт, тэдгээрийн холболт, болон төвлөрсөн мод бэлтгэл, хяналт тавих хэрэгцээ, одоо ч үргэлжилж байгаа Кубер руу шилжихийг зөгнөсөн. Дээр дурдсан асуудлуудыг шийдвэрлэхэд туслалцаа үзүүлэхийн хамт Кубернетес дэд бүтцийн менежментийн арга барилыг санал болгодог. Нууц гэж нэрлэгддэг и тэдэнтэй ажиллах арга замууд. Механизм нь стандарт бөгөөд найдвартай тул үүнийг ашиглахгүй байх нь нүгэл юм! Гэхдээ үүнтэй зэрэгцэн би тохиргоотой ажиллах одоогийн форматаа хадгалахыг хүсч байна: нэгдүгээрт, үүнийг төслийн янз бүрийн микро үйлчилгээнд жигд ашиглах, хоёрдугаарт, кодыг нэг энгийн програм ашиглан дотоод машин дээр ажиллуулах боломжтой байх. тохиргооны файл.

Үүнтэй холбогдуулан тохиргооны объектыг бий болгох механизмыг манай сонгодог тохиргооны файл болон Kuber-ийн нууцтай ажиллах боломжтой болгож өөрчилсөн. Гурав дахь Python хэлээр илүү хатуу тохиргооны бүтцийг дараах байдлаар тодорхойлсон:

Dict[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 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

Мөн орон нутгийн эхлүүлэхийн тулд төслийн үндсэн директорт эсвэл орчны хувьсагчд заасан замын дагуу байрлах тохиргоог ашигладаг. Эдгээр тав тухыг хариуцдаг кодыг спойлер дээрээс харж болно.

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%Тийм ээ, би /contribution0-г ашиглах болно

  • 33,3%Тийм ээ, энэ нь гайхалтай сонсогдож байна4

  • 41,7%Үгүй ээ, хэн үүнийг өөрийн форматаар, өөрийн хэрэгцээнд нийцүүлэн хийх хэрэгтэй5

  • 25,0%Би хариулахаас татгалзах болно3

12 хэрэглэгч санал өгсөн. 3 хэрэглэгч түдгэлзсэн.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх