Kubernetes存儲——glusterfs(集群)


一、搭建 glusterfs(集群)版本:gluster-9

1.1 服務器規划

master(k8s集群) node1(k8s集群) node2(k8s集群)
192.168.99.201 192.168.99.202 192.168.99.203
glusterfs 服務端 glusterfs 服務端 glusterfs 服務端 glusterfs 服務端
192.168.99.204 192.168.99.205 192.168.99.206 192.168.99.207

1.2 環境准備

glusterfs 服務端 + 客戶端配glusterfs官方yum源

$ yum install centos-release-gluster -y

glusterfs 服務端

$ yum install glusterfs-server -y
# 所有服務端節點安裝glusterfs-server
$ systemctl enable glusterd --now
$ systemctl status glusterd
# 4個storage服務器建立連接不用兩兩連接,只需要找其中1個,連接另外3個各一次就OK了

# 這里在storage-01上操作
[root@storage-01 ~]# gluster peer probe storage-02
[root@storage-01 ~]# gluster peer probe storage-03
[root@storage-01 ~]# gluster peer probe storage-04

$ gluster peer status
# 在所有服務端上都可以使用該命令來驗證檢查

注意:

  • 如果這一步建立連接有問題(一般問題會出現在網絡連接、防火牆、selinux、主機名綁定等)
  • 如果想重做這一步,可以使用gluster peer detach xxxxx [force] 來斷開連接,重新做

所有storage服務器准備存儲目錄(可以用單獨的分區,也可以使用根分區)

# 這里的storage服務器沒有准備額外的硬盤,所以這里用根分區來做實驗
但生產環境肯定是不建議數據盤和系統盤在一起的

$ mkdir -p /data/gv0

1.3 gluster模式

1.3.1 replica模式
$ gluster volume create gv0 replica 4 storage-01:/data/gv0/ storage-02:/data/gv0/ storage-03:/data/gv0/ storage-04:/data/gv0/ force

$ gluster volume info gv0
$ gluster volume start gv0
$ gluster volume info gv0

glusterfs 客戶端

replica卷測試(讀寫測試)

這里直接使用(k8s集群)node01 + node02 來測試

$ yum install centos-release-gluster -y
$ yum install glusterfs glusterfs-fuse -y
[root@k8s-node01 ~]# mkdir /test1

# 掛載前需要解析(配置/etc/hosts)
[root@k8s-node01 ~]# mount -t glusterfs storage-01:/gv0 /test1
[root@k8s-node01 ~]# df -h | tail -1

客戶端也需要在/etc/hosts文件里綁定存儲節點的主機名,才可以掛載

這里client是掛載storage-01,也可以掛載storage-02,storage-03任意一個。(也就是說這3個storage 既是老板,又是員工。這是glusterfs的一個特點,其它的分布式存儲軟件基本上都會有專門的管理server)

在客戶端使用dd命令往掛載目錄里寫文件,然后查看在storage服務器上的分布情況!

$ dd if=/dev/zero of=/test1/file1 bs=1M count=100

讀寫操作請都在客戶端進行,不要在storage服務器上操作

讀寫測試結果:結果類似raid1

同讀同寫測試:兩個(多個)客戶端掛載后實現同讀同寫(文件存儲類型的特點)!

[root@k8s-node02 ~]# mkdir /test2

# 掛載前需要解析(配置/etc/hosts)
[root@k8s-node02 ~]# mount -t glusterfs storage-01:/gv0 /test2
[root@k8s-node02 ~]# df -h | tail -1

[root@k8s-node02 ~]# dd if=/dev/zero of=/test2/file1 bs=1M count=100
[root@k8s-node01 ~]# rm /test1/* -rf
[root@k8s-node01 ~]# umount /test1

[root@k8s-node02 ~]# rm /test2/* -rf
[root@k8s-node02 ~]# umount /test2

在任意一個storage服務器上停止gv0並刪除,這里是在storage-01上操作!

[root@storage-01 ~]# gluster volume stop gv0
[root@storage-01 ~]# gluster volume delete gv0
[root@storage-01 ~]# gluster volume info
1.3.2 stripe模式(新版本已廢棄)

做成 stripe模式的卷(重點是命令里的 stripe 4參數)

$ gluster volume create gv0 stripe 4 storage-01:/data/gv0/ storage-02:/data/gv0/ storage-03:/data/gv0/ storage-04:/data/gv0/ force

讀寫測試結果:文件過小,不會平均分配給存儲節點。有一定大小的文件會平均分配。類似raid0。

1.3.3 distributed 模式

創建 distributed卷 gv1(不指定 replica 或 stripe 就默認是 distributed 的模式!

$ mkdir -p /data/gv1
$ gluster volume create gv1 storage-01:/data/gv1/ storage-02:/data/gv1/ storage-03:/data/gv1/ storage-04:/data/gv1/ force

$ gluster volume start gv1
$ gluster volume info gv1

# 客戶端掛載
$ mkdir /test1
$ mount -t glusterfs storage-01:/gv1 /test1

讀寫測試結果: 寫滿第一個存儲后,再寫第二個存儲(順序是隨機的)!

1.3.4 distributed-replica 模式
$ mkdir -p /data/gv2
$ gluster volume create gv2 replica 2 storage-01:/data/gv2/ storage-02:/data/gv2/ storage-03:/data/gv2/ storage-04:/data/gv2/ force

$ gluster volume start gv2
$ gluster volume info gv2

# 客戶端掛載
$ mkdir /test2
$ mount -t glusterfs storage-01:/gv2 /test2

讀寫測試結果:4個存儲先寫其中2個(並在這兩個存儲里鏡像),寫滿這兩個后, 再按相同方式寫另2個存儲。

1.3.5 disperse 模式
$ mkdir -p /data/gv3
$ gluster volume create gv3 disperse 4 storage-01:/data/gv3/ storage-02:/data/gv3/ storage-03:/data/gv3/ storage-04:/data/gv3/ force
# 注意:沒有指定冗余值,默認為1,按y確認

$ gluster volume start gv3
$ gluster volume info gv3
# Number of Bricks: 1 x (3 + 1) = 4 這里看到冗余數為1

# 客戶端掛載
$ mkdir /test3
$ mount -t glusterfs storage-01:/gv3 /test3

讀寫測試結果: 寫100M,每個存儲服務器上占33M左右。因為4個存儲1個為冗余(與raid5一樣)

1.3.6 在線裁減與在線擴容

在線裁減要看是哪一種模式的卷,比如 stripe 模式就不允許在線裁減。下面以distributed卷來做裁減與擴容!

在線裁減(注意要remove沒有數據的brick)

$ gluster volume remove-brick gv1 storage-04:/data/gv1 force

在線擴容

$ gluster volume add-brick gv1 storage-04:/data/gv1 force

二、配置 k8s 使用 glusterfs 持久化存儲

2.1 直接使用glusterfs作為存儲卷

$ cat > glusterfs-cluster.yaml << EOF
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs-cluster
  namespace: default
subsets:
- addresses:
  - ip: 192.168.99.204
  - ip: 192.168.99.205
  - ip: 192.168.99.206
  - ip: 192.168.99.207
  ports:
  - port: 49152
    protocol: TCP
EOF

$ cat > nginx_deployment_test.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-test
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  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
        glusterfs:
          endpoints: glusterfs-cluster
          path: gv0 # 修改
          readOnly: false
EOF

2.2 使用靜態pv+pvc

$ cat > glusterfs-pv.yaml << EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: glusterfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: glusterfs-cluster
    path: gv1 # 修改
    readOnly: false
EOF

$ cat > glusterfs-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: glusterfs-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
EOF

$ cat > nginx_deployment.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      name: nginx
  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: glusterfs-pvc
EOF


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM