K8S搭建存储卷
一、StorageClassStorageClass为管理员提供了描述存储 “类” 的方法。不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。K3S本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 “配置文件”。二、StorageClass资源。
K8S搭建存储卷
前言
一、StorageClass
StorageClass为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略,或是由集群管理员制定的任意策略。K3S本身并不清楚各种类代表的什么。这个类的概念在其他存储系统中有时被称为 “配置文件”。
二、StorageClass资源
每个StorageClass 都包含 provisioner、parameters 和reclaimPolicy字段, 这些字段会在StorageClass 需要动态分配PersistentVolume 时会使用到。
StorageClass 对象的命名很重要,用户使用这个命名来请求生成一个特定的类。 当创建 StorageClass 对象时,管理员设置 StorageClass 对象的命名和其他参数,一旦创建了对象就不能再对其更新。
使用NFS实现动态创建PV(PersistentVolume)
K3S搭建
K3S本身支持的动态PV创建不包括NFS,所以需要使用外部存储卷插件分配PV。
卷插件称为 Provisioner(存储分配器),NFS 使用的是 nfs-client,这个外部卷插件会使用已经配置好的 NFS 服务器自动创建 PV。 Provisioner:用于指定 Volume 插件的类型,包括内置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。
详见:存储类
服务端安装NFS
安装NFS
yum install -y nfs-utils rpcbind
创建共享目录
mkdir -p /data/nfs/skywalking
vi /etc/exports
# 输入
/data/nfs *(rw,no_root_squash)
/data/nfs/skywalking *(rw,sync,no_root_squash)
参数 | 说明 |
---|---|
/data/nfs | 需要共享给其他机器的目录 |
* | 其他机器的IP地址,*代表任意机器都可以访问 |
ro | 该主机对该共享目录有只读权限 |
rw | 操作权限,rw代表其他机器对此目录具有可读写权限 |
async | 资料会先暂存于内存中,而非直接写入硬盘 |
sync | Sync 资料同步写入到内存与硬盘中 |
root_squash | 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户 |
no_root_squash | 客户机用root访问该共享文件夹时,不映射root用户 |
all_squash | 客户机上的任何用户访问该共享目录时都映射成匿名用户 |
anonuid | 客户机上的用户映射成指定的本地用户ID的用户 |
anongid | 将客户机上的用户映射成属于指定的本地用户组ID |
insecure | 允许从这台机器过来的非授权访问 |
subtree_check | 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) |
no_subtree_check | 不检查父目录权限 |
no_wdelay | 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置 |
wdelay | 如果多个用户要写入NFS目录,则归组写入 |
no_hide | 共享NFS目录的子目录 |
hide | 在NFS共享目录中不共享其子目录 |
启动NFS
systemctl start rpcbind && systemctl start nfs
systemctl status rpcbind && systemctl status nfs
查看相关端口
rpcinfo -p localhost
查看可挂载列表
showmount -e localhost
设置开启启动
systemctl enable rpcbind
systemctl enable nfs
客户端安装NFS
安装NFS
yum install -y nfs-utils
设置开机启动并启动服务
systemctl enable nfs
systemctl start nfs
systemctl status nfs
挂载共享目录
mkdir -p /data/nfs/skywalking
mount -t nfs 192.168.3.119:/data/nfs /data/nfs
查看服务端可挂载目录并挂在
showmount -e 192.168.3.119
mount -t nfs 192.168.3.119:/data/nfs/skywalking /data/nfs/skywalking
查看挂载情况
df -h
K8S主节点
创建Service Account
用来管理 NFS Provisioner 在 K8S 集群中运行的权限,设置 nfs-client 对 PV,PVC,StorageClass 等的规则
nfs-client-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-clusterrole
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: nfs-client-provisioner-clusterrolebinding
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-clusterrole
apiGroup: rbac.authorization.k8s.io
kubectl apply -f nfs-client-rbac.yaml
创建provisioner
在 NFS 共享目录下创建挂载点(volume),并将 PV 与 NFS 的挂载点建立关联
nfs-client-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner #指定Service Account账户
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-storage #配置provisioner的Name,确保该名称与StorageClass资源中的provisioner名称保持一致
- name: NFS_SERVER
value: 192.168.3.119 #配置绑定的nfs服务器
- name: NFS_PATH
value: /data/nfs/provisioner #配置绑定的nfs服务器目录
volumes: #申明nfs数据卷
- name: nfs-client-root
nfs:
server: 192.168.3.119
path: /data/nfs/provisioner
kubectl apply -f nfs-client-provisioner.yaml
kubectl get pods
创建StorageClass
负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联
nfs-client-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client-storageclass
provisioner: nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:
archiveOnDelete: "false" #false表示在删除PVC时不会对数据进行存档,即删除数据
kubectl apply -f nfs-client-storageclass.yaml
kubectl get storageclasses
创建PVC
skywalking-nfs.yaml
kind: Namespace
apiVersion: v1
metadata:
name: nfs
labels:
name: nfs
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-skywalking-data-agent-pv
namespace: nfs
spec:
storageClassName: nfs-skywalking-data-agent
mountOptions:
- nolock
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /data/nfs/skywalking
server: 192.168.3.119
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-skywalking-data-agent-pvc
namespace: nfs
spec:
storageClassName: nfs-skywalking-data-agent
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
kubectl apply -f skywalking-nfs.yaml
kubectl get pvc -n nfs
创建Pod
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
labels:
nfs: nginx-test
namespace: nfs
spec:
replicas: 1
strategy:
type: RollingUpdate
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
restartPolicy: Always
containers:
- name: nginx-test
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: skywalking
mountPath: /skywalking
volumes:
- name: skywalking
persistentVolumeClaim:
claimName: nfs-skywalking-data-agent-pvc
kubectl apply -f deployment.yaml
kubectl get pods -n nfs
查看挂载情况
docker ps
docker exec -it 89c530c19072 /bin/sh
至此完成搭建,尽情享用吧~
更多推荐
所有评论(0)