介紹:
CPFS(Cloud Paralleled File System)是一種並行文件系統。CPFS 的數據存儲在集羣中的多個數據節點,並可由多個客戶端同時訪問,從而能夠爲大型高性能計算機集羣提供高IOPS、高吞吐、低時延的數據存儲服務。
CPFS詳細產品介紹參考:
https://help.aliyun.com/product/111536.html
CPFS是共享存儲服務類型,適合於容器服務場景對資源共享、高性能的要求,在大數據、AI、基因計算等高性能場景中使用容器服務 + CPFS是一個推薦的解決方案。
本文介紹如何在容器服務中安裝Flexvolume插件,並通過CPFS數據卷的方式爲應用(Pod)提供CPFS服務。
CSI中如何使用CPFS服務請參考:https://github.com/kubernetes-sigs/alibaba-cloud-csi-driver/blob/master/docs/cpfs.md
插件部署:
1. 限制:
CPFS數據卷掛載需要客戶端安裝cpfs-client驅動,驅動與操作系統內核是強依賴。目前支持Centos操作系統的以下內核版本:
3.10.0-957.5.1
3.10.0-957.21.3
通過在節點上執行: uname -a 查看內核版本。
目前Flexvolume只支持安裝CPFS Client驅動,不支持cpfs-client驅動升級;
升級Flexvolume版本,只會升級Flexvolume驅動,而不會升級cpfs-client版本;
在已經部署了cpfs-client、lustre驅動的節點上安裝cpfs flexvolume不會再安裝新版本的CPFS-Client;
Client升級需要手動進行,參考cpfs使用文檔;
2. 部署模板:
在集羣中執行kubectl命令部署下面模板:
# kubectl create -f flexvolume-cpfs.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: flexvolume-cpfs
namespace: kube-system
labels:
k8s-volume: flexvolume-cpfs
spec:
selector:
matchLabels:
name: acs-flexvolume-cpfs
template:
metadata:
labels:
name: acs-flexvolume-cpfs
spec:
hostPID: true
hostNetwork: true
tolerations:
- operator: "Exists"
priorityClassName: system-node-critical
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
containers:
- name: acs-flexvolume
image: registry.cn-hangzhou.aliyuncs.com/acs/flexvolume:v1.14.8.40-9f2072a-aliyun
imagePullPolicy: Always
securityContext:
privileged: true
env:
- name: ACS_CPFS
value: "true"
- name: FIX_ISSUES
value: "false"
livenessProbe:
exec:
command:
- sh
- -c
- ps -ef |grep /acs/flexvolume | grep monitoring | grep -v grep
failureThreshold: 8
initialDelaySeconds: 15
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 15
volumeMounts:
- name: usrdir
mountPath: /host/usr/
- name: etcdir
mountPath: /host/etc/
- name: logdir
mountPath: /var/log/alicloud/
- mountPath: /var/lib/kubelet
mountPropagation: Bidirectional
name: kubeletdir
volumes:
- name: usrdir
hostPath:
path: /usr/
- name: etcdir
hostPath:
path: /etc/
- name: logdir
hostPath:
path: /var/log/alicloud/
- hostPath:
path: /var/lib/kubelet
type: Directory
name: kubeletdir
updateStrategy:
type: RollingUpdate
3. 檢查部署情況:
在集羣中查看存儲插件的部署情況,示例如下:
# kubectl get pod -nkube-system | grep flex
flexvolume-97psk 1/1 Running 0 27m
flexvolume-cpfs-dgxfq 1/1 Running 0 98s
flexvolume-cpfs-qpbcb 1/1 Running 0 98s
flexvolume-cpfs-vlrf9 1/1 Running 0 98s
flexvolume-cpfs-wklls 1/1 Running 0 98s
flexvolume-cpfs-xtl9b 1/1 Running 0 98s
flexvolume-j8zjr 1/1 Running 0 27m
flexvolume-pcg4l 1/1 Running 0 27m
flexvolume-tjxxn 1/1 Running 0 27m
flexvolume-x7ljw 1/1 Running 0 27m
以flexvolume-cpfs 開頭的pod表示部署的cpfs存儲卷插件;
不含cpfs字樣的flexvolume pod表示:集羣默認部署的nas、雲盤、oss存儲卷插件,兩個插件可以同時部署;
在集羣的節點上查看cpfs-client是否安裝完成:
# rpm -qa | grep cpfs
kmod-cpfs-client-2.10.8-202.el7.x86_64
cpfs-client-2.10.8-202.el7.x86_64
查看 mount.lustre 是否已經安裝:
# which mount.lustre
/usr/sbin/mount.lustre
使用CPFS數據卷:
在ACK中使用CPFS數據卷,需要您先到CPFS控制檯創建一個CPFS卷和掛載點,參考:https://help.aliyun.com/document_detail/111860.html
創建CPFS掛載點時,選擇的vpc網絡需要和ACK集羣在同一個vpc內。
下面示例假設獲取掛載點爲:
掛載點:cpfs-*-alup.cn-shenzhen.cpfs.nas.aliyuncs.com@tcp:cpfs--ws5v.cn-shenzhen.cpfs.nas.aliyuncs.com@tcp
文件系統ID爲:0237ef41
1. PV模板:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-cpfs
labels:
alicloud-pvname: pv-cpfs
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
flexVolume:
driver: "alicloud/cpfs"
options:
server: "cpfs-****-alup.cn-shenzhen.cpfs.nas.aliyuncs.com@tcp:cpfs-***-ws5v.cn-shenzhen.cpfs.nas.aliyuncs.com@tcp"
fileSystem: "0237ef41"
subPath: "/k8s"
options: "ro"
其中:
server:配置爲CPFS的掛載點;
fileSystem:配置爲CPFS文件系統ID;
subPath:配置爲期望掛載的CPFS子目錄,相對於文件系統根目錄;
options:可選,掛載配置選項;
2. PVC、應用模板:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-cpfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
selector:
matchLabels:
alicloud-pvname: pv-cpfs
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nas-cpfs
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: pvc-cpfs
mountPath: "/data"
volumes:
- name: pvc-cpfs
persistentVolumeClaim:
claimName: pvc-cpfs
3. 創建應用:
創建上面模板後檢查pod掛載情況:
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nas-cpfs-79964997f5-kzrtp 1/1 Running 0 45s
進入Pod查看掛載目錄;
# kubectl exec -ti nas-cpfs-79964997f5-kzrtp sh
# mount | grep k8s
192.168.1.12@tcp:192.168.1.10@tcp:/0237ef41/k8s on /data type lustre (ro,lazystatfs)
進入pod所在節點,查看掛載目錄;
# mount | grep cpfs
192.168.1.12@tcp:192.168.1.10@tcp:/0237ef41/k8s on /var/lib/kubelet/pods/c4684de2-26ce-11ea-abbd-00163e12e203/volumes/alicloud~cpfs/pv-cpfs type lustre (ro,lazystatfs)