全部產品
Search
文件中心

Container Service for Kubernetes:自動初始化本機儲存資源

更新時間:Feb 28, 2024

Kubernetes叢集中的本機儲存資源一般通過手動或者使用Ansible進行批量初始化,但是這兩種方式操作複雜且不適用於大規模叢集,而Node Resource Manager組件根據ConfigMap的定義可自動初始化並更新當前節點上的本機儲存資源。本文介紹如何通過Node Resource Manager組件實現本機儲存資源的自動初始化。

背景資訊

Kubernetes叢集中的本機儲存資源初始化一直是個令人困擾的問題,迄今為止一般手動或者使用Ansible進行批量初始化,但是這兩種方式存在以下問題:

  • Ansible無法便捷的使用Kubernetes特有的節點資訊進行定製化部署,需要提前安裝Kubelet,執行shell command命令以及需要自助解析返回結果。

  • 在大規模叢集中,手動登入節點部署本機儲存資源是很難實現的。

  • 無法持續維護初始化的資源,若某個節點需要更新資源,則需要手動登入節點更新資源,且相關儲存資源的使用資訊無法上報,在Kubernetes調度Pod時無法被利用起來。

基於以上問題可通過Node Resource Manager組件實現本機儲存資源的自動初始化。Node Resource Manager組件是一個簡單易用的Kubernetes本機存放區管理組件,可上報本機儲存資源的使用資訊,配合Scheduler自動化調度使用本機儲存資源的Pod。關於Node Resource Manager組件的更多資訊,請參見node-resource-manager

步驟一:通過ConfigMap定義資源所在節點

通過以下三個參數共同定義資源所在的節點。

key: kubernetes.io/hostname
operator: In
value: xxxxx

參數

說明

key

匹配Kubernetes Node Labels中的key值。

operator

Kubernetes定義的Labels selector operator,主要包含如下四種操作符:

  • In:只有value值與節點上Labels Key對應的value值相同時匹配。

  • NotIn:只有value值與節點上Labels Key對應的value值不相同時匹配。

  • Exists:只要節點的Labels上存在Key就會匹配。

  • DoesNotExist:只要節點的Labels上不存在Key就會匹配。

value

匹配Kubernetes Node Labels Key對應的value值。

根據需要選擇定義資源拓撲的方式,即LVM或Quotapath,進而初始化定義節點上的本機儲存資源。

使用LVM定義資源拓撲

通過LVM定義資源拓撲,支援以下三種方式:

  • type: device:通過Node Resource Manager組件所在宿主機上的塊裝置devices進行LVM的聲明,聲明的塊裝置會組成一個volumegroupvolumegroup的名稱由name指定,供後續應用啟動時分配Logical Volume。

  • type: alibabacloud-local-disk:通過Node Resource Manager組件所在宿主機上所有的本地碟(選擇帶有本地碟的ECS類型)共同建立一個名稱為name值的volumegroup

    重要

    在使用本地SSD型 (i2)執行個體建立的ECS執行個體中,手動掛載的塊裝置為雲端硬碟,非本地碟。

  • type: pmem:通過Node Resource Manager組件所在宿主機上的PMEM資源建立一個名稱為name值的volumegroup,其中regions可以指定當前機器上多個PMEM的region資源。

根據以下YAML樣本,使用LVM定義資源拓撲:

apiVersion: v1
kind: ConfigMap
metadata:
  name: unified-resource-topo
  namespace: kube-system
data:
  volumegroup: |-
    volumegroup:
    - name: volumegroup1
      key: kubernetes.io/hostname
      operator: In
      value: cn-zhangjiakou.192.168.XX.XX
      topology:
        type: device
        devices:
        - /dev/vdb
        - /dev/vdc
    - name: volumegroup2
      key: kubernetes.io/nodetype
      operator: NotIn
      value: localdisk
      topology:
        type: alibabacloud-local-disk
    - name: volumegroup1
      key: kubernetes.io/hostname
      operator: Exists
      value: cn-beijing.192.168.XX.XX
      topology:
        type: pmem
        regions:
        - region0

使用Quotapath定義資源拓撲

通過Quotapath定義資源拓撲,支援以下兩種方式:

  • type: device:通過Node Resource Manager組件所在宿主機的塊裝置初始化Quotapath,初始化路徑是name欄位定義的值。

  • type: pmem:通過Node Resource Manager組件所在宿主機的PMEM裝置初始化Quotapath,初始化路徑是name欄位定義的值。

根據以下YAML樣本,使用Quotapath定義資源拓撲:

apiVersion: v1
kind: ConfigMap
metadata:
  name: unified-resource-topo
  namespace: kube-system
data:
  quotapath: |-
    quotapath:
    - name: /mnt/path1
      key: kubernetes.io/hostname
      operator: In
      value: cn-beijing.192.168.XX.XX
      topology:
        type: device
        options: prjquota
        fstype: ext4
        devices:
        - /dev/vdb
    - name: /mnt/path2
      key: kubernetes.io/hostname
      operator: In
      value: cn-beijing.192.168.XX.XX
      topology:
        type: pmem
        options: prjquota,shared
        fstype: ext4
        regions:
        - region0

相關參數說明如下表所示:

參數

說明

options

在掛載塊裝置時使用的參數。

fstype

格式化塊裝置使用的檔案系統,預設使用ext4

devices

掛載使用的塊裝置,可聲明多個塊裝置。在多個塊裝置的情況下,將依次嘗試掛載,直到掛載成功。

步驟二:部署Node Resource Manager組件

通過在叢集中建立DaemonSet工作負載部署Node Resource Manager組件,YAML樣本如下所示:

cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: node-resource-manager
  namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: node-resource-manager
rules:
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "watch", "list", "delete", "update", "create"]
  - apiGroups: [""]
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: node-resource-manager-binding
subjects:
  - kind: ServiceAccount
    name: node-resource-manager
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: node-resource-manager
  apiGroup: rbac.authorization.k8s.io
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: node-resource-manager
  namespace: kube-system
spec:
  selector:
    matchLabels:
      app: node-resource-manager
  template:
    metadata:
      labels:
        app: node-resource-manager
    spec:
      tolerations:
        - operator: "Exists"
      priorityClassName: system-node-critical
      serviceAccountName: node-resource-manager
      hostNetwork: true
      hostPID: true
      containers:
        - name: node-resource-manager
          securityContext:
            privileged: true
            capabilities:
              add: ["SYS_ADMIN"]
            allowPrivilegeEscalation: true
          image: registry.cn-hangzhou.aliyuncs.com/acs/node-resource-manager:v1.18.8.0-983ce56-aliyun
          imagePullPolicy: "Always"
          args:
            - "--nodeid=$(KUBE_NODE_NAME)"
          env:
            - name: KUBE_NODE_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: spec.nodeName
          volumeMounts:
            - mountPath: /dev
              mountPropagation: "HostToContainer"
              name: host-dev
            - mountPath: /var/log/
              name: host-log
            - name: etc
              mountPath: /host/etc
            - name: config
              mountPath: /etc/unified-config
      volumes:
        - name: host-dev
          hostPath:
            path: /dev
        - name: host-log
          hostPath:
            path: /var/log/
        - name: etc
          hostPath:
            path: /etc
        - name: config
          configMap:
            name: node-resource-topo
EOF

部署完成之後,組件會自動將ConfigMap中的配置應用到節點上。如果更新ConfigMap,組件會在一分鐘內對資源更新。

重要

為了保障資料安全,Node Resource Manager組件不會刪除任何資源。