すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ローカルストレージリソースの自動初期化

最終更新日:Oct 29, 2024

Kubernetesクラスター内のローカルストレージリソースを手動で初期化するか、Ansibleを使用してローカルストレージリソースをバッチで初期化できます。 ローカルストレージリソースを初期化するプロセスは、特に大きなクラスタでは複雑です。 node-resource-managerコンポーネントは、ConfigMapに基づいて、ノード上のローカルストレージリソースを自動的に初期化および更新できます。 このトピックでは、node-resource-managerを使用して、Kubernetesクラスター内のノードのローカルストレージリソースを自動的に初期化する方法について説明します。

背景情報

Kubernetesクラスターのローカルストレージリソースを初期化するプロセスは複雑です。 ローカルストレージリソースを手動で初期化するか、Ansibleを使用してローカルストレージリソースをバッチで初期化できます。 ただし、次の問題があります。

  • Kubernetesノードメタデータに基づいてAnsibleを使用してローカルストレージリソースを初期化するのは複雑です。 最初にノードにkubeletをインストールし、シェルコマンドを実行する必要があります。 次に、コマンド出力を手動で解析する必要があります。

  • 多数のノードを含むクラスターでは、各ノードにログインしてローカルストレージリソースを初期化することは困難です。

  • 初期化されたストレージリソースは、長期ビジネスのために自動的に維持できません。 これらのリソースを手動で更新する必要があります。 また、初期化されたストレージリソースの使用状況情報はKubernetesコントロールプレーンに報告されません。 その結果、初期化されたストレージリソースを新しく作成されたポッドに割り当てることはできません。

上記の問題を解決するには、node-resource-managerコンポーネントを使用して、Kubernetesクラスター内のローカルストレージリソースを自動的に初期化します。 node-resource-managerは使いやすく、ローカルストレージリソースの使用情報をKubernetesコントロールプレーンに報告できます。 このように、スケジューラは、報告された使用情報に基づいて、ローカルストレージリソースをポッドに割り当てることができる。 node-resource-managerの詳細については、「node-resource-manager」をご参照ください。

手順1: ローカルストレージリソースを初期化するノードを指定するConfigMapを作成する

ConfigMapで次のパラメーターを設定して、ローカルストレージリソースを初期化するノードを指定できます。

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

パラメーター

説明

キー

ノードベースのノードラベルを選択するために使用されるキー

演算子

ラベルセレクタで使用される演算子。 有効な値:

  • []: 指定したキーとと同じキーとのラベルがノードにある場合、ノードが選択されます。

  • NotIn: 指定したキーと同じキーを持つが、が指定したと異なるラベルがノードにある場合、そのノードが選択されます。

  • 存在: 指定したキーと同じキーを持つラベルがノードにある場合、そのノードが選択されます。

  • DoesNotExist: 指定したキーと異なるキーを持つラベルがノードにある場合、そのノードが選択されます。

ノードラベルに基づいてノードを選択するために使用される

Logical Volume Manager (LVM) またはQuotaPathを使用して、リソーストポロジを定義します。

LVMを使用したリソーストポロジの定義

次のいずれかの方法を使用して、リソーストポロジを定義できます。

  • type: device: node-resource-managerは、devicesパラメーターで指定されたブロックストレージデバイスに基づいてプロビジョニングされたボリュームグループ (VG) を要求します。 VGは、nameパラメーターに基づいて名前が付けられます。 論理ボリューム (LV) を要求するアプリケーションが起動されると、VGに基づいてLVを割り当てることができる。

  • type: alibabacloud-local-disk: node-resource-managerは、ホストのすべてのローカルディスクに基づいてVGを作成します。 VGは、nameパラメータに基づいて命名される。 この方法を使用するには、ローカルディスクを備えたElastic Compute Service (ECS) インスタンスにホストをデプロイする必要があります。

    重要

    ローカルSSDを使用してi2インスタンスファミリーのECSインスタンスに手動でアタッチされるブロックストレージデバイスはクラウドディスクであり、ローカルディスクとは見なされません。

  • type: pmem: node-resource-managerは、ホスト上の永続メモリ (PMEM) リソースに基づいてVGを作成します。 VGは、nameパラメータに基づいて命名される。 regionsパラメーターを設定して、PMEMリソースが属するregionsを指定できます。

次のYAMLテンプレートに基づいてリソーストポロジを定義します。

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を使用したリソーストポロジの定義

次のいずれかの方法を使用して、リソーストポロジを定義できます。

  • type: device: node-resource-managerは、ホスト上のブロックストレージデバイスに基づいてQuotaPathボリュームを初期化します。 QuotaPathボリュームは、nameパラメーターで指定されたパスにマウントされます。

  • type: pmem: node-resource-managerは、ホスト上のPMEMリソースに基づいてQuotaPathボリュームを初期化します。 QuotaPathボリュームは、nameパラメーターで指定されたパスにマウントされます。

次のYAMLテンプレートに基づいてリソーストポロジを定義します。

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

下表に、各パラメーターを説明します。

パラメーター

説明

オプション

ブロックストレージデバイスを取り付けるためのオプション。

fstype

ブロックストレージデバイスのフォーマットに使用されるファイルシステムの種類。 デフォルト値: ext4

デバイス

マウントするブロックストレージデバイス。 複数のブロックストレージデバイスを指定した場合、デバイスは順番にマウントされます。

ステップ2: node-resource-managerのデプロイ

次のYAMLテンプレートを使用して、DaemonSetとしてクラスターにnode-resource-managerをデプロイします:

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

node-resource-managerがデプロイされると、node-resource-managerは、作成したConfigMapの設定に基づいて、ノード上のローカルストレージリソースを自動的に初期化します。 ConfigMapを更新すると、node-resource-managerは、更新が完了してから1分以内に初期化されたローカルストレージリソースを更新します。

重要

データのセキュリティを確保するため、node-resource-managerはクラスターからリソースを削除しません。