k8s–基础–28.5–ceph–k8s对接ceph rbd


1、介绍

1.1、kubernetes支持的后端存储接口

在这里插入图片描述

1.2、kubernetes pv和pvc绑定流程

  1. 创建pv:pv需要指定后端存储类型
  2. 创建pvc:指定需要的资源
  3. pvc和pv绑定
  4. pod挂载pvc实现持久化存储

1.3、kubernetes storageclass存储类动态生成pv流程

  1. 创建storageclass(sc)
  2. 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值

  1. 获取client.admin的keyring值,并用base64编码,我们使用这个值来创建k8s secret对象
    1. 可以认为client.admin就是访问ceph管理节点的token
  2. 在master1-admin(ceph管理节点)操作
ceph auth get-key client.admin | base64
# 内容如下
# QVFEcmtkNWlGYTBqQVJBQUhvY1VPR05WUFFGbFdUTmxiUmdObEE9PQ==

4.2、创建ceph的secret

  1. 这个secre 用于k8s volume插件访问ceph集群
  2. 在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

  1. 在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

  1. 在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

  1. 在master1上操作
  2. 创建一个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



在这里插入图片描述

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐