ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈ Π²Π½Π΅ Kubernetes

НСдавно я написал ΠΎΡ‚Π²Π΅Ρ‚ ΠΎ ΠΆΠΈΠ·Π½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² Π”ΠΎΠΊΠ΅Ρ€Π°Ρ… ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ ΠΊΠΎΠ΄Π° Π²Π½Π΅ Π½Π΅Π³ΠΎ, Π³Π΄Π΅ мСльком упомянул ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свою систСму конфигурирования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ сСрвис ΠΈ Π² ΠšΡƒΠ±Π΅Ρ€Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π», подтягивал сСкрСты, ΠΈ локально ΡƒΠ΄ΠΎΠ±Π½ΠΎ запускался, Π² Ρ‚ΠΎΠΌ числС Π²ΠΎΠΎΠ±Ρ‰Π΅ Π²Π½Π΅ Π”ΠΎΠΊΠ΅Ρ€Π°. НичСго слоТного, Π½ΠΎ описанный "Ρ€Π΅Ρ†Π΅ΠΏΡ‚" ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ пригодится πŸ™‚ Код Π½Π° ΠŸΠΈΡ‚ΠΎΠ½Π΅, Π½ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΊ языку Π½Π΅ привязана.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈ Π²Π½Π΅ Kubernetes

ΠŸΡ€Π΅Π΄Ρ‹ΡΡ‚ΠΎΡ€ΠΈΡ вопроса Ρ‚Π°ΠΊΠΎΠ²Π°: ΠΆΠΈΠ»-Π±Ρ‹Π» ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, сначала ΠΎΠ½ Π±Ρ‹Π» малСньким ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚ΠΎΠΌ с ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°ΠΌΠΈ ΠΈ скриптами, Π½ΠΎ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ рос, дСлился Π½Π° сСрвисы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ стали Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½Π° микросСрвисы, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π΅Ρ‰Ρ‘ ΠΈ ΡΠΊΠ΅ΠΉΠ»ΠΈΡ‚ΡŒΡΡ. ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ это всё Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ»ΠΎΡΡŒ Π½Π° Π³ΠΎΠ»Ρ‹Ρ… VPS, процСссы настройки ΠΈ разворачивания ΠΊΠΎΠ΄Π° Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±Ρ‹Π»ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ansible, ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ сСрвису составлялся YAML-ΠΊΠΎΠ½Ρ„ΠΈΠ³ с Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ настройками ΠΈ ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ, ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ» использовался для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… запусков, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Ρ‚.ΠΊ этот ΠΊΠΎΠ½Ρ„ΠΈΠ³ грузится Π² Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, доступный ΠΈΠ· любого мСста Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅.

Однако рост числа микросСрвисов, ΠΈΡ… связСй, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅, ΠΏΡ€Π΅Π΄Π²Π΅Ρ‰Π°Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄ Π² ΠšΡƒΠ±Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎ сих ΠΏΠΎΡ€ Π΅Ρ‰Ρ‘ Π² процСссС. ВмСстС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ упомянутых Π·Π°Π΄Π°Ρ‡, Kubernetes ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ свои ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ инфраструктурой, Π² Ρ‚ΠΎΠΌ числС Ρ‚.Π½ Π‘Π΅ΠΊΡ€Π΅Ρ‚Ρ‹ ΠΈ способы Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ стандартный ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ, поэтому Π² Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎΠΌ смыслС Π³Ρ€Π΅Ρ… ΠΈΠΌ Π½Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ! Но ΠΏΡ€ΠΈ этом Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ свой Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΠΎΠΌ: Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ€Π°Π·Π½Ρ‹Ρ… микросСрвисах ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° локальной машинС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄ΠΈΠ½ простой ΠΊΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ».

Π’ связи с этим, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ построСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±Ρ‹Π» Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ с нашим классичСским ΠΊΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ»ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΈ с сСкрСтами ΠΈΠ· ΠšΡƒΠ±Π΅Ρ€Π°. Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»Π° Π·Π°Π΄Π°Π½Π° Π±ΠΎΠ»Π΅Π΅ Тёсткая структура ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°, говоря языком Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠŸΠΈΡ‚ΠΎΠ½Π°, такая:

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

Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ³Ρ„ΠΈΠ³ это ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ сСкциями, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся словарём со значСниями ΠΈΠ· простых Ρ‚ΠΈΠΏΠΎΠ². А сСкции ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ ΠΈ доступы Π΄ΠΎ рСсурсов ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ куска нашСго ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°:

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

А для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… запусков ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³, располоТСнный Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния. Код, отвСтствСнный Π·Π° эти удобства, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΡ†Π΅Π·Ρ€Π΅Ρ‚ΡŒ Π² спойлСрС.

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 (Π² нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΎΠ½ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ) ΠΈ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° Π“ΠΈΡ‚Π₯Π°Π±Π΅ / PyPI? Π›ΠΈΡ‡Π½ΠΎ я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ слишком ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, ΠΈ достаточно нСбольшого подглядывания Π½Π° Ρ‡ΡƒΠΆΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π²Ρ€ΠΎΠ΄Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠΉ здСсь, Π΄Π° обсуТдСния нюансов, совСтов ΠΈ best practices, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ я надСюсь ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² коммСнтариях πŸ˜‰

Волько зарСгистрированныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² опросС. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅, поТалуйста.

Π‘Ρ‚ΠΎΠΈΡ‚ Π»ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚/Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ?

  • 0,0%Π”Π°, я Π±Ρ‹ использовал / ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈΠ»0

  • 33,3%Π”Π°, Π·Π²ΡƒΡ‡ΠΈΡ‚ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ4

  • 41,7%НСт, ΠΊΠΎΠΌΡƒ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°ΡŽΡ‚ сами Π² своём Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΈ ΠΏΠΎΠ΄ свои Π½ΡƒΠΆΠ΄Ρ‹5

  • 25,0%Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΡƒΡΡŒ ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°3

ΠŸΡ€ΠΎΠ³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π»ΠΈ 12 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’ΠΎΠ·Π΄Π΅Ρ€ΠΆΠ°Π»ΠΈΡΡŒ 3 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ