በቅርቡ ጽፌ ነበር።
የጥያቄው ዳራ ይህ ነው-በአንድ ወቅት አንድ ፕሮጀክት ነበር ፣ መጀመሪያ ላይ መገልገያዎች እና ስክሪፕቶች ያሉት ትንሽ ሞኖሊት ነበር ፣ ግን ከጊዜ በኋላ እያደገ ፣ ወደ አገልግሎቶች ተከፋፈለ ፣ በምላሹም ወደ ማይክሮ ሰርቪስ መከፋፈል ጀመረ ፣ እና ከዚያም ወደላይ. በመጀመሪያ ፣ ይህ ሁሉ የተደረገው በባዶ ቪፒኤስ ላይ ነው ፣ ኮድን የማዘጋጀት እና የማሰማራት ሂደቶች Ansible ን በመጠቀም አውቶማቲክ የተደረጉ ናቸው ፣ እና እያንዳንዱ አገልግሎት በ YAML ውቅር አስፈላጊ በሆኑ መቼቶች እና ቁልፎች ተሰብስቧል ፣ እና ተመሳሳይ የማዋቀሪያ ፋይል ጥቅም ላይ ውሏል። የአካባቢ ማስጀመሪያዎች፣ ይህም በጣም ምቹ ነበር፣ ምክንያቱም .k ይህ ውቅረት በፕሮጀክቱ ውስጥ ከየትኛውም ቦታ ሊደረስበት ወደሚችል አለም አቀፍ ነገር ተጭኗል።
ሆኖም ግን, በማይክሮ ሰርቪስ ቁጥር እድገት, ግንኙነቶቻቸው እና
በዚህ ረገድ፣ የማዋቀሪያ ዕቃን የሚሠራበት ዘዴ በሁለቱም በእኛ ክላሲክ ማዋቀር ፋይላችን እና ከኩበር ሚስጥሮች ጋር መሥራት እንዲችል ተስተካክሏል። በሦስተኛው ፓይዘን ቋንቋ በሚከተለው መልኩ ይበልጥ ጥብቅ የሆነ የማዋቀር መዋቅርም ተገልጿል፡
ዲክት[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