Kubernetes 中的應用引數配置案例詳析

Zilliz 發表於 2021-10-15
Kubernetes
✏️ 作者簡介:
宗玉芬,Zilliz 測試開發工程師,華中科技大學計算機技術工程碩士。目前專注於 Milvus 資料庫的質量保障工作,包括但不限於介面測試、SDK 測試、Benchmark 測試等。一個喜歡定位問題、熱愛探究混沌工程理論與故障演練實踐的測試開發小朋友。

如何修改 Milvus Advanced Configuration

背景

在使用 Milvus 時,我們可能希望修改預設引數,以滿足不同場景的需求。前不久,已有 Milvus 使用者分享瞭如何在使用 docker-compose 部署時修改配置檔案(點選閱讀:技術分享|如何對 Milvus 2.0 進行引數配置),本文將簡單介紹如何在使用 Kubernetes 部署 Milvus 時修改配置引數。

不同的引數配置可以選擇不同的修改方案。Milvus 所有的配置檔案都位於 /milvus/configs/ 路徑下。當使用 Kubernetes 安裝 Milvus 應用時我們會新增 Milvus Chart 倉庫,新增後通過命令 helm show values milvus/milvus 檢視 Chart 支援配置的引數項。如果這些引數項中包含我們想要修改的引數,則可以通過 --values--set 兩種方式傳遞配置資料,具體使用細節請參考 Milvus Helm ChartHelm;如果不包含我們想修改的引數,則可以考慮下文介紹的小方法:

Milvus 在 Kubernetes 中的配置檔案管理是通過 ConfigMap 資源物件實現的。如果我們需要修改 Milvus Chart 可配置選項以外的引數,則需要先更新對應 Chart Release 的 ConfigMap 物件,然後修改相應 Pod 的 Deployment 資原始檔。接下來,以修改 /milvus/configs/advanced/root_coord.yaml 檔案中的 rootcoord.dmlChannelNum 引數為例進行說明,按照先修改 ConfigMap 物件屬性再修改 Deployment 物件屬性兩個步驟進行,將其值從 256 修改為 128

需要注意的是,該方法只針對已經部署的 Milvus 應用進行配置修改。如果需要在部署時或部署前修改 /milvus/configs/advanced/*.yaml 中的配置,我們需要對 Milvus Helm Chart 進行再開發。

修改 ConfigMap 清單檔案

Kubernetes 中執行的 Release 對應著名為 milvus-chaos 的 ConfigMap 物件,其 data 屬性只包含了 milvus.yaml 檔案的配置。同理,我們需要將 rootcoord.dmlChannelNum 引數所在的 root_coord.yaml 配置到 data 屬性中,同時將 rootcoord.dmlChannelNum 修改為 128 即可。

kind: ConfigMap
apiVersion: v1
metadata:
  name: milvus-chaos
  ...
data:
  milvus.yaml: >
    ......
  root_coord.yaml: |
    rootcoord:
      dmlChannelNum: 128
      maxPartitionNum: 4096
      minSegmentSizeToEnableIndex: 1024
      timeout: 3600 # time out, 5 seconds
      timeTickInterval: 200 # ms

修改 Deployment 清單檔案

ConfigMap 物件中儲存的資料可以被 configMap 型別的卷引用,然後向 Pod 注入配置資料,從而被 Pod 中執行的容器化應用使用。如果我們想讓 Pod 訪問新的配置檔案,則需修改那些會載入 root_coord.yaml 配置的 Pod 模板,具體是在 Deployment 資源清單檔案中的 spec.template.spec.containers.volumeMounts 下新增一個掛載宣告。以 rootcoord pod 的 Deployment 資源清單為例,從 spec.template.spec.volumes 關鍵字可以看到 Pod 頂層宣告瞭一個名為 milvus-config,型別是 configMapVolume,並且 Pod 中的 rootcoord 容器宣告將卷 milvus-chaos 的 milvus.yaml 檔案掛載到路徑 /milvus/configs/milvus.yaml 下。同理,我們只需要將 root_coord.yaml 檔案掛載到 /milvus/configs/advanced/root_coord.yaml 路徑下,以便容器能訪問即可。

spec:
  replicas: 1
  selector:
    ......
  template:
    metadata:
      ...
    spec:
      volumes:
        - name: milvus-config
          configMap:
            name: milvus-chaos
            defaultMode: 420
      containers:
        - name: rootcoord
          image: 'milvusdb/milvus-dev:master-20210906-86afde4'
          args:
            ...
          ports:
            ...
          resources: {}
          volumeMounts:
            - name: milvus-config
              readOnly: true
              mountPath: /milvus/configs/milvus.yaml
              subPath: milvus.yaml
            - name: milvus-config
              readOnly: true
              mountPath: /milvus/configs/advanced/root_coord.yaml
              subPath: root_coord.yaml
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler

驗證結果

完成上述兩步修改後,Pod 重新掛載了 ConfigMap 卷,且 ConfigMap 屬性的修改被檢測到後,Pod 會滾動更新。當新的 Pod 重新進入 Running 狀態後,我們可以進入 Pod 驗證是否修改成功,具體命令如下所示。可以看到 /milvus/configs/advanced/root_coord.yaml 檔案中的rootcoord.dmlChannelNum 的值已經更新為 128 了。

$ kctl exec -ti milvus-chaos-rootcoord-6f56794f5b-xp2zs -- sh

# cd configs/advanced
# pwd
/milvus/configs/advanced
# ls
channel.yaml  common.yaml  data_coord.yaml  data_node.yaml  etcd.yaml  proxy.yaml  query_node.yaml  root_coord.yaml

# cat root_coord.yaml
rootcoord:
  dmlChannelNum: 128
  maxPartitionNum: 4096
  minSegmentSizeToEnableIndex: 1024
  timeout: 3600 # time out, 5 seconds
  timeTickInterval: 200 # ms
# exit

至此,該修改 Milvus 配置的方法已經介紹完畢。在 Milvus 之後的版本中,我們會將使用者所關心的配置引數統一放置到一個檔案中,且支援通過 Helm Chart 配置更新。在新版本誕生前,希望這篇文件介紹的臨時修改方案能對大家有所幫助!