[单master节点k8s部署]32.ceph分布式存储(三)

基于ceph rbd生成pv

在集群中认证ceph

用下面代码生成ceph的secret

 .创建 ceph 的 secret,在 k8s 的控制节点操作:

回到 ceph 管理节点创建 pool 池:

[root@master1-admin ~]# ceph osd pool create k8stest 56
pool 'k8stest' created
[root@master1-admin ~]# rbd create rbda -s 1024 -p k8stest
[root@master1-admin ~]# rbd feature disable k8stest/rbda object-map fast-diff deepflatten

创建pv(RBD共享挂载)

[root@xianchaomaster1 ~]# cat pv.yaml 
apiVersion: v1 
kind: PersistentVolume 
metadata: 
 name: ceph-pv 
spec: 
 capacity: 
   storage: 1Gi 
 accessModes: 
 - ReadWriteOnce 
 rbd: 
   monitors: 
   - '192.168.40.201:6789'
   - '192.168.40.200:6789'
   - '192.168.40.202:6789' 
   pool: k8stest 
   image: rbda 
   user: admin 
   secretRef: 
     name: ceph-secret 
   fsType: xfs 
   readOnly: false 
 persistentVolumeReclaimPolicy: Recycle

ceph rbd 块存储的特点,ceph rbd 块存储能在同一个 node 上跨 pod 以 ReadWriteOnce 共享挂载,ceph rbd 块存储能在同一个 node 上同一个 pod 多个容器中以 ReadWriteOnce 共享挂载,ceph rbd 块存储不能跨 node 以 ReadWriteOnce 共享挂载。如果一个使用ceph rdb 的pod所在的node挂掉,这个pod虽然会被调度到其它node, 但是由于 rbd 不能跨 node 多次挂载和挂掉的 pod 不能自动解绑 pv 的问题,这个新 pod 不会正常运行。

问题:
结合 ceph rbd 共享挂载的特性和 deployment 更新的特性,我们发现原因如下:
由于 deployment 触发更新,为了保证服务的可用性,deployment 要先创建一个 pod 并运行正常之后,再去删除老 pod。而如果新创建的 pod 和老 pod 不在一个 node,就 会导致此故障。
解决办法:
1,使用能支持跨 node 和 pod 之间挂载的共享存储,例如 cephfs,GlusterFS 等
2,给 node 添加 label,只允许 deployment 所管理的 pod 调度到一个固定的 node 上。
(不建议,这个 node 挂掉的话,服务就故障了)

storageClass动态生成pv

role和clusterrole等配置:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: rbd-provisioner
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"]
 - apiGroups: [""]
 resources: ["services"]
 resourceNames: ["kube-dns","coredns"]
 verbs: ["list", "get"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
 name: rbd-provisioner
subjects:
 - kind: ServiceAccount
 name: rbd-provisioner
 namespace: default
roleRef:
 kind: ClusterRole
 name: rbd-provisioner
 apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
 name: rbd-provisioner
rules:
- apiGroups: [""]
 resources: ["secrets"]
 verbs: ["get"]
- apiGroups: [""]
 resources: ["endpoints"]
 verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
 name: rbd-provisioner
roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: Role
 name: rbd-provisioner
subjects:
- kind: ServiceAccount
 name: rbd-provisioner
 namespace: default
设置rbd provisioner
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rbd-provisioner
spec:
  selector:
  matchLabels:
    app: rbd-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: rbd-provisioner
    spec:
    containers:
    - name: rbd-provisioner
      image: quay.io/xianchao/external_storage/rbd-provisioner:v1
      imagePullPolicy: IfNotPresent
      env:
      - name: PROVISIONER_NAME
        value: ceph.com/rbd
    serviceAccount: rbd-provisioner
设置secret和sa
apiVersion: v1
kind: ServiceAccount
metadata:
 name: rbd-provisioner
apiVersion: v1
kind: Secret
metadata:
 name: ceph-secret-1
 type: "ceph.com/rbd"
 data:
   key: QVFBWk0zeGdZdDlhQXhBQVZsS0poYzlQUlBianBGSWJVbDNBenc9PQ==
storageclass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: k8s-rbd
 provisioner: ceph.com/rbd
 parameters:
   monitors: 192.168.40.201:6789
   adminId: admin
   adminSecretName: ceph-secret-1
   pool: k8stest1
   userId: admin
   userSecretName: ceph-secret-1
   fsType: xfs
   imageFormat: "2"
   imageFeatures: "layering
pvc
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: rbd-pvc
spec:
 accessModes:
 - ReadWriteOnce
 volumeMode: Filesystem
 resources:
   requests:
    storage: 1Gi
 storageClassName: k8s-rbd

发现PVC绑定错误,绑定的为k8stest1,而创建的pool资源为k8stest。

创建新的pool资源:ceph osd pool create k8stest1 56

测试pod
[root@xianchaomaster1 ~]# cat pod-sto.yaml 
apiVersion: v1
kind: Pod
metadata:
 labels:
   test: rbd-pod
 name: ceph-rbd-pod
spec:
 containers:
 - name: ceph-rbd-nginx
   image: nginx
   imagePullPolicy: IfNotPresent
   volumeMounts:
   - name: ceph-rbd
     mountPath: /mnt
     readOnly: false
 volumes:
 - name: ceph-rbd
 persistentVolumeClaim:
   claimName: rbd-pvc

K8s挂载cephFS

k8s挂载ceph后,就可以将ceph作为一个存储路径使用。

仍使用之前创建的secret文件。

先在ceph集群的节点上创建一个secret file

[root@master1-admin ~]# cat /etc/ceph/ceph.client.admin.keyring |grep key|awk -
F" " '{print $3}' > /etc/ceph/admin.secret

然后在ceph集群中创建一个目录,并把ceph的根目录挂载到这个目录。xianchao作为一个文件系统,是我们之前已经创建好了的(见CSDN)。这里再重复一遍:

[root@master1-admin ceph]# ceph osd pool create cephfs_data 26
pool 'cephfs_data' created
[root@master1-admin ceph]# ceph osd pool create cephfs_metadata 26
pool 'cephfs_metadata' created
[root@master1-admin ceph]# ceph fs new xianchao cephfs_metadata cephfs_data
[root@master1-admin ~]# mkdir xianchao_data
[root@master1-admin ~]# mount -t ceph 192.168.40.201:6789:/ /root/xianchao_data 
-o name=admin,secretfile=/etc/ceph/admin.secret
[root@master1-admin ~]# df -h
192.168.40.201:6789:/ 165G 106M 165G 1% /root/xianchao_data
在 cephfs 的根目录里面创建了一个子目录 lucky,k8s 以后就可以挂载这个目录
[root@master1-admin ~]# cd /root/xianchao_data/
[root@master1-admin xianchao_data]# mkdir lucky
[root@master1-admin xianchao_data]# chmod 0777 lucky/

mount -t ceph 表明挂载的是一个cephFS系统,而网址是monitor的地址,跟着他的根目录。将这个根目录挂载到xianchao_data 文件夹下。

使用 admin 用户来挂载 CephFS。

使用secret 来验证这个挂载。

这里只有xianchao一个cephFS,如果有多个,可以指定cephFS的名称:

mount -t ceph 192.168.40.201:6789:/xianchao /root/xianchao_data -o name=admin,secretfile=/etc/ceph/admin.secret

CephFS 是一个分布式文件系统,允许将其挂载到不同节点上。为了更方便地管理和组织数据,通常会在 CephFS 挂载的根目录下创建子目录。例如,在这个的场景中,lucky 目录是为了以后 Kubernetes 的持久卷使用。

创建pv
[root@xianchaomaster1 ceph]# cat cephfs-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
 name: cephfs-pv
spec:
 capacity:
 storage: 1Gi
 accessModes:
 - ReadWriteMany
 cephfs:
 monitors:
 - 192.168.40.201:6789
 path: /lucky
 user: admin
 readOnly: false
 secretRef:
 name: cephfs-secret
 persistentVolumeReclaimPolicy: Recycle

其余的pvc创建和之前类似,通过创建在不同节点上的pod,可以看到不同node上的pod可以共享一个pv。

pod文件
[root@xianchaomaster1 ceph]# cat cephfs-pod-1.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: cephfs-pod-1
spec:
 containers:
 - image: nginx
   name: nginx
   imagePullPolicy: IfNotPresent
   volumeMounts:
   - name: test-v1
     mountPath: /mnt
 volumes:
 - name: test-v1
   persistentVolumeClaim:
     claimName: cephfs-pvc
[root@xianchaomaster1 ceph]# kubectl apply -f cephfs-pod-1.yaml
创建第二个 pod,挂载 cephfs-pvc
[root@xianchaomaster1 ceph]# cat cephfs-pod-2.yaml 
apiVersion: v1
kind: Pod
metadata:
 name: cephfs-pod-2
spec:
 containers:
 - image: nginx
   name: nginx
   imagePullPolicy: IfNotPresent
   volumeMounts:
   - name: test-v1
     mountPath: /mnt
 volumes:
 - name: test-v1
   persistentVolumeClaim:
     claimName: cephfs-pvc

下面是在Kubernetes集群上使用DaemonSet部署Ceph的详细步骤: 1. 创建Ceph集群配置文件 在Kubernetes Master节点上创建一个ceph.conf文件,并将其保存到 /etc/ceph 目录下。该文件应该包含Ceph集群的配置信息和认证密钥。以下是一个示例配置文件: ``` [global] fsid = {cluster-id} mon_initial_members = {mon-host-1}, {mon-host-2}, {mon-host-3} mon_host = {mon-host-1-ip}, {mon-host-2-ip}, {mon-host-3-ip} auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx ``` 2. 创建Ceph密钥文件 在Kubernetes Master节点上创建一个ceph.client.admin.keyring文件,并将其保存到 /etc/ceph 目录下。该文件包含Ceph集群管理用户的认证密钥。以下是一个示例文件: ``` [client.admin] key = {admin-key} ``` 3. 创建Ceph镜像 在Docker Hub上获取Ceph镜像,并将其下载到Kubernetes Master节点上。可以使用以下命令来获取镜像: ``` docker pull ceph/daemon:v3.2.3 ``` 4. 创建Ceph存储卷 在Kubernetes集群中创建一个存储卷,用于Ceph daemon的持久化存储。可以使用以下命令来创建存储卷: ``` kubectl create -f ceph-volume.yaml ``` 其中,ceph-volume.yaml文件包含以下内容: ``` apiVersion: v1 kind: PersistentVolume metadata: name: ceph-volume spec: capacity: storage: 100Gi accessModes: - ReadWriteOnce rbd: monitors: - {mon-host-1-ip}:6789 - {mon-host-2-ip}:6789 - {mon-host-3-ip}:6789 pool: rbd image: ceph-volume user: admin secretRef: name: ceph-client-secret fsType: ext4 ``` 其中,{mon-host-1-ip}、{mon-host-2-ip}、{mon-host-3-ip}是Ceph集群中的Monitor节点IP地址,{ceph-client-secret}是在第5步中创建的Secret对象的名称。 5. 创建Ceph认证密钥Secret对象 在Kubernetes集群中创建一个Secret对象,用于存储Ceph集群认证密钥。可以使用以下命令来创建Secret对象: ``` kubectl create secret generic ceph-client-secret --from-file=/etc/ceph/ceph.client.admin.keyring ``` 其中,/etc/ceph/ceph.client.admin.keyring是在第2步中创建的Ceph客户端认证密钥文件路径。 6. 创建Ceph DaemonSet 在Kubernetes集群中创建一个DaemonSet对象,用于部署Ceph daemon。可以使用以下命令来创建DaemonSet对象: ``` kubectl create -f ceph-daemonset.yaml ``` 其中,ceph-daemonset.yaml文件包含以下内容: ``` apiVersion: apps/v1beta2 kind: DaemonSet metadata: name: ceph-daemonset namespace: ceph spec: selector: matchLabels: app: ceph template: metadata: labels: app: ceph spec: containers: - name: ceph-daemon image: ceph/daemon:v3.2.3 volumeMounts: - name: ceph-volume mountPath: /var/lib/ceph/osd - name: ceph-conf mountPath: /etc/ceph volumes: - name: ceph-volume persistentVolumeClaim: claimName: ceph-volume-claim - name: ceph-conf configMap: name: ceph-conf ``` 其中,ceph-volume-claim是在第4步中创建的存储卷声明的名称,ceph-conf是在Ceph集群配置文件和认证密钥文件的配置映射。 7. 验证Ceph DaemonSet 使用以下命令验证Ceph daemon是否已成功部署: ``` kubectl get pods -n ceph ``` 如果一切正常,应该看到一个名为ceph-daemonset-<node-name>的Pod正在运行。 以上就是在Kubernetes集群上使用DaemonSet部署Ceph的详细步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值