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

店家小二發表於2018-12-12

本文通過步驟講解,旨在讓讀者瞭解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

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

因為我們只有三臺主機,在此我們使用預設的分佈卷模式。請勿在生產環境上使用該模式,容易導致資料丟失。

# 建立分佈卷

$ 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

# 配置 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

因為我們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

apiVersion: v1

metadata:

  name: glusterfs-nginx

spec:

  accessModes:

    – ReadWriteMany

  resources:

    requests:

      storage: 8Gi

# 匯入 pvc

$ kubectl apply -f glusterfs-pvc.yaml

# 檢視 pvc

$ kubectl get pv

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做持久化儲存?


相關文章