在k8s集群中配置ceph

3.1、使用cephfs

(1) 在ceph集群创建cephfs

#以下操作在ceph集群的admin或者mon节点上执行
#创建pool来存储数据和元数据
ceph osd pool create cephfs_data 120
ceph osd pool create cephfs_metadata 120 #创建文件系统
ceph fs new cephfs cephfs_metadata cephfs_data #查看文件系统
ceph fs ls

(2) 部署cephfs-provisioner

# 官方没有cephfs动态卷支持
# 使用社区提供的cephfs-provisioner,在k8s集群上操作
vim external-storage-cephfs-provisioner.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: cephfs-provisioner
namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cephfs-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: ["secrets"]
verbs: ["create", "get", "delete"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cephfs-provisioner
subjects:
- kind: ServiceAccount
name: cephfs-provisioner
namespace: kube-system
roleRef:
kind: ClusterRole
name: cephfs-provisioner
apiGroup: rbac.authorization.k8s.io ---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: cephfs-provisioner
namespace: kube-system
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["create", "get", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cephfs-provisioner
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: cephfs-provisioner
subjects:
- kind: ServiceAccount
name: cephfs-provisioner
namespace: kube-system ---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cephfs-provisioner
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: cephfs-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: cephfs-provisioner
spec:
containers:
- name: cephfs-provisioner
image: "quay.io/external_storage/cephfs-provisioner:latest"
env:
- name: PROVISIONER_NAME
value: ceph.com/cephfs
command:
- "/usr/local/bin/cephfs-provisioner"
args:
- "-id=cephfs-provisioner-1"
serviceAccount: cephfs-provisioner
#应用
kubectl apply -f external-storage-cephfs-provisioner.yaml
#查看状态 等待running之后 再进行后续的操作
kubectl get pod -n kube-system

(3) 创建secret

#查看key 在ceph的mon或者admin节点
ceph auth get-key client.admin #获得key的加密串
ceph auth get-key client.admin | base64 #在k8s集群上创建admin secret
##将key的值,替换成上面获得的加密串
vim ceph-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
namespace: kube-system
#type: kubernetes.io/rbd
data:
key: QVFCa01vSmdlNnNVQXhBQWcyczd1K3M0cDN3RERRTk54MFRQOVE9PQ==
#应用创建
kubectl apply -f ceph-secret.yaml
#查看
kubectl get secret ceph-secret -n kube-system -o yaml

(4) 配置存储类storageclass

vim storageclass-cephfs.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: cephfs
provisioner: ceph.com/cephfs
parameters:
monitors: 192.168.80.37:6789,192.168.80.47:6789
adminId: admin
adminSecretName: ceph-secret
adminSecretNamespace: "kube-system"
# claimRoot: /volumes/kubernetes
#allowVolumeExpansion: true
reclaimPolicy: Delete
#volumeBindingMode: Immediate
#应用创建
kubectl apply -f storageclass-cephfs.yaml #查看
kubectl get sc

(5) 创建存储类声明PVC

#在k8s集群上执行
vim cephfs-pvc-test.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: claim
spec:
accessModes:
- ReadWriteMany
storageClassName: cephfs
resources:
requests:
storage: 2Gi
#应用创建
kubectl apply -f cephfs-pvc-test.yaml #查看
kubectl get pvc
kubectl get pv

(6) 测试使用

#创建nginx pod挂载测试
vim nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
name: nginx-pod
spec:
containers:
- name: nginx-pod
image: nginx:alpine
ports:
- name: web
containerPort: 80
volumeMounts:
- name: cephfs
mountPath: /usr/share/nginx/html
volumes:
- name: cephfs
persistentVolumeClaim:
claimName: claim
#应用创建
kubectl apply -f nginx-pod.yaml #查看
kubectl get pods -o wide #修改文件内容
kubectl exec -ti nginx-pod -- /bin/sh -c 'echo Hello World from CephFS!!! > /usr/share/nginx/html/index.html' # 访问测试
POD_ID=$(kubectl get pods -o wide | grep nginx-pod | awk '{print $(NF-1)}')
curl http://$POD_ID

3.2、使用ceph rdb

(1) 使用kubeadm安装集群的额外配置

如果使用kubeadm部署的集群需要进行一些额外的配置,由于使用动态存储时controller-manager需要使用 rbd 命令创建 image,所以controller-manager需要使用rbd命令,由于官方controller-manager镜像里没有rbd命令,需要安装一些额外的插件:

vim 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:

replicas: 1

selector:

matchLabels:

app: rbd-provisioner

strategy:

type: Recreate

template:

metadata:

labels:

app: rbd-provisioner

spec:

containers:

- name: rbd-provisioner

image: "quay.io/external_storage/rbd-provisioner:latest"

env:

- name: PROVISIONER_NAME

value: ceph.com/rbd

serviceAccount: rbd-provisioner

应用创建

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

查看状态 等待running之后 再进行后续的操作

kubectl get pod -n kube-system

在k8s集群中所有节点安装ceph-common

yum install -y ceph-common

(2) 在ceph集群创建pool

创建osd pool,在ceph的admin或者mon节点

ceph osd pool create kube 4096

ceph osd pool ls

创建k8s访问ceph的用户,在ceph的admin或者mon节点

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

查看key,在ceph的admin或者mon节点

ceph auth get-key client.admin

ceph auth get-key client.kube

获得key的加密串,在ceph的admin或者mon节点

ceph auth get-key client.admin | base64

ceph auth get-key client.kube | base64

(3) 创建secret

在k8s集群上,创建secret资源

admin secret,注意替换key的值,替换成上面获得的admin的加密串

vim ceph-secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: ceph-secret

namespace: kube-system

type: kubernetes.io/rbd

data:

key: QVFCa01vSmdlNnNVQXhBQWcyczd1K3M0cDN3RERRTk54MFRQOVE9PQ==

kube secret,在default命名空间创建用于访问ceph的 secret

注意替换key的值,替换成上面获得的kube的加密串

vim ceph-user-secret.yaml

apiVersion: v1

kind: Secret

metadata:

name: ceph-user-secret

namespace: default

type: kubernetes.io/rbd

data:

key: QVFEVU00VmdtdzJPSHhBQWlaTHlUaGZNOHhOTXRoVms0YXkwM3c9PQ==

创建

kubectl apply -f ceph-secret.yaml

kubectl apply -f ceph-user-secret.yaml

查看secret

kubectl get secret ceph-user-secret -o yaml

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

(4) 配置存储类storageclass

配置存储类storageclass

vim storageclass-ceph-rdb.yaml

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

name: dynamic-ceph-rdb

provisioner: ceph.com/rbd

provisioner: kubernetes.io/rbd

parameters:

monitors: 192.168.80.37:6789,192.168.80.47:6789

adminId: admin

adminSecretName: ceph-secret

adminSecretNamespace: kube-system

pool: kube

userId: kube

userSecretName: ceph-user-secret

fsType: ext4

imageFormat: "2"

imageFeatures: "layering"

allowVolumeExpansion: true

reclaimPolicy: Retain

volumeBindingMode: Immediate

创建

kubectl apply -f storageclass-ceph-rdb.yaml

查看

kubectl get sc

(5) 创建存储类声明PVC

在k8s集群上执行

vim ceph-rdb-pvc-test.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: ceph-rdb-claim

namespace: kube-system

spec:

accessModes:

- ReadWriteOnce

storageClassName: dynamic-ceph-rdb

resources:

requests:

storage: 2Gi

创建

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

查看

kubectl get pvc

kubectl get pv

(6) 测试使用

创建nginx pod挂载测试

vim nginx-pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: nginx-pod

labels:

name: nginx-pod

spec:

containers:

  • name: nginx-pod

    image: nginx:alpine

    ports:

    • name: web

      containerPort: 80

      volumeMounts:
    • name: ceph-rdb

      mountPath: /usr/share/nginx/html

      volumes:
  • name: cephfs

    persistentVolumeClaim:

    claimName: ceph-rdb-claim

应用创建

kubectl apply -f nginx-pod.yaml

查看

kubectl get pods -o wide

修改文件内容

kubectl exec -ti nginx-pod -- /bin/sh -c 'echo Hello World from Ceph RBD!!! > /usr/share/nginx/html/index.html'

访问测试

POD_ID=$(kubectl get pods -o wide | grep nginx-pod | awk '{print $(NF-1)}')

curl http://$POD_ID

清理

kubectl delete -f nginx-pod.yaml

kubectl delete -f cephfs-rdb-pvc-test.yaml

3.3、第三方工具

Kuboard 是 Kubernetes 的一款图形化管理界面,相关安装和配置请参考官网 https://kuboard.cn/ ,ceph存储的配置操作见 https://kuboard.cn/learning/k8s-intermediate/persistent/ceph/k8s-config.html ,需要注意的是Ceph集群版本不低于 v15.2.3,且已经在集群中创建了一个 FileSystem。

kubernetes配置使用ceph动态存储的更多相关文章

  1. Ceph集群搭建及Kubernetes上实现动态存储(StorageClass)

    集群准备 ceph集群配置说明   节点名称 IP地址 配置 作用 ceph-moni-0 10.10.3.150 centos7.5 4C,16G,200Disk 管理节点,监视器 monitor ...

  2. kubernetes 静态存储与动态存储

    静态存储   Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化.Kubernetes 将 Volume 分为持久化的 PersistentVo ...

  3. kubernetes配置后端存储 rook-ceph

    一 Rook概述 1.1 Ceph简介 Ceph是一种高度可扩展的分布式存储解决方案,提供对象.文件和块存储.在每个存储节点上,将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进 ...

  4. Kubernetes (1.6) 中的存储类及其动态供给

    原文地址:http://blog.fleeto.us/translation/dynamic-provisioning-and-storage-classes-kubernetes-0?utm_sou ...

  5. Kubernetes配置Ceph RBD StorageClass

    1. 在Ceph上为Kubernetes创建一个存储池 # ceph osd pool create k8s 2. 创建k8s用户 # ceph auth get-or-create client.k ...

  6. 二十八. Ceph概述 部署Ceph集群 Ceph块存储

    client   :192.168.4.10 node1 :192.168.4.11 ndoe2 :192.168.4.12 node3 :192.168.4.13   1.实验环境 准备四台KVM虚 ...

  7. Ceph分层存储分析

    最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1,首先肯定要弄清Ceph分层存储的结构 ,结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O ...

  8. 腾讯云存储专家深度解读基于Ceph对象存储的混合云机制

    背景 毫无疑问,乘着云计算发展的东风,Ceph已经是当今最火热的软件定义存储开源项目.如下图所示,它在同一底层平台之上可以对外提供三种存储接口,分别是文件存储.对象存储以及块存储,本文主要关注的是对象 ...

  9. 006.Ceph对象存储基础使用

    一 Ceph文件系统 1.1 概述 Ceph 对象网关是一个构建在 librados 之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个 RESTful 风格的网关 . Ceph 对象存 ...

随机推荐

  1. 磁盘sda,hda,sda1,并行,串行

    1.sd,hd表示硬盘, a表示第一块盘, 1表示硬盘上的第一个分区 2.sd是Serial ATA Disk ,表示硬盘是scsi,SATA串行接口 hd是 hard disk,表示硬盘是IDE(也 ...

  2. 带你十天轻松搞定 Go 微服务系列(三)

    序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务(本文) 产品服务 订单服务 支付服务 RPC 服务 Auth ...

  3. zabbix-mongodb监控脚本(高性能、低占用)

    Zabbix调用脚本以实现对MongoDB的监控! 本脚本支持对服务存活状态.副本集.性能指标共计25个监控项! 使用mongostat和"echo rs.status()["me ...

  4. *衡树 Treap(树堆) 学习笔记

    调了好几个月的 Treap 今天终于调通了,特意写篇博客来纪念一下. 0. Treap 的含义及用途 在算法竞赛中很多题目要使用二叉搜索树维护信息.然而毒瘤数据可能让二叉搜索树退化成链,这时就需要让二 ...

  5. C编译器中“不是所有的控件路径都返回值”报错

    编译器的判断逻辑是是否在所有的分支中都返回了值,即if不成立时也必须返回值.编译器认为如果三个if都不成立则此函数可能没有返回值,故报错.需要将第三个if改为else或者去掉if体直接return.

  6. HTML页元素自适应+居中总结(不定期补充)

    感谢大佬:https://www.cnblogs.com/SallyShan/p/11480685.html 图片自适应 背景图片自适应 /*背景页*/ #page_content{ width: 1 ...

  7. iOS block的用法 by -- 周傅琦君

    X.1 初探Block X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面 ...

  8. 关于static

    static是静态的意思: static修饰的成员变量,在内存中存在于方法区中,只有一份,非静态的成员变量在堆中,每个对象中都有一份 public class Demo1 {    public st ...

  9. push自定义动画

    // //  ViewController.m //  ViewControllerAnimation // //  Created by mac on 15/5/26. //  Copyright ...

  10. ansible-playbook实现MySQL的二进制部署

    1.ansible服务器配置 1.1 安装ansible # yum -y install ansible 1.2 配置主机清单文件 # vi /etc/ansible/hosts [local] 1 ...