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
パラメーター | 説明 |
| ノードベースのノードラベルを選択するために使用される |
| ラベルセレクタで使用される演算子。 有効な値:
|
| ノードラベルに基づいてノードを選択するために使用される |
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
下表に、各パラメーターを説明します。
パラメーター | 説明 |
| ブロックストレージデバイスを取り付けるためのオプション。 |
| ブロックストレージデバイスのフォーマットに使用されるファイルシステムの種類。 デフォルト値: |
| マウントするブロックストレージデバイス。 複数のブロックストレージデバイスを指定した場合、デバイスは順番にマウントされます。 |
ステップ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はクラスターからリソースを削除しません。