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
參數 | 說明 |
| 匹配Kubernetes Node Labels中的 |
| Kubernetes定義的Labels selector operator,主要包含如下四種操作符:
|
| 匹配Kubernetes Node Labels Key對應的 |
根據需要選擇定義資源拓撲的方式,即LVM或Quotapath,進而初始化定義節點上的本機儲存資源。
使用LVM定義資源拓撲
通過LVM定義資源拓撲,支援以下三種方式:
type: device
:通過Node Resource Manager組件所在宿主機上的塊裝置devices
進行LVM的聲明,聲明的塊裝置會組成一個volumegroup
,volumegroup
的名稱由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
相關參數說明如下表所示:
參數 | 說明 |
| 在掛載塊裝置時使用的參數。 |
| 格式化塊裝置使用的檔案系統,預設使用 |
| 掛載使用的塊裝置,可聲明多個塊裝置。在多個塊裝置的情況下,將依次嘗試掛載,直到掛載成功。 |
步驟二:部署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組件不會刪除任何資源。