Kubernetes クラスター内のローカルストレージリソースは、手動で初期化することも、Ansible を使用してバッチで初期化することもできます。しかし、特に大規模なクラスターでは、ローカルストレージリソースの初期化プロセスは複雑です。node-resource-manager コンポーネントは、ConfigMap に基づいてノード上のローカルストレージリソースを自動的に初期化および更新できます。このトピックでは、node-resource-manager を使用して Kubernetes クラスター内のノード上のローカルストレージリソースを自動的に初期化する方法について説明します。
背景情報
Kubernetes クラスターでローカルストレージリソースを初期化するプロセスには課題があります。ローカルストレージリソースは手動で初期化することも、Ansible を使用してバッチで初期化することもできますが、以下の問題が存在します:
Kubernetes のノード情報に基づいて Ansible を使用してカスタムデプロイメントを実行するのは複雑です。まず、ノードに kubelet をインストールし、
シェルコマンドを実行する必要があります。その後、コマンド出力を手動で解析する必要があります。多数のノードを含むクラスターでは、ローカルストレージリソースを手動で初期化することは困難です。
初期化されたストレージリソースは、長期的なビジネスのために自動的に維持することができません。リソースを更新するには、ノードに手動でログインして更新する必要があります。さらに、初期化されたストレージリソースの使用状況情報は Kubernetes コントロールプレーンにレポートされないため、Pod のスケジューリングに影響します。
node-resource-manager コンポーネントは、ローカルストレージリソースを自動的に初期化し、その使用状況情報を Kubernetes コントロールプレーンにレポートできます。これにより、スケジューラはレポートされた使用状況情報に基づいてローカルストレージリソースを Pod に割り当てることができます。詳細については、「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パラメーターで指定されたブロックストレージデバイスに基づいてプロビジョニングされたボリュームグループを要求します。volumegroupはnameパラメーターに基づいて命名されます。論理ボリューム (LV) をリクエストするアプリケーションが起動されると、LV はvolumegroupに基づいて割り当てられます。type: alibabacloud-local-disk:node-resource-manager は、ホストのすべてのローカルディスクに基づいてvolumegroupを作成します。volumegroupはnameパラメーターに基づいて命名されます。このメソッドを使用するには、ホストをローカルディスクが搭載された Elastic Compute Service (ECS) インスタンスにデプロイする必要があります。重要ローカル SSD を搭載した i2 インスタンスファミリーの ECS インスタンスに手動でアタッチされたブロックストレージデバイスはクラウドディスクであり、ローカルディスクとは見なされません。
type: pmem:node-resource-manager は、ホスト上の永続メモリ (PMEM) リソースに基づいてvolumegroupを作成します。volumegroupはnameパラメーターに基づいて命名されます。regionsパラメーターを設定して、PMEM リソースが属するリージョンを指定できます。
以下の 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: volumegroup3
key: kubernetes.io/hostname
operator: Exists
value: cn-beijing.192.168.XX.XX
topology:
type: pmem
regions:
- region0QuotaPath を使用したリソーストポロジーの定義
以下のいずれかのメソッドを使用して、リソーストポロジーを定義できます:
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 をデプロイします:
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-toponode-resource-manager がデプロイされると、作成した ConfigMap の設定に基づいてノード上のローカルストレージリソースが自動的に初期化されます。ConfigMap を更新すると、node-resource-manager は更新完了後 1 分以内に初期化されたローカルストレージリソースを更新します。
データセキュリティを確保するため、node-resource-manager はクラスターからリソースを削除しません。