Какой шаблон Kubernetes подходит для однорангового сценария, где одноранговые узлы имеют немного другую конфигурацию? - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь запустить частную звездную инфраструктуру блокчейнов в kubernetes (не для присоединения к существующей общедоступной или тестовой звездной сети), но мой вопрос можно обобщить в сценарии запуска любых одноранговых сервисов в kubernetes.Поэтому я постараюсь объяснить мою проблему в обобщенном виде (надеясь, что она может дать ответы, применимые к любой подобной топологии, работающей в kubernetes).

Вот сценарий:

Я хочу запустить 3 пира (в терминах кубе: стручки), которые могут общаться друг с другом децентрализованным способом, но проблема заключается в том, что каждый из этих пиров имеет немного отличную конфигурацию.В общем, конфигурация выглядит следующим образом (это пример для pod0):

NETWORK_PASSPHRASE="my private network"

NODE_SEED=<pod0_private_key>

KNOWN_PEERS=[
    "stellar-0",
    "stellar-1",
    "stellar-2"]

[QUORUM_SET]
VALIDATORS=[ <pod1_pub_key>, <pod2_pub_key> ]

Проблема заключается в том, что каждый модуль имеет разные значения:

  • NODE_SEED
  • Список VALIDATORS

Моей первой идеей (до реализации этой проблемы) было:

  • Создать карту конфигурации для этой конфигурации
  • Создать набор состояний(3 реплики) с безголовым обслуживанием для обеспечения стабильной доступности между модулями (звездный-0, звездный-1, звездный-2 ... и т. Д.)

Другая идея (после реализации этой проблемы) будетto:

  • Создание отдельных карт конфигурации для каждого узла
  • Создание набора состояний (1 реплика) с помощью службы

Мне интересно, есть ли что-нибудь лучшерешение / шаблон, который можно использовать для этой цели, вместо того, чтобы запускать совершенно одинаковые службы с немного отличающейся конфигурацией в виде отдельных объектов (statefulset, развертывание ...) со своей отдельной службой, через которую эти одноранговые узлы будут доступныдоступен (но этот вид поражает цель использования ресурсов высокого уровня kubernetes, которые позволяют репликацию)?

Спасибо

1 Ответ

0 голосов
/ 24 сентября 2018

Таким образом, вы можете иметь один ConfigMap с несколькими ключами, каждый из которых предназначен для одной из ваших реплик.Вы также можете развернуть свои модули, используя StatefulSet с initContainer для настройки конфигураций.Это только пример (вам нужно настроить его под свои нужды):

ConfigMap:

apiVersion: v1
kind: ConfigMap
metadata:
  name: stellar
  labels:
    app: stellar
data:
  stellar0.cnf: |
    NETWORK_PASSPHRASE="my private network"    
    NODE_SEED=<stellar0_private_key>    
    KNOWN_PEERS=[
        "stellar-0",
        "stellar-1",
        "stellar-2"]    
    [QUORUM_SET]
    VALIDATORS=[ <stellar1_pub_key>, <stellar2_pub_key> ]

  stellar1.cnf: |

    NETWORK_PASSPHRASE="my private network"
    NODE_SEED=<stellar1_private_key>
    KNOWN_PEERS=[
        "stellar-0",
        "stellar-1",
        "stellar-2"]

    [QUORUM_SET]
    VALIDATORS=[ <stellar0_pub_key>, <stellar2_pub_key> ]

  stellar2.cnf: |

    NETWORK_PASSPHRASE="my private network"
    NODE_SEED=<stellar2_private_key>
    KNOWN_PEERS=[
        "stellar-0",
        "stellar-1",
        "stellar-2"]

    [QUORUM_SET]
    VALIDATORS=[ <stellar0_pub_key>, <stellar1_pub_key> ]

StatefulSet:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: stellarblockchain
spec:
  selector:
    matchLabels:
      app: stellar
  serviceName: stellar
  replicas: 3
  template:
    metadata:
      labels:
        app: stellar
    spec:
      initContainers:
      - name: init-stellar
        image: stellar-image:version
        command:
        - bash
        - "-c"
        - |
          set -ex
          # Generate config from pod ordinal index.
          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
          ordinal=${BASH_REMATCH[1]}
          # Copy appropriate conf.d files from config-map to emptyDir.
          if [[ $ordinal -eq 0 ]]; then
            cp /mnt/config-map/stellar0.cnf /mnt/conf.d/
          elif [[ $ordinal -eq 1 ]]; then
            cp /mnt/config-map/stellar1.cnf /mnt/conf.d/
          else
            cp /mnt/config-map/stellar2.cnf /mnt/conf.d/
          fi
        volumeMounts:
        - name: conf
          mountPath: /mnt/conf.d
        - name: config-map
          mountPath: /mnt/config-map

      containers:
      - name: stellar
        image: stellar-image:version
        ports:
        - name: stellar
          containerPort: <whatever port you need here>
        volumeMounts:
        - name: conf
          mountPath: /etc/stellar/conf.d <== wherever your config for stellar needs to be

     volumes:
     - name: conf
       emptyDir: {}
     - name: config-map
       configMap:
         name: stellar

Служба (если вынадо выставить это)

apiVersion: v1
kind: Service
metadata:
  name: stellar
  labels:
    app: stellar
spec:
  ports:
  - name: stellar
    port: <stellar-port>
  clusterIP: None
  selector:
    app: stellar

Надеюсь, это поможет!

...