k8s使用ceph存储实现持久化

1、PV、PVC概述

管理存储是管理计算的一个明显问题。PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。于是引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim

PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象包含存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。

PersistentVolumeClaim(PVC)是用户存储的请求。 它类似于pod。Pod消耗节点资源,PVC消耗存储资源。 pod可以请求特定级别的资源(CPU和内存)。 权限要求可以请求特定的大小和访问模式。

虽然PersistentVolumeClaims允许用户使用抽象存储资源,但是常见的是,用户需要具有不同属性(如性能)的PersistentVolumes,用于不同的问题。 管理员需要能够提供多种不同于PersistentVolumes,而不仅仅是大小和访问模式,而不会使用户了解这些卷的实现细节。 对于这些需求,存在StorageClass资源。

StorageClass为集群提供了一种描述他们提供的存储的“类”的方法。 不同的类可能映射到服务质量级别,或备份策略,或者由群集管理员确定的任意策略。 Kubernetes本身对于什么类别代表是不言而喻的。 这个概念有时在其他存储系统中称为“配置文件”

2、POD动态供给

动态供给主要是能够自动帮你创建pv,需要多大的空间就创建多大的pv。k8s帮助创建pv,创建pvc就直接api调用存储类来寻找pv。

如果是存储静态供给的话,会需要我们手动去创建pv,如果没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态。而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪个存储,然后帮你去连接,再帮你去自动创建pv。

3、POD使用RBD做为持久数据卷

安装与配置

RBD支持ReadWriteOnce,ReadOnlyMany两种模式

3.1、配置rbd-provisioner

cat >external-storage-rbd-provisioner.yaml<

apiVersion: v1

kind: ServiceAccount

metadata:

name: rbd-provisioner

namespace: kube-system

---

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: ["endpoints"]

verbs: ["get", "list", "watch", "create", "update", "patch"]

- apiGroups: [""]

resources: ["services"]

resourceNames: ["kube-dns"]

verbs: ["list", "get"]

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1

metadata:

name: rbd-provisioner

subjects:

- kind: ServiceAccount

name: rbd-provisioner

namespace: kube-system

roleRef:

kind: ClusterRole

name: rbd-provisioner

apiGroup: rbac.authorization.k8s.io

---

apiVersion: rbac.authorization.k8s.io/v1

kind: Role

metadata:

name: rbd-provisioner

namespace: kube-system

rules:

- apiGroups: [""]

resources: ["secrets"]

verbs: ["get"]

---

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

name: rbd-provisioner

namespace: kube-system

roleRef:

apiGroup: rbac.authorization.k8s.io

kind: Role

name: rbd-provisioner

subjects:

- kind: ServiceAccount

name: rbd-provisioner

namespace: kube-system

---

apiVersion: apps/v1

kind: Deployment

metadata:

name: rbd-provisioner

namespace: kube-system

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/external_storage/rbd-provisioner:v2.0.0-k8s1.11"

env:

- name: PROVISIONER_NAME

value: ceph.com/rbd

serviceAccount: rbd-provisioner

EOF

# kubectl apply -f external-storage-rbd-provisioner.yaml

# kubectl get pods --all-namespaces

3.2、配置storageclass

1、创建pod时,kubelet需要使用rbd命令去检测和挂载pv对应的ceph image,所以要在所有的worker节点安装ceph客户端ceph-common。

将ceph的ceph.client.admin.keyring和ceph.conf文件拷贝到master的/etc/ceph目录下

1)、安装ceph-common(三台节点)

# yum install -y ceph-common

2)、安装ceph-fuse

# yum install -y ceph-fuse

3)、将ceph集群的ceph.conf拷贝到客户端k8s-master

# scp [email protected]:/etc/ceph/ceph.conf /etc/ceph/

# chmod 644 /etc/ceph/ceph.conf

4)、使用 ceph-fuse 挂载 CephFS

# ceph auth get client.cephfs #在192.168.1.16查看

exported keyring for client.cephfs

[client.cephfs]

key = AQCqw0BehqnmARAA1zlbt/IOG7KklJIv65LA5w==

caps mds = "allow rw"

caps mon = "allow r"

caps osd = "allow rw pool=cephfs-data, allow rw pool=cephfs-metadata"

# cat /etc/ceph/ceph.client.cephfs.keyring #在k8s-master1添加

exported keyring for client.cephfs

[client.cephfs]

key = AQCqw0BehqnmARAA1zlbt/IOG7KklJIv65LA5w==

caps mds = "allow rw"

caps mon = "allow r"

caps osd = "allow rw pool=cephfs-data, allow rw pool=cephfs-metadata"

2、创建 osd pool 在ceph的mon或者admin节点(ceph192.168.1.16)

# ceph osd pool create kube 16 16

# ceph osd pool ls

3、创建k8s访问ceph的用户 在ceph的mon或者admin节点(ceph192.168.1.16)

# ceph auth get-or-create client.kube mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=kube' -o ceph.client.kube.keyring

4、查看key 在ceph的mon或者admin节点(ceph192.168.1.16)

# ceph auth get-key client.admin

AQCZtz9eO951DRAA7JxCY93eWaa2nmMSkymPbA==

# ceph auth get-key client.kube

AQC7JEJepRZYLxAAgMLOcrgjAvon4BuNQ9mP5w==

5、创建 admin secret(k8s-master1)

# CEPH_ADMIN_SECRET 替换为 client.admin 获取到的key

# kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \\

--from-literal=key=AQCZtz9eO951DRAA7JxCY93eWaa2nmMSkymPbA== \\

--namespace=kube-system

6、在 default 命名空间创建pvc用于访问ceph的 secret

# CEPH_KUBE_SECRET 替换为 client.kube 获取到的key

# kubectl create secret generic ceph-user-secret --type="kubernetes.io/rbd" \\

--from-literal=key=AQC7JEJepRZYLxAAgMLOcrgjAvon4BuNQ9mP5w== \\

--namespace=default

7、查看 secret

# kubectl get secret ceph-user-secret -o yaml

# kubectl get secret ceph-secret -n kube-system -o yaml

8、删除secret命令

# kubectl delete secret ceph-user-secret

# kubectl delete secret ceph-secret -n kube-system

配置storageClass yaml

cat >storageclass-ceph-rdb.yaml<

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

name: dynamic-ceph-rdb

provisioner: ceph.com/rbd

parameters:

monitors: 192.168.1.16:6789,192.168.1.17:6789,192.168.1.18:6789

adminId: admin

adminSecretName: ceph-secret

adminSecretNamespace: kube-system

pool: kube

userId: kube

userSecretName: ceph-user-secret

fsType: ext4

imageFormat: "2"

imageFeatures: "layering"

EOF

# kubectl apply -f storageclass-ceph-rdb.yaml

查看sc

# kubectl get storageclasses


k8s使用ceph存储实现持久化


7.9.3.3、测试使用

1、创建pvc测试

cat >ceph-rdb-pvc-test.yaml<

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: ceph-rdb-claim

spec:

accessModes:

- ReadWriteOnce

storageClassName: dynamic-ceph-rdb

resources:

requests:

storage: 2Gi

EOF

# kubectl apply -f ceph-rdb-pvc-test.yaml

# kubectl describe pvc ceph-rdb-claim 查看pvc信息

2、查看

# kubectl get pvc


k8s使用ceph存储实现持久化


# kubectl get pv


k8s使用ceph存储实现持久化


3、创建 nginx pod 挂载测试

cat >nginx-pod.yaml<

apiVersion: v1

kind: Pod

metadata:

name: nginx-pod1

labels:

name: nginx-pod1

spec:

containers:

- name: nginx-pod1

image: nginx:alpine

ports:

- name: web

containerPort: 80

volumeMounts:

- name: ceph-rdb

mountPath: /usr/share/nginx/html

volumes:

- name: ceph-rdb

persistentVolumeClaim:

claimName: ceph-rdb-claim

EOF

# kubectl apply -f nginx-pod.yaml

4、查看

# kubectl get pods -o wide


k8s使用ceph存储实现持久化


5、修改文件内容

# kubectl exec -ti nginx-pod1 -- /bin/sh -c 'echo this is from Ceph RBD!!! > /usr/share/nginx/html/index.html'

6、访问测试

# curl http://10.244.0.106


k8s使用ceph存储实现持久化


7、清理

# kubectl delete -f nginx-pod.yaml

# kubectl delete -f ceph-rdb-pvc-test.yaml

"


分享到:


相關文章: