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

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


1node


集羣詳情nginx


  • Kubernetes 1.6.0git

  • Docker 1.12.5(使用yum安裝)github

  • Etcd 3.1.5算法

  • Flanneld 0.7 vxlan 網絡docker

  • TLS 認證通訊 (全部組件,如 etcd、kubernetes master 和 node)json

  • RBAC 受權centos

  • kublet TLS BootStrappingapi

  • kubedns、dashboard、heapster(influxdb、grafana)、EFK(elasticsearch、fluentd、kibana) 集羣插件

  • 私有docker鏡像倉庫harbor(請自行部署,harbor提供離線安裝包,直接使用docker-compose啓動便可)


如下步驟參考自:https://www.xf80.com/2017/04/21/kubernetes-glusterfs/


2

安裝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


3

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


4

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


5

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


6

Kubernetes中配置Glusterfs


官方的文檔見:

https://github.com/kubernetes/kubernetes/tree/master/examples/volumes/glusterfs


如下用到的全部yaml和json配置文件能夠在glusterfs中找到。注意替換其中私有鏡像地址爲你本身的鏡像地址。


7

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集羣複用主機,由於此這一步能夠省去。


8

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


9

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


10

建立測試 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


11

配置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總容量


12

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


13

建立 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/

相關文章
相關標籤/搜索