• 14-使用glusterfs做持久化存储


    使用glusterfs做持久化存储

    我们复用kubernetes的三台主机做glusterfs存储。

    以下步骤参考自:https://www.xf80.com/2017/04/21/kubernetes-glusterfs/

    安装glusterfs

    我们直接在物理机上使用yum安装,如果你选择在kubernetes上安装,请参考:https://github.com/gluster/gluster-kubernetes/blob/master/docs/setup-guide.md

    # 先安装 gluster 源
    $ yum install centos-release-gluster -y
    
    # 安装 glusterfs 组件
    $ yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma glusterfs-geo-replication glusterfs-devel
    
    ## 创建 glusterfs 目录
    $ mkdir /opt/glusterd
    
    ## 修改 glusterd 目录
    $ sed -i 's/var/lib/opt/g' /etc/glusterfs/glusterd.vol
    
    # 启动 glusterfs
    $ systemctl start glusterd.service
    
    # 设置开机启动
    $ systemctl enable glusterd.service
    
    #查看状态
    $ systemctl status glusterd.service
    

    配置 glusterfs

    # 配置 hosts
    
    可选
    $ vi /etc/hosts
    192.168.1.121   node1
    192.168.1.122   node2
    192.168.1.123   node3
    
    # 开放端口
    $ iptables -I INPUT -p tcp --dport 24007 -j ACCEPT
    
    # 创建存储目录
    $ mkdir /opt/gfs_data
    
    # 添加节点到 集群
    # 执行操作的本机不需要probe 本机
    gluster peer probe 192.168.1.122
    gluster peer probe 192.168.1.123
    
    # 查看集群状态
    $ gluster peer status
    Number of Peers: 2
    
    Hostname: 192.168.1.122
    Uuid: 702113c2-2393-4187-9d7d-921f106f595e
    State: Peer in Cluster (Connected)
    
    Hostname: 192.168.1.123
    Uuid: 702113c2-2393-4187-9d7d-921f106f595a
    State: Peer in Cluster (Connected)
    
    

    配置 volume

    GlusterFS中的volume的模式有很多中,包括以下几种:

    • 分布卷(默认模式):即DHT, 也叫 分布卷: 将文件已hash算法随机分布到 一台服务器节点中存储。
    • 复制模式:即AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中。
    • 条带模式:即Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块,分别存储到 stripe x 个节点中 ( 类似raid 0 )。
    • 分布式条带模式:最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型。
    • 分布式复制模式:最少需要4台服务器才能创建。 创建volume 时 replica 2 server = 4 个节点:是DHT 与 AFR 的组合型。
    • 条带复制卷模式:最少需要4台服务器才能创建。 创建volume 时 stripe 2 replica 2 server = 4 个节点: 是 Striped 与 AFR 的组合型。
    • 三种模式混合: 至少需要8台 服务器才能创建。 stripe 2 replica 2 , 每4个节点 组成一个 组。

    这几种模式的示例图参考:CentOS7安装GlusterFS

    因为我们只有三台主机,在此我们使用默认的分布卷模式请勿在生产环境上使用该模式,容易导致数据丢失。

    # 创建分布卷
    $ gluster volume create k8s-volume transport 192.168.1.121:/opt/gfs_data 192.168.1.122:/opt/gfs_data 192.168.1.123:/opt/gfs_data force
    
    # 查看volume状态
    $ gluster volume info
    Volume Name: k8s-volume
    Type: Distribute
    Volume ID: 9a3b0710-4565-4eb7-abae-1d5c8ed625ac
    Status: Created
    Snapshot Count: 0
    Number of Bricks: 3
    Transport-type: tcp
    Bricks:
    Brick1: 192.168.1.121:/opt/gfs_data
    Brick2: 192.168.1.122:/opt/gfs_data
    Brick3: 192.168.1.123:/opt/gfs_data
    Options Reconfigured:
    transport.address-family: inet
    nfs.disable: on
    
    # 启动 分布卷
    $ gluster volume start k8s-volume
    

    Glusterfs调优

    # 开启 指定 volume 的配额
    $ gluster volume quota k8s-volume enable
    
    # 限制 指定 volume 的配额
    $ gluster volume quota k8s-volume limit-usage / 1TB
    
    # 设置 cache 大小, 默认32MB
    $ gluster volume set k8s-volume performance.cache-size 4GB
    
    # 设置 io 线程, 太大会导致进程崩溃
    $ gluster volume set k8s-volume performance.io-thread-count 16
    
    # 设置 网络检测时间, 默认42s
    $ gluster volume set k8s-volume network.ping-timeout 10
    
    # 设置 写缓冲区的大小, 默认1M
    $ gluster volume set k8s-volume performance.write-behind-window-size 1024MB
    

    Kubernetes中配置glusterfs

    官方的文档见:https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/glusterfs

    以下用到的所有yaml和json配置文件可以在glusterfs中找到。注意替换其中私有镜像地址为你自己的镜像地址。

    kubernetes安装客户端

    # 在所有 k8s node 中安装 glusterfs 客户端
    
    $ yum install -y glusterfs glusterfs-fuse
    
    # 配置 hosts
    
    $ vi /etc/hosts
    
    192.168.1.121   node1
    192.168.1.122   node2
    192.168.1.123   node3
    

    因为我们glusterfs跟kubernetes集群复用主机,因为此这一步可以省去。

    配置 endpoints

    $ curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/master/examples/volumes/glusterfs/glusterfs-endpoints.json
    
    # 修改 endpoints.json ,配置 glusters 集群节点ip
    # 每一个 addresses 为一个 ip 组
    {
      "kind": "Endpoints",
      "apiVersion": "v1",
      "metadata": {
        "name": "glusterfs-cluster"
      },
      "subsets": [
        {
          "addresses": [
            {
              "ip": "192.168.1.121"
            }
          ],
          "ports": [
            {
              "port": 1990
            }
          ]
        },
        {
          "addresses": [
            {
              "ip": "192.168.1.122"
            }
          ],
          "ports": [
            {
              "port": 1990
            }
          ]
        },
    	{
          "addresses": [
            {
              "ip": "192.168.1.123"
            }
          ],
          "ports": [
            {
              "port": 1990
            }
          ]
        },
      ]
    }
    
    
    # 导入 glusterfs-endpoints.json
    
    $ kubectl apply -f glusterfs-endpoints.json
    
    # 查看 endpoints 信息
    $ kubectl get ep
    

    配置 service

    $ curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/master/examples/volumes/glusterfs/glusterfs-service.json
    
    # service.json 里面查找的是 enpointes 的名称与端口,端口默认配置为 1,我改成了1990
    
    # 导入 glusterfs-service.json
    $ kubectl apply -f glusterfs-service.json
    
    # 查看 service 信息
    $ kubectl get svc
    

    创建测试 pod

    $ curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/master/examples/volumes/glusterfs/glusterfs-pod.json
    
    # 编辑 glusterfs-pod.json
    # 修改 volumes  下的 path 为上面创建的 volume 名称
    
    "path": "k8s-volume"
    
    # 导入 glusterfs-pod.json
    $ kubectl apply -f glusterfs-pod.json
    
    # 查看 pods 状态
    $ kubectl get pods               
    NAME                             READY     STATUS    RESTARTS   AGE
    glusterfs                        1/1       Running   0          1m
    
    # 查看 pods 所在 node
    $ kubectl describe pods/glusterfs
    
    # 登陆 node 物理机,使用 df 可查看挂载目录
    $ df -h
    192.168.1.121:k8s-volume 1073741824        0 1073741824   0% 192.168.1.121:k8s-volume  1.0T     0  1.0T   0% /var/lib/kubelet/pods/3de9fc69-30b7-11e7-bfbd-8af1e3a7c5bd/volumes/kubernetes.io~glusterfs/glusterfsvol
    

    配置PersistentVolume

    PersistentVolume(PV)和 PersistentVolumeClaim(PVC)是kubernetes提供的两种API资源,用于抽象存储细节。管理员关注于如何通过pv提供存储功能而无需关注用户如何使用,同样的用户只需要挂载PVC到容器中而不需要关注存储卷采用何种技术实现。

    PVC和PV的关系跟pod和node关系类似,前者消耗后者的资源。PVC可以向PV申请指定大小的存储资源并设置访问模式。

    **PV属性 **

    • storage容量
    • 读写属性:分别为ReadWriteOnce:单个节点读写; ReadOnlyMany:多节点只读 ; ReadWriteMany:多节点读写
    $ cat glusterfs-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gluster-dev-volume
    spec:
      capacity:
        storage: 8Gi
      accessModes:
        - ReadWriteMany
      glusterfs:
        endpoints: "glusterfs-cluster"
        path: "k8s-volume"
        readOnly: false
    
    # 导入PV
    $ kubectl apply -f glusterfs-pv.yaml
    
    # 查看 pv
    $ kubectl get pv
    NAME                 CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                     STORAGECLASS   REASON    AGE
    gluster-dev-volume   8Gi        RWX           Retain          Bound     default/glusterfs-nginx                            16h
    
    

    PVC属性

    • 访问属性与PV相同
    • 容量:向PV申请的容量 <= PV总容量

    配置PVC

    $ cat glusterfs-pvc.yaml
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: glusterfs-nginx
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 8Gi
    
    # 导入 pvc
    $ kubectl apply -f glusterfs-pvc.yaml
    
    # 查看 pvc
    
    $ kubectl get pvc
    NAME              STATUS    VOLUME               CAPACITY   ACCESSMODES   STORAGECLASS   AGE
    glusterfs-nginx   Bound     gluster-dev-volume   8Gi        RWX                          4s
    

    创建 nginx deployment 挂载 volume

    $ vi nginx-deployment.yaml
    apiVersion: extensions/v1beta1 
    kind: Deployment 
    metadata: 
      name: nginx-dm
    spec: 
      replicas: 2
      template: 
        metadata: 
          labels: 
            name: nginx 
        spec: 
          containers: 
            - name: nginx 
              image: nginx
              imagePullPolicy: IfNotPresent
              ports: 
                - containerPort: 80
              volumeMounts:
                - name: gluster-dev-volume
                  mountPath: "/usr/share/nginx/html"
          volumes:
          - name: gluster-dev-volume
            persistentVolumeClaim:
              claimName: glusterfs-nginx
    
    # 导入 deployment
    $ kubectl apply -f nginx-deployment.yaml 
    
    # 查看 deployment
    $ kubectl get pods |grep nginx-dm
    nginx-dm-3698525684-g0mvt       1/1       Running   0          6s
    nginx-dm-3698525684-hbzq1       1/1       Running   0          6s
    
    # 查看 挂载
    $ kubectl exec -it nginx-dm-3698525684-g0mvt -- df -h|grep k8s-volume
    192.168.1.121:k8s-volume         1.0T     0  1.0T   0% /usr/share/nginx/html
    
    # 创建文件 测试
    $ kubectl exec -it nginx-dm-3698525684-g0mvt -- touch /usr/share/nginx/html/index.html
    
    $ kubectl exec -it nginx-dm-3698525684-g0mvt -- ls -lt /usr/share/nginx/html/index.html
    -rw-r--r-- 1 root root 0 May  4 11:36 /usr/share/nginx/html/index.html
    
    # 验证 glusterfs
    # 因为我们使用分布卷,所以可以看到某个节点中有文件
    $ ls /opt/gfs_data/
    $ ls /opt/gfs_data/
    index.html
    $ ls /opt/gfs_data/
    

    参考

    在kubernetes中安装glusterfs

    CentOS 7 安装 GlusterFS

    GlusterFS with kubernetes

  • 相关阅读:
    Linux基础命令总结
    在Linux服务器上配置phpMyAdmin
    nginx配置301重定向
    nginx服务器设置url的优雅链接
    nginx服务器绑定域名和设置根目录的方法
    VMware ESXi客户端连接控制台时提示"VMRC控制台连接已断开...正在尝试重新连接"的解决方法
    搭建Solr集群的推荐方案
    汉语-成语:少不更事
    汉语-成语:老成持重
    汉语-成语:少年老成
  • 原文地址:https://www.cnblogs.com/guigujun/p/8366558.html
Copyright © 2020-2023  润新知