k8s附加组件之存储-glusterfs

k8s附加组件之存储-glusterfs

2018/1/16

部署 glusterfs 集群

  • 初始化 glusterfs 集群
  • 创建 glusterfs 卷,用于保存数据
不做特别说明的,都在 67 上操作

集群节点

  • 10.10.9.67
  • 10.10.9.68
  • 10.10.9.69
初始化 glusterfs 集群
~]# yum install centos-release-gluster310 -y
~]# yum install glusterfs-server -y
~]# yum install xfsprogs -y

##### 准备磁盘:
~]# umount /data1
~]# mkfs.xfs -i size=512 -f /dev/vdc1
~]# mount /dev/vdc1 /data1
~]# vim /etc/fstab
### glusterfs
/dev/vdc1 /data1                       xfs    defaults        0 0

##### 启动服务:
~]# systemctl start glusterd && systemctl enable glusterd

##### 建立集群:
~]# gluster peer probe 10.10.9.68
~]# gluster peer probe 10.10.9.69
~]# gluster peer status

##### 在所有节点操作:
~]# mkdir /data1/glusterfs_data/gv0 -p && echo ‘### glusterfs data for k8s-dev only!‘ >/data1/glusterfs_data/README.md
创建 glusterfs 卷,用于保存数据
~]# gluster volume create gv0 replica 3 transport tcp 10.10.9.67:/data1/glusterfs_data/gv0 10.10.9.68:/data1/glusterfs_data/gv0 10.10.9.69:/data1/glusterfs_data/gv0
~]# gluster volume start gv0
~]# gluster volume info gv0

##### 在客户端上配置 glusterfs 环境并挂载测试
~]# yum install centos-release-gluster310 -y
~]# yum install glusterfs glusterfs-fuse -y
~]# mkdir /mnt/test
~]# mount -t glusterfs -o backup-volfile-servers=10.10.9.68:10.10.9.69 10.10.9.67:/gv0 /mnt/test
~]# df -h |grep test
10.10.9.67:/gv0  1.0T   33M  1.0T   1% /mnt/test
~]# umount /mnt/test

准备 k8s yaml 来使用 glusterfs 集群

  • 创建一个数据卷
  • 通过定义 endpoints 和 service 来提供访问外部服务(glusterfs集群)的方法
  • 通过定义 pv 和 pvc 来使用存储卷
  • 测试,在 deployment 中通过关联 pvc 来挂载卷
  • 测试,多副本读写同一个日志文件的场景
创建一个数据卷
[[email protected] glusterfs]# ls
10.endpoints  20.pv  30.pvc  bin  deploy_test

[[email protected] glusterfs]# cat bin/create-gv1-default.sh
#!/bin/bash
#

gluster volume create gv1-default replica 3 transport tcp 10.10.9.67:/data1/glusterfs_data/gv1-default 10.10.9.68:/data1/glusterfs_data/gv1-default 10.10.9.69:/data1/glusterfs_data/gv1-default
gluster volume start gv1-default
gluster volume info gv1-default
通过定义 endpoints 和 service 来提供访问外部服务(glusterfs集群)的方法
[[email protected] glusterfs]# cat 10.endpoints/glusterfs-r3/default.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs-r3
  namespace: default
subsets:
- addresses:
  - ip: 10.10.9.67
  - ip: 10.10.9.68
  - ip: 10.10.9.69
  ports:
  - port: 49152
    protocol: TCP

---
apiVersion: v1
kind: Service
metadata:
  name: glusterfs-r3
  namespace: default
spec:
  ports:
  - port: 49152
    protocol: TCP
    targetPort: 49152
  sessionAffinity: None
  type: ClusterIP

[[email protected] glusterfs]# kubectl apply -f 10.endpoints/glusterfs-r3/default.yaml

##### 查看状态:
[[email protected] glusterfs]# kubectl get ep glusterfs-r3
NAME           ENDPOINTS                                            AGE
glusterfs-r3   10.10.9.67:49152,10.10.9.68:49152,10.10.9.69:49152   4h
通过定义 pv 和 pvc 来使用存储卷
##### 注意:pv 是不区分 namespace 的资源,但又和不同 namespace 下的资源交互,此处有点奇怪,不知为何如此设计
[[email protected] glusterfs]# cat 20.pv/glusterfs-r3/gv1-default.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: glusterfs-r3-gv1-default
  labels:
    type: glusterfs
spec:
  storageClassName: gv1-default
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs-r3"
    path: "gv1-default"
    readOnly: false

[[email protected] glusterfs]# cat 30.pvc/glusterfs-r3/gv1-default.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: glusterfs-r3-gv1-default
  namespace: default
spec:
  storageClassName: gv1-default
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi

[[email protected] glusterfs]# kubectl apply -f 20.pv/glusterfs-r3/gv1-default.yaml
[[email protected] glusterfs]# kubectl apply -f 30.pvc/glusterfs-r3/gv1-default.yaml

##### 查看状态:
[[email protected] glusterfs]# kubectl get pv,pvc
NAME                               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                                        STORAGECLASS       REASON    AGE
pv/glusterfs-r3-gv1-default        100Gi      RWX            Retain           Bound     default/glusterfs-r3-gv1-default             gv1-default                  46m

NAME                           STATUS    VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc/glusterfs-r3-gv1-default   Bound     glusterfs-r3-gv1-default   100Gi      RWX            gv1-default    44m
测试,在 deployment 中通过关联 pvc 来挂载卷
[[email protected] glusterfs]# cat deploy_test/gv1-default-t1.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: gv1-default-t1
  namespace: default
  labels:
    app.name: gv1-default-t1
spec:
  replicas: 1
  selector:
    matchLabels:
      app.name: gv1-default-t1
  template:
    metadata:
      labels:
        app.name: gv1-default-t1
    spec:
      containers:
      - name: nginx-test
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: glusterfsvol
          mountPath: "/mnt/glusterfsvol"
      volumes:
      - name: glusterfsvol
        persistentVolumeClaim:
          claimName: glusterfs-r3-gv1-default

[[email protected] glusterfs]# kubectl apply -f deploy_test/gv1-default-t1.yaml --record

##### 查看状态:
[[email protected] glusterfs]# kubectl get deploy,po
NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/gv1-default-t1   1         1         1            1           33s

NAME                                 READY     STATUS    RESTARTS   AGE
po/gv1-default-t1-848455b8b6-fldkb   1/1       Running   0          33s

##### 验证挂载的数据盘:
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- mount | grep gluster
10.10.9.67:gv1-default on /mnt/glusterfsvol type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- df -h | grep glusterfsvol
10.10.9.67:gv1-default  1.0T   33M  1.0T   1% /mnt/glusterfsvol

[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- ls -l /mnt/glusterfsvol
total 0

##### 读写测试:
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- sh -c ‘echo " [$(date)] writeFrom: $(hostname)" >>/mnt/glusterfsvol/README.md‘

[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- cat /mnt/glusterfsvol/README.md
 [Tue Jan 16 09:50:01 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-fldkb
 [Tue Jan 16 09:50:40 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-fldkb

##### 符合预期
测试,多副本读写同一个日志文件的场景
##### 之前测试的都是 1 个 pod 副本的场景,现在,我们扩容到 3 个副本,然后再看看读写状况:
  replicas: 1
  ->
  replicas: 3
[[email protected] glusterfs]# kubectl scale --replicas=3 -f deploy_test/gv1-default-t1.yaml

##### 查看状态:
[[email protected] glusterfs]# kubectl get deploy,po
NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/gv1-default-t1   3         3         3            3           20m

NAME                                 READY     STATUS    RESTARTS   AGE
po/gv1-default-t1-848455b8b6-fldkb   1/1       Running   0          20m
po/gv1-default-t1-848455b8b6-gzd4s   1/1       Running   0          1m
po/gv1-default-t1-848455b8b6-t6bsk   1/1       Running   0          1m

##### 分别在 3 个 pod 中往同一个文件写入一条数据
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- sh -c ‘echo " [$(date)] writeFrom: $(hostname)" >>/mnt/glusterfsvol/README.md‘
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-gzd4s -- sh -c ‘echo " [$(date)] writeFrom: $(hostname)" >>/mnt/glusterfsvol/README.md‘
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-t6bsk -- sh -c ‘echo " [$(date)] writeFrom: $(hostname)" >>/mnt/glusterfsvol/README.md‘

##### 验证:
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-fldkb -- cat /mnt/glusterfsvol/README.md
 [Tue Jan 16 09:50:01 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-fldkb
 [Tue Jan 16 09:50:40 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-fldkb
 [Tue Jan 16 09:55:53 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-fldkb
 [Tue Jan 16 09:55:59 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-gzd4s
 [Tue Jan 16 09:56:04 UTC 2018] writeFrom: gv1-default-t1-848455b8b6-t6bsk

##### 符合预期,但有一个细节请注意,,如何合理的记录日志以便于区分某条记录是来自哪一个 pod 实例?
##### 答案是:写入日志时,业务层应提取类似 hostname 那样的标志符来写入日志中
[[email protected] glusterfs]# kubectl exec gv1-default-t1-848455b8b6-t6bsk -- hostname
gv1-default-t1-848455b8b6-t6bsk
如何快速的为指定 namespace 部署一个 volume

##### 目标:
##### namespace=ns-test1

##### 准备:
cp -a bin/create-gv1-default.sh bin/create-gv1-ns-test1.sh
sed -i ‘s/default/ns-test1/g‘ bin/create-gv1-ns-test1.sh
sh bin/create-gv1-ns-test1.sh

cp -a 10.endpoints/glusterfs-r3/default.yaml 10.endpoints/glusterfs-r3/ns-test1.yaml
sed -i ‘s/default/ns-test1/g‘ 10.endpoints/glusterfs-r3/ns-test1.yaml

cp -a 20.pv/glusterfs-r3/gv1-default.yaml 20.pv/glusterfs-r3/gv1-ns-test1.yaml
sed -i ‘s/default/ns-test1/g‘ 20.pv/glusterfs-r3/gv1-ns-test1.yaml

cp -a 30.pvc/glusterfs-r3/gv1-default.yaml 30.pvc/glusterfs-r3/gv1-ns-test1.yaml
sed -i ‘s/default/ns-test1/g‘ 30.pvc/glusterfs-r3/gv1-ns-test1.yaml

cp -a deploy_test/gv1-default-t1.yaml deploy_test/gv1-ns-test1-t1.yaml
sed -i ‘s/default/ns-test1/g‘ deploy_test/gv1-ns-test1-t1.yaml

##### 部署:
kubectl apply -f 10.endpoints/glusterfs-r3/ns-test1.yaml
kubectl apply -f 20.pv/glusterfs-r3/gv1-ns-test1.yaml
kubectl apply -f 30.pvc/glusterfs-r3/gv1-ns-test1.yaml
kubectl apply -f deploy_test/gv1-ns-test1-t1.yaml

##### 验证:
[[email protected] glusterfs]# kubectl -n ns-test1 get ep,svc |grep ‘glusterfs-r3‘
ep/glusterfs-r3                   10.10.9.67:49152,10.10.9.68:49152,10.10.9.69:49152   2m

svc/glusterfs-r3                   ClusterIP   10.107.81.35     <none>        49152/TCP        2m

[[email protected] glusterfs]# kubectl -n ns-test1 get pv,pvc |grep ‘ns-test1‘
pv/glusterfs-r3-gv1-ns-test1       100Gi      RWX            Retain           Bound     ns-test1/glusterfs-r3-gv1-ns-test1           gv1-ns-test1                 2m

pvc/glusterfs-r3-gv1-ns-test1   Bound     glusterfs-r3-gv1-ns-test1   100Gi      RWX            gv1-ns-test1   2m

[[email protected] glusterfs]# kubectl -n ns-test1 get deploy,po |grep ‘ns-test1‘

deploy/gv1-ns-test1-t1                1         1         1            1           3m
po/gv1-ns-test1-t1-7f986bfbf8-v5zmz               1/1       Running   0          3m

[[email protected] glusterfs]# kubectl -n ns-test1 exec gv1-ns-test1-t1-7f986bfbf8-v5zmz -- df -h |grep gluster
10.10.9.67:gv1-ns-test1  1.0T   36M  1.0T   1% /mnt/glusterfsvol

ZYXW、参考

  1. glusterfs
  2. CentOS Storage
  3. k8s-glusterfs
  4. 使用glusterfs做持久化存储

原文地址:http://blog.51cto.com/nosmoking/2062906

时间: 2024-10-01 05:00:02

k8s附加组件之存储-glusterfs的相关文章

k8s附加组件之UI-如何使用dashboard

k8s附加组件之UI-如何使用dashboard 2018/1/4 准备 kubernetes-dashboard 所需资源 [[email protected] ~]# mkdir -p ~/k8s_install/master/ui [[email protected] ~]# cd !$ [[email protected] ui]# curl -s -o c https://raw.githubusercontent.com/kubernetes/dashboard/master/src

[Firefox_附加组件]_001_入门

附加组件可为基于 Gecko 的应用程序(例如 Firefox.SeaMonkey 和 Thunderbird)添加新功能.附加组件有两种主要类型:扩展(可为应用程序新添功能),主题(改应用程序的外观) 1.附加组件有三种不同的创建扩展的方式: 基于 Add-on SDK 的方式 (使用一组高级别的 JavaScript APIs 开发无需重启的扩展.推荐使用) 无需重启扩展的方式 (手动创建无需重启的扩展) 传统方式 (使用 overly 的方式创建传统的扩展) 2.基于 Add-on SDK

解决火狐浏览器安装不上Selenium IDE插件“此附加组件无法安装”

(摘自http://blog.sina.com.cn/s/blog_14eea47cb0102w25n.html) 解决火狐浏览器安装不上Selenium IDE插件“此附加组件无法安装” 1.打开火狐浏览器,安装插件有如下提示 2.浏览器输入“about:config”,提示这样可能会失去质保,点击”我保证会小心“ 3.找到此项 4. 双击,即可改为关闭,这样就可以安装插件了

Firefox 附加组件

Firefox下载页面: https://www.mozilla.org/en-US/firefox/all/选择列表中的“Chinese (Simplified) 中文 (简体)”下载. FTP服务器: Firefox 37.0.1 位置:ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/37.0.1/ Firefox 38 beta 4 位置:ftp://ftp.mozilla.org/pub/mozilla.org/firefox

k8s监控组件heapster安装部署

k8s监控组件heapster安装部署 参考文档 https://github.com/kubernetes/heapster/tree/master/deploy k8s集群安装部署 http://jerrymin.blog.51cto.com/3002256/1898243  k8s集群RC.SVC.POD部署 http://jerrymin.blog.51cto.com/3002256/1900260     k8s集群组件kubernetes-dashboard和kube-dns部署 h

推荐一些我所用的firefox 附加组件。

firefox之所以强大,很大程度上是因为它有着超多的扩展组件,来实现许多有趣的功能.这几天把我装的firefox附加组件整理下,个人认为是一般上网常用或者可以说是必备的组件,o(∩_∩)o ,晒晒.文中所提到的组件都可以在https://addons.mozilla.org/zh-CN/firefox/上找到. 1.IE Tab(必备): 在中国,仅支持ie内核的网站还是非常多的,对于这些ie only的网站,firefox是无法正常打开的,所以这个是一定要装的. 点击下ie tab,可以直接

火狐浏览器怎么安装未经认证的附加组件

在电脑系统中使用火狐浏览器时,我们经常会添加各种插件来完善浏览器的使用功能.但是有用户在火狐浏览器中添加插件,却提示“此附加组件无法安装,因为它未经验证”.对于这样的问题,我们不妨先参考下面的方法,看看能否解决问题. 1.打开火狐浏览器,在地址栏中输入about:config并回车,点击我保证小心,进入设置界面 2找到xpinstall.signatures.required,并右击选择“切换”,改成false即可 3.切换后,重启浏览器,再直接将XPI插件拖进窗口即可安装. 当电脑添加火狐浏览

k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

kubernetes实战(九):k8s集群动态存储管理GlusterFS及容器化GlusterFS扩容

1.准备工作 所有节点安装GFS客户端 yum install glusterfs glusterfs-fuse -y 如果不是所有节点要部署GFS管理服务,就在需要部署的节点上打上标签 [[email protected] ~]# kubectl label node k8s-node01 storagenode=glusterfs node/k8s-node01 labeled [[email protected]-master01 ~]# kubectl label node k8s-no