天天看點

K8S中如何使用Glusterfs做持久化存儲?

本文通過步驟講解,旨在讓讀者了解Kubernetes中如何使用持久化存儲,對glusterfs的配置相對簡單,不建議在生産環境下使用。

叢集詳情   

  • Kubernetes 1.6.0
  • Docker 1.12.5(使用yum安裝)
  • Etcd 3.1.5
  • Flanneld 0.7 vxlan 網絡
  • TLS 認證通信 (所有元件,如 etcd、kubernetes master 和 node)
  • RBAC 授權
  • kublet TLS BootStrapping
  • kubedns、dashboard、heapster(influxdb、grafana)、EFK(elasticsearch、fluentd、kibana) 叢集插件
  • 私有docker鏡像倉庫harbor(請自行部署,harbor提供離線安裝包,直接使用docker-compose啟動即可)

以下步驟參考自: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

172.20.0.113   sz-pg-oam-docker-test-001.tendcloud.com 

172.20.0.114   sz-pg-oam-docker-test-002.tendcloud.com 

172.20.0.115   sz-pg-oam-docker-test-003.tendcloud.com 

# 開放端口

$ iptables -I INPUT -p tcp –dport 24007 -j ACCEPT

# 建立存儲目錄

$ mkdir /opt/gfs_data

# 添加節點到 叢集

# 執行操作的本機不需要probe 本機

[root@sz-pg-oam-docker-test-001 ~]#

gluster peer probe sz-pg-oam-docker-test-002.tendcloud.com

gluster peer probe sz-pg-oam-docker-test-003.tendcloud.com

# 檢視叢集狀态

$ gluster peer status

Number of Peers: 2

Hostname: sz-pg-oam-docker-test-002.tendcloud.com

Uuid: f25546cc-2011-457d-ba24-342554b51317

State: Peer in Cluster (Connected)

Hostname: sz-pg-oam-docker-test-003.tendcloud.com

Uuid: 42b6cad1-aa01-46d0-bbba-f7ec6821d66d

配置 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個節點 組成一個 組。

因為我們隻有三台主機,在此我們使用預設的分布卷模式。請勿在生産環境上使用該模式,容易導緻資料丢失。

# 建立分布卷

$ gluster volume create k8s-volume transport tcp sz-pg-oam-docker-test-001.tendcloud.com:/opt/gfs_data sz-pg-oam-docker-test-002.tendcloud.com:/opt/gfs_data sz-pg-oam-docker-test-003.tendcloud.com:/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: sz-pg-oam-docker-test-001.tendcloud.com:/opt/gfs_data

Brick2: sz-pg-oam-docker-test-002.tendcloud.com:/opt/gfs_data

Brick3: sz-pg-oam-docker-test-003.tendcloud.com:/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

172.20.0.113   sz-pg-oam-docker-test-001.tendcloud.com

172.20.0.114   sz-pg-oam-docker-test-002.tendcloud.com

172.20.0.115   sz-pg-oam-docker-test-003.tendcloud.com

因為我們glusterfs跟kubernetes叢集複用主機,因為此這一步可以省去。

配置 Endpoints

$ curl -O https://raw.githubusercontent.com/kubernetes/kubernetes/master/examples/volumes/glusterfs/glusterfs-endpoints.json

# 修改 endpoints.json ,配置 glusters 叢集節點ip

# 每一個 addresses 為一個 ip 組

    {

      “addresses”: [

        {

          “ip”: “172.22.0.113”

        }

      ],

      “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

172.20.0.113:k8s-volume 1073741824        0 1073741824   0% 172.20.0.113: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          Available                                      3s

PVC屬性

  • 通路屬性與PV相同
  • 容量:向PV申請的容量 <= PV總容量

配置PVC

$ cat glusterfs-pvc.yaml

kind: PersistentVolumeClaim

  name: glusterfs-nginx

  resources:

    requests:

      storage: 8Gi

# 導入 pvc

$ kubectl apply -f glusterfs-pvc.yaml

# 檢視 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:alpine 

          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

172.20.0.113: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

# 因為我們使用分布卷,是以可以看到某個節點中有檔案

[root@sz-pg-oam-docker-test-001 ~] ls /opt/gfs_data/

[root@sz-pg-oam-docker-test-002 ~] ls /opt/gfs_data/

index.html

[root@sz-pg-oam-docker-test-003 ~] ls /opt/gfs_data/

本文轉移K8S技術社群-

K8S中如何使用Glusterfs做持久化存儲?

繼續閱讀