1 - NFS服务
本文档介绍了如何在 KubeCube 上接入 NFS 服务。
准备工作
登录 NFS 服务器
通过 NFS 导出文件为 KubeCube 分配服务器访问权限
修改
/etc/exports
文件,添加{导出目录} {KubeCube应用所在节点IP}(rw,sync,no_subtree_check,insecure)
。如:重新启动 NFS 服务器
systemctl restart nfs-kernel-server
为 KubeCube 打开防火墙
ufw allow from {KubeCube所在节点IP} to any port nfs
登录 K8s 集群 worker 节点
安装 NFS Common
apt-get install nfs-common
或yum install nfs-utils
等。修改
/etc/kubernetes/manifests/kube-apiserver.yaml
文件,添加- --feature-gates=RemoveSelfLink=false
。
创建 StorageClass
登录 KubeCube 所在节点,创建以下文件并 apply,请根据实际环境修改部分参数。
配置 account 及相关权限
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default #根据实际环境设定namespace,下面类同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
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: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
创建 NFS Provisioner
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default #与RBAC文件中的namespace保持一致
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: qgg-nfs-storage #provisioner名称,请确保该名称与 nfs-StorageClass.yaml文件中的provisioner名称保持一致
- name: NFS_SERVER
value: 10.173.32.164 #NFS Server IP地址
- name: NFS_PATH
value: /mnt/linuxidc #NFS挂载卷
volumes:
- name: nfs-client-root
nfs:
server: 10.173.32.164 #NFS Server IP地址
path: /mnt/linuxidc #NFS 挂载卷
创建 StorageClass
方式一:命令行操作
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: qgg-nfs-storage #这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致
parameters:
archiveOnDelete: "false"
方式二:页面操作
- 以平台管理员身份登录 KubeCube;
- 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。
创建 PVC
在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别可以选择已创建过的 StorageClass。
创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理。
创建工作负载
在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。
具体配置说明见 工作负载管理。
检查结果
创建挂载 PVC 的工作负载后,登录 NFS 服务器,进入导出目录,可以看到已经创建出一个新的文件夹,文件夹命名为 ${namespace}-${pvcName}-${pvName}。
2 - Ceph集群
本文档介绍了如何在 KubeCube 上接入 Ceph 集群。
示例环境说明
产品 | 版本 |
---|---|
Kubernetes | v1.20.9 |
KubeCube | v1.0.2 |
Ceph | 15.2.1 |
准备工作
登录 Ceph master 节点
获取管理 key
ceph auth get-key client.admin | base64
在 Ceph 集群中创建一个 KubeCube 专用的 pool 和用户
ceph osd pool create kube 8 8 ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd
获取该用户 key
ceph auth get-key client.kube|base64
登录 K8s 集群 worker 节点
安装 ceph-common
apt-get install ceph-common
或yum install ceph-common
等。使用外部的 Provisioner 提供服务
git clone https://github.com/kubernetes-incubator/external-storage.git # v5.5.0 cd external-storage/ceph/rbd/deploy sed -r -i "s/namespace: [^ ]+/namespace: kube-system/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml kubectl -n kube-system apply -f ./rbac
创建 Secret
登录 KubeCube 所在节点,执行以下命令:
# 替换为 Ceph 集群生成的 key
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='QVFEcGpqbGhqczJnQWhBQTByN3NNbHB4cTAwdGR1eWdqWk1LaUE9PQ==' --namespace=kube-system
kubectl create secret generic ceph-kube-secret --type="kubernetes.io/rbd" --from-literal=key='QVFDTHhUcGhMS0VMQWhBQWx3NU1MNzZneVRpR1dNYVdVckgxN0E9PQ==' --namespace=default
创建 StorageClass
方式一:命令行操作
vi sc.yaml
文件并 apply,以下为示例,需要根据 Ceph 集群信息修改参数。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
annotations:
storageclass.beta.kubernetes.io/is-default-class: "true"
provisioner: ceph.com/rbd
parameters:
monitors: 10.173.32.173:6789 #修改成实际 Ceph Monitor IP
adminId: admin
adminSecretName: ceph-secret
adminSecretNamespace: kube-system
pool: kube
userId: kube
userSecretName: ceph-kube-secret
userSecretNamespace: default
fsType: ext4
imageFormat: "2"
imageFeatures: "layering"
关于上面的 adminId 等字段的具体含义请参考 Ceph RBD。
方式二:页面操作
- 以平台管理员身份登录 KubeCube;
- 展开左侧菜单栏里的【资源管理】,点击【集群管理】进入集群管理页面,点击需要创建 StorageClass 的集群名称,进入集群详情页面,点击【存储类别】进入存储类别管理页面,点击【创建存储类别】,将方式一中的文件内容写入,点击【确定】,即创建出该 StorageClass。
创建 PVC
在控制台页面,选择租户和项目,选择集群和空间,点击左侧菜单栏【存储】进入存储管理页面。点击【创建存储声明】,存储类别选择 Ceph 对应的 StorageClass。
创建后可以看到 PVC 状态为 Bound。具体配置说明见 PVC管理。
创建工作负载
在创建工作负载时,点击【展开更多配置】-【挂载数据卷】-【PVC】-【参数】,可以选择上述创建的 PVC。
具体配置说明见 工作负载管理。
检查结果
检查相关 pod 是否正常运行,如果正常则配置成功。