簡體   English   中英

Kubernetes和Helm的配置管理

[英]Configuration management with Kubernetes and Helm

我是Kubernetes和Helm的新手。 我來自一個普通的Docker / docker-compose世界。

我有一些運行多個Docker容器的復雜服務,這些容器需要大量的配置參數和邏輯。 docker級服務在啟動時需要很多不同的配置文件,鍵和命令行參數。 我還需要一些運行時只能在容器內部執行的配置邏輯(必須生成一些配置元素)。

我最后要做的是編寫一個shell腳本(用作CMD ),該腳本期望環境變量,定義默認值,將這些環境變量轉換為命令參數和配置文件。


在不考慮Kubernetes和Helm的情況下,這是我如何構建它的無效示例。

Docker文件

...
CMD [ "./bootstrap.sh" ]

bootstrap.sh(打包在圖片中)

# Define default values, if no environment variables provided on
# on "docker run"
export CONFIG_VALUE_A=${CONFIG_VALUE_A:="a"} 
export CONFIG_VALUE_B=${CONFIG_VALUE_B:="b"}
export CONFIG_VALUE_C=${CONFIG_VALUE_C:="c"}

# write CONFIG_VALUE_A to file
echo ${CONFIG_VALUE_A} > ./some-config-file-a.cfg

ARGS="--config-file-a ./some-config-file-a.cfg --config-value-b ${CONFIG_VALUE_B} --config-value-c ${CONFIG_VALUE_C}"
exec ./my-app ${ARGS}

這樣做的好處是,使用環境變量時,我具有標准的配置界面,不需要處理配置文件的卷。


現在,我進入Helm的Kubernetes。 Helm使用values.yaml具有自己的參數概念。 要將其與我上面已經擁有的內容結合起來,我只需將values.yaml值與這些環境變量進行映射values.yaml

deployment.yaml

...
 spec:
  ...
  template:
    ...
    spec:
      containers:
      - name: my-app
        ...
        env:
        - name: "CONFIG_VALUE_A"
          value: {{ .Values.config.value_a }}
        - name: "CONFIG_VALUE_B"
          value: {{ .Values.config.value_b }}
        - name: "CONFIG_VALUE_C"
          value: {{ .Values.config.value_c }}

values.yaml

config:
  value_a: a
  value_b: b
  value_c: c

但是,在三個配置層中我來回映射值(helm模板=>容器環境變量=>配置文件/ CLI參數)違反了DRY原則,並增加了很多錯別字/錯誤的可能性,以后很難找到。


理想情況下,

  • 我只需在deployment.yaml定義我的配置結構,然后在Helm的default.yaml定義默認值一次
  • 我會將這些值直接傳遞到容器,並讓某種配置腳本構建命令行參數和配置文件,而無需使用環境變量作為中間層
  • 使用某種類型安全的配置格式
  • 保持總行數盡可能低
  • 保持配置文件可讀,不要混淆不同的語言(即,在YAML文件中定義的JSON)

如何使用Kubernetes,Helm和Docker解決復雜的配置管理?

在Kubernetes世界中,配置通常由ConfigMap管理,后者是配置的主要存儲。

在您的情況下,我認為您可以這樣做(至少如果我願意,我會那樣做):

  1. 使用種類ConfigMap在Helm中創建另一個模板,然后在其中為應用程序創建.cfg文件的結構。 Helm使用的是GoTemplate格式,因此可以輕松地在其中創建任何結構,包括迭代等。
  2. 將所有默認值添加到values.yaml文件。
  3. 編輯deployment.yaml .cfg文件的安裝添加到容器中的路徑,然后將應用程序指向它。
  4. 使用一個帶有值(或多個)的附加文件,並在其中寫入默認值的替代值。

就是這樣了。 我們有:

  • 具有應用程序格式的靜態配置的ConfigMap,我們可以隨時對其進行檢查。
  • 我們只能在一個地方進行編輯-在我們的默認位置並覆蓋yamls。
  • 可讀key: value YAML格式的key: value
  • 配置文件生成和從容器中整理出來的所有邏輯,因此我們無需為了更改選項順序而構建新版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM