设为首页 收藏本站
查看: 1216|回复: 0

[经验分享] Kubernetes使用Glusterfs做存储持久化

[复制链接]

尚未签到

发表于 2018-9-15 12:03:25 | 显示全部楼层 |阅读模式
GlusterFS
  GlusterFS是一个开源的横向扩展文件系统。这些示例提供有关如何允许容器使用GlusterFS卷的信息。
  该示例假定您已经设置了GlusterFS服务器集群,并且已准备好在容器中使用正在运行的GlusterFS卷。
  先决条件
  Kubernetes集群已经搭建好。
  Glusterfs集群的安装
  环境介绍
  OS系统:Centos 7.x
  Glusterfs两个节点:192.168.22.21,192.168.22.22


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

  

# 先安装 gluster 源  
[root@k8s-glusterfs-01 ~]# yum install centos-release-gluster -y
  

  
# 安装 glusterfs 组件
  
[root@k8s-glusterfs-01 ~]# yum install -y glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma glusterfs-geo-replication glusterfs-devel
  

  
##创建 glusterfs 目录
  
[root@k8s-glusterfs-01 ~]# mkdir /opt/glusterd
  

  
# 修改 glusterd 目录
  
[root@k8s-glusterfs-01 ~]# sed -i 's/var\/lib/opt/g' /etc/glusterfs/glusterd.vol
  

  
# 启动 glusterfs
  
[root@k8s-glusterfs-01 ~]# systemctl start glusterd.service
  

  
# 设置开机启动
  
[root@k8s-glusterfs-01 ~]# systemctl enable glusterd.service
  

  
#查看状态
  
[root@k8s-glusterfs-01 ~]# systemctl status glusterd.service
  


  • 配置 glusterfs
  

[root@k8s-glusterfs-01 ~]# vi /etc/hosts  
192.168.22.21   k8s-glusterfs-01
  
192.168.22.22   k8s-glusterfs-02
  

  如果开启了防火墙则 开放端口
  
[root@k8s-glusterfs-01 ~]# iptables -I INPUT -p tcp --dport 24007 -j ACCEPT
  

  创建存储目录
  
[root@k8s-glusterfs-01 ~]# mkdir /opt/gfs_data
  

  添加节点到 集群 执行操作的本机不需要probe 本机
  
[root@k8s-master-01 ~]# gluster peer probe k8s-glusterfs-02
  

  
查看集群状态
  
[root@k8s-glusterfs-01 ~]# gluster peer status
  
Number of Peers: 1
  

  
Hostname: k8s-glusterfs-02
  
Uuid: b80f012b-cbb6-469f-b302-0722c058ad45
  
State: Peer in Cluster (Connected)
  


  • 配置 volume  GlusterFS 几种volume 模式说明
      1)、默认模式,既DHT, 也叫 分布卷: 将文件已hash算法随机分布到 一台服务器节点中存储。
      命令格式:gluster volume create test-volume server1:/exp1 server2:/exp2

  2)、复制模式,既AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中。
  命令格式:gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2
  3)、条带模式,既Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块,分别存储到 stripe x 个节点中 ( 类似raid 0 )。
  命令格式:gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2
  4)、分布式条带模式(组合型),最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型。
  命令格式:gluster volume create test-volume stripe 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
  5)、分布式复制模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 replica 2 server = 4 个节点:是DHT 与 AFR 的组合型。
  命令格式:gluster volume create test-volume replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
  6)、条带复制卷模式(组合型), 最少需要4台服务器才能创建。 创建volume 时 stripe 2 replica 2 server = 4 个节点: 是 Striped 与 AFR 的组合型。
  命令格式:gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4
  7)、三种模式混合, 至少需要8台 服务器才能创建。 stripe 2 replica 2 , 每4个节点 组成一个 组。
  命令格式:gluster volume create test-volume stripe 2 replica 2 transport tcp server1:/exp1 server2:/exp2 server3:/exp3 server4:/exp4 server5:/exp5 server6:/exp6 server7:/exp7 server8:/exp8
  

#创建GlusterFS磁盘:  
[root@k8s-glusterfs-01 ~]# gluster volume create models replica 2 k8s-glusterfs-01:/opt/gfs_data  k8s-glusterfs-02:/opt/gfs_data force
  
volume create: models: success: please start the volume to access data
  

# 查看volume状态  
[root@k8s-glusterfs-01 ~]# gluster volume info
  

  
Volume Name: k8s-volume
  
Type: Distribute

  
Volume>  
Status: Created
  
Snapshot Count: 0
  
Number of Bricks: 1 x 2 = 2
  
Transport-type: tcp
  
Bricks:
  
Brick1: k8s-glusterfs-01:/opt/gfs_data
  
Brick2: k8s-glusterfs-02:/opt/gfs_data
  
Options Reconfigured:
  
transport.address-family: inet
  
nfs.disable: on
  
performance.client-io-threads: off
  

  启动volume
  

# 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
      


客户端使用Glusterfs
  物理机上使用Gluster的volume
  

[root@k8s-master-01 ~]# yum install -y glusterfs glusterfs-fuse  
[root@k8s-master-01 ~]# mkdir -p /opt/gfsmnt
  
[root@k8s-master-01 ~]# mount -t glusterfs k8s-glusterfs-01:k8s-volume /opt/gfsmnt/
  

  
##df查看挂载状态:
  
[root@k8s-master-01 ~]# df -h |grep k8s-volume
  
k8s-glusterfs-01:k8s-volume   46G  1.6G   44G    4% /opt/gfsmnt
  

  

Kubernetes配置使用glusterfs:
  官方文档对配置过程进行了介绍:https://github.com/kubernetes/examples/blob/master/staging/volumes/glusterfs/README.md
  注:以下操作在kubernetes集群中任意一个可以执行kubectl的master上操作!


  •   第一步在Kubernetes中创建GlusterFS端点定义
      这是glusterfs-endpoints.json的片段:
      

    "{  
    "kind": "Endpoints",
      
    "apiVersion": "v1",
      
    "metadata": {
      
    "name": "glusterfs-cluster"
      
    },
      
    "subsets": [
      
    {
      "addresses": [
      {
      "ip": "192.168.22.21"
      }
      ],
      "ports": [
      {
      "port": 20
      }
      ]
      
    },
      
    {
      "addresses": [
      {
      "ip": "192.168.22.22"
      }
      ],
      "ports": [
      {
      "port": 20
      }
      ]
      
    }
      
    ]
      
    }
      

      备:该subsets字段应填充GlusterFS集群中节点的地址。可以在port字段中提供任何有效值(从1到65535)。

  

##创建端点:  
[root@k8s-master-01 ~]# kubectl create -f  glusterfs-endpoints.json
  

  
##验证是否已成功创建端点
  
[root@k8s-master-01 ~]# kubectl get ep |grep glusterfs-cluster
  
glusterfs-cluster   192.168.22.21:20,192.168.22.22:20
  


  • 配置 service  我们还需要为这些端点创建服务,以便它们能够持久存在。我们将在没有选择器的情况下添加此服务,以告知Kubernetes我们想要手动添加其端点
      

    [root@k8s-master-01 ]# cat glusterfs-service.json  
    {
      
    "kind": "Service",
      
    "apiVersion": "v1",
      
    "metadata": {
      
    "name": "glusterfs-cluster"
      
    },
      
    "spec": {
      
    "ports": [
      {"port": 20}
      
    ]
      
    }
      
    }

  ##创建服务
  

[root@k8s-master-01 ]# kubectl create -f  glusterfs-service.json  

  
##查看service
  
[root@k8s-master-01 ]# kubectl get service | grep glusterfs-cluster
  
glusterfs-cluster   ClusterIP   10.68.114.26           20/TCP    6m
  


  • 配置PersistentVolume(简称pv)
  创建glusterfs-pv.yaml文件,指定storage容量和读写属性
  

apiVersion: v1  
kind: PersistentVolume
  
metadata:
  name: pv001
  
spec:
  capacity:
  storage: 10Gi
  accessModes:
  - ReadWriteMany
  glusterfs:
  endpoints: "glusterfs-cluster"
  path: "k8s-volume"
  readOnly: false
  

  然后执行:
  

[root@k8s-master-01 ~]# kubectl create -f glusterfs-pv.yaml  
kubectl get pv
  
NAME      CAPACITY   ACCESS  MODES   RECLAIM POLICY   STATUS    CLAIM            STORAGECLASS   REASON    AGE
  
pv001      10Gi             RWX         Retain       Bound
  


  • 配置PersistentVolumeClaim(简称pvc)  创建glusterfs-pvc.yaml文件,指定请求资源大小
      

    apiVersion: v1  
    kind: PersistentVolumeClaim
      
    metadata:
      
    name: pvc001
      
    spec:
      
    accessModes:
      
    - ReadWriteMany
      
    resources:
      
    requests:
      storage: 2Gi

  执行:
  

[root@k8s-master-01 ~]# kubectl create -f glusterfs-pvc.yaml  

  
[root@k8s-master-01 ~]# kubectl get pvc
  
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  
pvc001    Bound     pv001     10Gi       RWX                           1h
  


  • 部署应用挂载pvc  以创建nginx,把pvc挂载到容器内的/usr/share/nginx/html文件夹为例:

  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
  ports:
  - containerPort: 80
  volumeMounts:
  - name: storage001
  mountPath: "/usr/share/nginx/html"
  volumes:
  - name: storage001
  persistentVolumeClaim:
  claimName: pvc001
  

  执行:
  

[root@k8s-master-01 ~]# kubectl create -f nginx_deployment.yaml  

  
查看nginx是否部署成功
  
[root@k8s-master-01 ~]# kubectl get pods
  
NAME                          READY     STATUS    RESTARTS   AGE
  
nginx-dm-5fbdb54795-77f7v     1/1       Running   0          1h
  
nginx-dm-5fbdb54795-rnqwd     1/1       Running   0          1h
  

  
查看挂载:
  
[root@k8s-master-01 ~]# kubectl exec -it nginx-dm-5fbdb54795-77f7v  -- df -h |grep k8s-volume
  
192.168.22.21:k8s-volume   46G  1.6G   44G   4% /usr/share/nginx/html
  

  
创建文件:
  
[root@k8s-master-01 ~]# kubectl exec -it nginx-dm-5fbdb54795-77f7v -- touch /usr/share/nginx/html/123.txt
  

  
查看文件属性:
  
[root@k8s-master-01 ~]# kubectl exec -it nginx-dm-5fbdb54795-77f7v -- ls -lt  /usr/share/nginx/html/123.txt
  
-rw-r--r-- 1 root root 0 Jul  9 06:25 /usr/share/nginx/html/123.txt
  

  

  再回到glusterfs的服务器的数据目录/opt/gfs_data查看是否有123.txt文件
  

##192.168.22.21上查看:  
[root@k8s-glusterfs-01 ~]# ls -lt /opt/gfs_data/
  
总用量 0
  
-rw-r--r-- 2 root root 0 7月   9 14:25 123.txt
  

  
##192.168.22.22上查看:
  
[root@k8s-glusterfs-02 ~]# ls -lt /opt/gfs_data/
  
总用量 0
  
-rw-r--r-- 2 root root 0 7月   9 14:25 123.txt
  

  至此部署完成。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-583466-1-1.html 上篇帖子: Kubernetes API Server原理 下篇帖子: kubernetes中部署Heketi和GlusterFS(二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表