k8s--基础--28.5--ceph--k8s对接ceph rbd
kubernetes要想使用ceph,需要在k8s的每个节点安装ceph-common。4.2、中,我们有创建ceph的secret,这里我们需要删掉,再重新建。可以看到pvc已经和pv进行绑定了,对应的pv名称为ceph-pv。在master1-admin(ceph的管理节点)上操作。在master1-admin(ceph的管理节点)上操作。在master1-admin(ceph的管理节点)上操
·
k8s–基础–28.5–ceph–k8s对接ceph rbd
1、介绍
1.1、kubernetes支持的后端存储接口
1.2、kubernetes pv和pvc绑定流程
- 创建pv:pv需要指定后端存储类型
- 创建pvc:指定需要的资源
- pvc和pv绑定
- pod挂载pvc实现持久化存储
1.3、kubernetes storageclass存储类动态生成pv流程
- 创建storageclass(sc)
- pvc请求已经创建的sc,通过sc来自动创建pv,达到通过sc动态生成一个pv的效果
2、公共操作
2.1、配置master1-admin节点到master1,node1节点的无密码登陆
在 master1-admin上操作
2.1.1、配置hosts文件
cat >> /etc/hosts <<EOF
192.168.187.154 master1
192.168.187.155 node1
EOF
2.1.2、生成加密信息
以前的操作,我们已经做过,这里就不执行了
cd
ssh-keygen -t rsa
一直回车就可以
2.1.3、将公钥复制到对应的节点上
ssh-copy-id -i .ssh/id_rsa.pub root@master1
ssh-copy-id -i .ssh/id_rsa.pub root@node1
2.2、将ceph配置文件拷贝到各个k8s的节点
在master1-admin(ceph的管理节点)上操作
# 在node1,master1节点上创建目录
mkdir -p /etc/ceph/
# 拷贝 ceph配置文件到各个k8s的节点
scp -r /etc/ceph/* node1:/etc/ceph/
scp -r /etc/ceph/* master1:/etc/ceph/
2.3、每个k8s的节点安装ceph-common
kubernetes要想使用ceph,需要在k8s的每个节点安装ceph-common
2.3.1、把ceph节点上的ceph.repo文件拷贝到k8s各个节点上
在master1-admin节点操作
scp -r /etc/yum.repos.d/ceph.repo node1:/etc/yum.repos.d/
scp -r /etc/yum.repos.d/ceph.repo master1:/etc/yum.repos.d/
2.3.2、安装ceph-common
每个节点安装ceph-common
# 更新yum源
yum update -y
# 安装ceph-common
yum install -y ceph-common
3、测试–创建的pod直接挂载ceph rbd
3.1、创建ceph rbd
在master1-admin(ceph的管理节点)上操作
# 创建一个pool,名称是k8srbd
ceph osd pool create k8srbd 256
# 在k8srbd中创建rbd,名称是rbda,大小为1024
rbd create rbda -s 1024 -p k8srbd
# 需要禁用,否则挂载不成功
rbd feature disable k8srbd/rbda object-map fast-diff deep-flatten
3.2、测试pod直接挂载刚才创建的ceph rbd
在master1上操作
3.2.1、脚本
# 创建对应的目录
mkdir -p /root/ceph/
vi /root/ceph/pod-test.yaml
内容
apiVersion: v1
kind: Pod
metadata:
name: testrbd
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
# 引用数据卷
- name: testrbd
mountPath: /mnt
# 定义数据卷
volumes:
# 定义名称
- name: testrbd
# 类型是rbd
rbd:
# rbd监控节点,如果有多个,就写多个
monitors:
- '192.168.187.157:6789'
# pool的名称
pool: k8srbd
# rbd的名称
image: rbda
# rdb要格式化为xfs文件系统
fsType: xfs
# 非只读
readOnly: false
# 用户是admin,因为我们是拷贝master1-admin的配置信息
user: admin
# 秘钥,因为我们是拷贝master1-admin的配置信息
keyring: /etc/ceph/ceph.client.admin.keyring
3.4.2、执行
kubectl apply -f /root/ceph/pod-test.yaml
# 查看
kubectl get pods
4、基于ceph rbd创建pv,pvc
4.1、获取client.admin的keyring值
- 获取client.admin的keyring值,并用base64编码,我们使用这个值来创建k8s secret对象
- 可以认为client.admin就是访问ceph管理节点的token
- 在master1-admin(ceph管理节点)操作
ceph auth get-key client.admin | base64
# 内容如下
# QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==
4.2、创建ceph的secret
- 这个secre 用于k8s volume插件访问ceph集群
- 在k8s的master1上操作
4.2.1、脚本
# 创建对应的目录
mkdir -p /root/ceph/
vi /root/ceph/ceph-secret.yaml
内容
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
data:
# 相当于定义访问ceph集群的token
key: QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==
4.2.2、执行
kubectl apply -f /root/ceph/ceph-secret.yaml
# 查看
kubectl get Secret
4.3、创建pool池
在master1-admin(ceph的管理节点)上操作
# 创建一个pool,名称是k8stest
ceph osd pool create k8stest 256
# 在k8stest中创建rbd,名称是rbda,大小为1024
rbd create rbda -s 1024 -p k8stest
# 需要禁用,否则挂载不成功
rbd feature disable k8stest/rbda object-map fast-diff deep-flatten
4.4、创建ceph pv
- 在k8s的master1上操作
4.4.1、脚本
# 创建对应的目录
mkdir -p /root/ceph/
vi /root/ceph/pv.yaml
内容
apiVersion: v1
kind: PersistentVolume
metadata:
# 定义pv的名称
name: ceph-pv
spec:
# 定义PV的资源
capacity:
storage: 1Gi
# 定义pv的访问模式为:单节点读写
accessModes:
- ReadWriteOnce
# 定义存储卷回收策略
persistentVolumeReclaimPolicy: Recycle
# 使用rbd来定义pv
rbd:
# rbd监控节点,如果有多个,就写多个
monitors:
- 192.168.187.157:6789
# pool的名称
pool: k8stest
# rbd的名称
image: rbda
# 用户是admin,因为我们是拷贝master1-admin的配置信息
user: admin
# 要使用的secret,相当于使用哪个token去访问rbd
secretRef:
name: ceph-secret
# rdb要格式化为xfs文件系统
fsType: xfs
# 非只读
readOnly: false
4.4.2、执行
kubectl apply -f /root/ceph/pv.yaml
# 查看
kubectl get pv
4.5、创建ceph pvc
- 在k8s的master1上操作
4.5.1、脚本
# 创建对应的目录
mkdir -p /root/ceph/
vi /root/ceph/pvc.yaml
内容
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
# 定义pvc的名称
name: ceph-pvc
spec:
# 定义pvc的访问模式为:单节点读写
accessModes:
- ReadWriteOnce
# 定义要使用的资源
resources:
requests:
storage: 1Gi
4.5.2、执行
kubectl apply -f /root/ceph/pvc.yaml
# 查看
kubectl get pvc
可以看到pvc已经和pv进行绑定了,对应的pv名称为ceph-pv
4.6、挂载使用
在master1上操作
4.6.1、脚本
# 创建对应的目录
mkdir -p /root/ceph/
vi /root/ceph/pod.yaml
内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1 # tells deployment to run 2 pods matching the template
# 选择器
selector:
# 选择器匹配的标签
matchLabels:
app: nginx
template: # create pods using pod definition in this template
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
# 引用的数据卷
volumeMounts:
- mountPath: "/ceph-data"
name: ceph-data
# 定义数据卷
volumes:
# 数据卷名称
- name: ceph-data
# 定义使用哪个pvc
persistentVolumeClaim:
# pvc的名称
claimName: ceph-pvc
4.6.2、执行
kubectl apply -f /root/ceph/pod.yaml
# 查看
kubectl get pods
如果是running则运行正常
5、基于storageclass生成pv
参考资料
https://github.com/kubernetes-incubator/external-storage/tree/master/ceph/rbd/deploy/rbac
5.1、创建rbd的provisioner
- 在master1上操作
- 创建一个storageclass的供应商
5.1.1、脚本
vi /root/ceph/rbd-provisioner.yaml
内容
# 创建sa账号,名称为rbd-provisioner
apiVersion: v1
kind: ServiceAccount
metadata:
name: rbd-provisioner
---------
# rabc授权
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"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
----------
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
---------
# 部署pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: rbd-provisioner
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
5.1.2、执行
kubectl apply -f /root/ceph/rbd-provisioner.yaml
# 查看
kubectl get pods
5.2、创建ceph-secret
4.2、中,我们有创建ceph的secret,这里我们需要删掉,再重新建
kubectl delete -f /root/ceph/ceph-secret.yaml
5.2.1、脚本
vi /root/ceph/ceph-secret.yaml
内容
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
type: "ceph.com/rbd"
data:
key: QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==
5.2.2、执行
kubectl apply -f /root/ceph/ceph-secret.yaml
# 查看
kubectl get Secret
5.3、创建storageclass
5.3.1、脚本
vi /root/ceph/storageclass.yaml
内容
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
# 存储类名称
name: k8s-rbd
# 存储类供应商
provisioner: ceph.com/rbd
# 参数
parameters:
# rbd监控节点,如果有多个,就写多个
monitors: 192.168.187.157:6789
# adminid 是admin,因为我们是拷贝master1-admin的配置信息
adminId: admin
# 使用访问ceph集群的token
adminSecretName: ceph-secret
pool: k8stest
# userId 是admin,因为我们是拷贝master1-admin的配置信息
userId: admin
# 使用访问ceph集群的token
userSecretName: ceph-secret
# rdb要格式化为xfs文件系统
fsType: xfs
# rbd 的格式
imageFormat: "2"
# rbd 的特性
imageFeatures: "layering"
5.3.2、执行
kubectl apply -f /root/ceph/storageclass.yaml
# 查看
kubectl get sc
5.4、创建pvc
5.4.1、脚本
vi /root/ceph/rbd-pvc.yaml
内容
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: rbd-pvc
spec:
# 访问模式:读写单节点
accessModes:
- ReadWriteOnce
# 卷模式:文件系统
volumeMode: Filesystem
# 资源设置
resources:
requests:
storage: 1Gi
# 使用的存储类是k8s-rbd
storageClassName: k8s-rbd
5.4.2、执行
kubectl apply -f /root/ceph/rbd-pvc.yaml
# 查看
kubectl get pvc
kubectl get pv
5.5、创建pod
测试:使用pvc来创建pod
5.5.1、脚本
vi /root/ceph/pod-sto.yaml
内容
apiVersion: v1
kind: Pod
metadata:
labels:
test: rbd-pod
name: ceph-rbd-pod
spec:
containers:
- name: ceph-rbd-nginx
image: nginx
volumeMounts:
- name: ceph-rbd
mountPath: /mnt
readOnly: false
# 定义存储卷
volumes:
- name: ceph-rbd
# 定义要使用哪个pvc
persistentVolumeClaim:
claimName: rbd-pvc
5.5.2、执行
kubectl apply -f /root/ceph/pod-sto.yaml
# 查看
kubectl get pods
6、创建statefulset,动态生成存储
需要完成上面的第(2)、(3)、(4)、(5)、(6)步
6.1、脚本
vi /root/ceph/statefulset-storage.yaml
内容
apiVersion: v1
kind: Service
metadata:
# Service 名称
name: storage
# Service 标签
labels:
la: storage
spec:
# Service 端口
ports:
- port: 80
name: nginx-port
clusterIP: None
# 选择器匹配的标签
selector:
la: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
# StatefulSet的名称
name: storage
spec:
# 使用名称为storage的service
serviceName: "storage"
replicas: 2
# 选择器
selector:
# 选择器匹配的标签
matchLabels:
la: nginx
# 定义模板
template:
metadata:
labels:
la: nginx
# 定义容器
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: nginx-port
# 定义挂载
volumeMounts:
# 使用 存储卷模板名称
- name: www
# 定义挂载点
mountPath: /usr/share/nginx/html
# 定义存储卷模板
volumeClaimTemplates:
- metadata:
# 存储卷模板名称
name: www
spec:
# 定义pvc的访问模式
accessModes: [ "ReadWriteOnce" ]
# 卷模式:文件系统
volumeMode: Filesystem
# 使用哪个存储类
storageClassName: k8s-rbd
# 定义pvc的大小
resources:
requests:
storage: 1G
6.2、执行
kubectl apply -f /root/ceph/statefulset-storage.yaml
执行上面命令后,会自动生成pv和pvc,且完成pvc和pv的绑定
6.3、查看
kubectl get pvc
kubectl get pv
kubectl get svc
kubectl get StatefulSet
kubectl get pods
更多推荐
已为社区贡献55条内容
所有评论(0)