1. 程式人生 > >獨立部署GlusterFS+Heketi實現Kubernetes共享儲存

獨立部署GlusterFS+Heketi實現Kubernetes共享儲存

目錄

環境

主機名 系統 ip地址 角色
ops-k8s-175 ubuntu16.04 192.168.75.175 k8s-master,glusterfs,heketi
ops-k8s-176 ubuntu16.04 192.168.75.176 k8s-node,glusterfs
ops-k8s-177 ubuntu16.04 192.168.75.177 k8s-node,glusterfs
ops-k8s-178 ubuntu16.04 192.168.175.178 k8s-node,glusterfs

glusterfs配置

安裝

# 在所有節點執行:
apt-get install glusterfs-server glusterfs-common glusterfs-client fuse
systemctl start glusterfs-server
systemctl enable glusterfs-server
# 在175上執行:
gluster peer probe 192.168.75.176
gluster peer probe 192.168.75.177
gluster peer probe 192.168.75.178

測試

建立測試卷


# 建立
gluster volume create test-volume replica 2 192.168.75.175:/home/gluterfs/data 192.168.75.176:/home/glusterfs/data force

# 啟用卷
gluster volume start test-volume

# 掛載
mount -t glusterfs 192.168.75.175:/test-volume /mnt/mytest

擴容測試卷

# 向卷中新增brick
gluster volume add-brick test-volume 192.168.75.177:/home/gluterfs/data 192.168.75.178:/home/glusterfs/data force

刪除測試卷

gluster volume stop test-volume
gluster volume delete test-volume

heketi配置

部署

簡介

Heketi提供了一個RESTful管理介面,可以用來管理GlusterFS卷的生命週期。 通過Heketi,就可以像使用OpenStack Manila,Kubernetes和OpenShift一樣申請可以動態配置GlusterFS卷。Heketi會動態在叢集內選擇bricks構建所需的volumes,這樣以確保資料的副本會分散到叢集不同的故障域內。同時Heketi還支援任意數量的ClusterFS叢集,以保證接入的雲伺服器不侷限於單個GlusterFS叢集。

heketi專案地址:https://github.com/heketi/heketi

下載heketi相關包:
https://github.com/heketi/heketi/releases/download/v5.0.1/heketi-client-v5.0.1.linux.amd64.tar.gz
https://github.com/heketi/heketi/releases/download/v5.0.1/heketi-v5.0.1.linux.amd64.tar.gz

修改heketi配置檔案

修改heketi配置檔案/etc/heketi/heketi.json,內容如下:

......
#修改埠,防止埠衝突
  "port": "18080",
......
#允許認證
  "use_auth": true,
......
#admin使用者的key改為adminkey
      "key": "adminkey"
......
#修改執行外掛為ssh,並配置ssh的所需證書,注意要能對叢集中的機器免密ssh登陸,使用ssh-copy-id把pub key拷到每臺glusterfs伺服器上
    "executor": "ssh",
    "sshexec": {
      "keyfile": "/root/.ssh/id_rsa",
      "user": "root",
      "port": "22",
      "fstab": "/etc/fstab"
    },
......
# 定義heketi資料庫檔案位置
    "db": "/var/lib/heketi/heketi.db"
......
#調整日誌輸出級別
    "loglevel" : "warning"

需要說明的是,heketi有三種executor,分別為mock、ssh、kubernetes,建議在測試環境使用mock,生產環境使用ssh,當glusterfs以容器的方式部署在kubernetes上時,才使用kubernetes。我們這裡將glusterfs和heketi獨立部署,使用ssh的方式。

配置ssh金鑰

在上面我們配置heketi的時候使用了ssh的executor,那麼就需要heketi伺服器能通過ssh金鑰的方式連線到所有glusterfs節點進行管理操作,所以需要先生成ssh金鑰

ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ''
chmod 600 /etc/heketi/heketi_key.pub

# ssh公鑰傳遞,這裡只以一個節點為例
ssh-copy-id -i /etc/heketi/heketi_key.pub [email protected]

# 驗證是否能通過ssh金鑰正常連線到glusterfs節點

ssh -i /etc/heketi/heketi_key [email protected]

啟動heketi

nohup heketi -config=/etc/heketi/heketi.json &

生產案例

在我實際生產中,使用docker-compose來管理heketi,而不直接手動啟動,下面直接給出docker-compose配置示例:

version: "2"
services:
  heketi:
    container_name: heketi
    image: dk-reg.op.douyuyuba.com/library/heketi:5
    volumes:
      - "/etc/heketi:/etc/heketi"
      - "/var/lib/heketi:/var/lib/heketi"
      - "/etc/localtime:/etc/localtime"
    network_mode: host

heketi新增glusterfs

新增cluster

heketi-cli --user admin -server http://192.168.75.175:18080 --secret adminkey --json  cluster create

{"id":"d102a74079dd79aceb3c70d6a7e8b7c4","nodes":[],"volumes":[]}

將4個glusterfs作為node新增到cluster

由於我們開啟了heketi認證,所以每次執行heketi-cli操作時,都需要帶上一堆的認證欄位,比較麻煩,我在這裡建立一個別名來避免相關操作:

alias heketi-cli='heketi-cli --server "http://192.168.75.175:18080" --user "admin" --secret "adminkey"'

下面新增節點

heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name 192.168.75.175 --storage-host-name 192.168.75.175 --zone 1

heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name 192.168.75.176 --storage-host-name 192.168.75.176 --zone 1

heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name 192.168.75.177 --storage-host-name 192.168.75.177 --zone 1

heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name 192.168.75.178 --storage-host-name 192.168.75.178 --zone 1

看到有些文件說需要在centos上部署時,需要註釋每臺glusterfs上的/etc/sudoers中的Defaults requiretty,不然加第二個node死活報錯,最後把日誌級別調高才看到日誌裡有記錄sudo提示require tty。由於我這裡直接部署在ubuntu上,所有不存在上述問題。如果有遇到這種問題的,可以照著操作下。

新增device

這裡需要特別說明的是,目前heketi僅支援使用裸分割槽或裸磁碟新增為device,不支援檔案系統。

# --node引數給出的id是上一步建立node時生成的,這裡只給出一個新增的示例,實際配置中,要新增每一個節點的每一塊用於儲存的硬碟
heketi-cli  -json device add -name="/dev/vda2" --node "c3638f57b5c5302c6f7cd5136c8fdc5e"

生產實際配置

上面展示瞭如何手動一步步生成cluster,往cluster中新增節點,新增device的操作,在我們實際生產配置中,可以直接通過配置檔案完成。

建立一個/etc/heketi/topology-sample.json的檔案,內容如下:

{
    "clusters": [
        {
            "nodes": [
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "192.168.75.175"
                            ],
                            "storage": [
                                "192.168.75.175"
                            ]
                        },
                        "zone": 1
                    },
                    "devices": [
                        "/dev/vda2"
                    ]
                },
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "192.168.75.176"
                            ],
                            "storage": [
                                "192.168.75.176"
                            ]
                        },
                        "zone": 1
                    },
                    "devices": [
                        "/dev/vda2"
                    ]
                },
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "192.168.75.177"
                            ],
                            "storage": [
                                "192.168.75.177"
                            ]
                        },
                        "zone": 1
                    },
                    "devices": [
                        "/dev/vda2"
                    ]
                },
                {
                    "node": {
                        "hostnames": {
                            "manage": [
                                "192.168.75.178"
                            ],
                            "storage": [
                                "192.168.75.178"
                            ]
                        },
                        "zone": 1
                    },
                    "devices": [
                        "/dev/vda2"
                    ]
                }               
            ]
        }
    ]
}

建立:

heketi-cli  topology load --json topology-sample.json

新增volume

這裡僅僅是做一個測試,實際使用中,會由kubernetes自動建立pvc

如果新增的volume小的話可能會提示No Space,要解決這一問題要在heketi.json新增"brick_min_size_gb" : 1 ,1為1G

......
    "brick_min_size_gb" : 1,
    "db": "/var/lib/heketi/heketi.db"
......

size要比brick_min_size_gb大,如果設成1還是報min brick limit,replica必須大於1

heketi-cli --json  volume create  --size 3 --replica 2

在執行建立的時候,丟擲瞭如下異常:

Error: /usr/sbin/thin_check: execvp failed: No such file or directory
  WARNING: Integrity check of metadata for pool vg_d9fb2bec56cfdf73e21d612b1b3c1feb/tp_e94d763a9b687bfc8769ac43b57fa41e failed.
  /usr/sbin/thin_check: execvp failed: No such file or directory
  Check of pool vg_d9fb2bec56cfdf73e21d612b1b3c1feb/tp_e94d763a9b687bfc8769ac43b57fa41e failed (status:2). Manual repair required!
  Failed to activate thin pool vg_d9fb2bec56cfdf73e21d612b1b3c1feb/tp_e94d763a9b687bfc8769ac43b57fa41e.

這需要在所有glusterfs節點機上安裝thin-provisioning-tools包:

apt-get -y install thin-provisioning-tools

成功建立的返回輸出如下:

heketi-cli --json volume create  --size 3 --replica 2

{"size":3,"name":"vol_7fc61913851227ca2c1237b4c4d51997","durability":{"type":"replicate","replicate":{"replica":2},"disperse":{"data":4,"redundancy":2}},"snapshot":{"enable":false,"factor":1},"id":"7fc61913851227ca2c1237b4c4d51997","cluster":"dae1ab512dfad0001c3911850cecbd61","mount":{"glusterfs":{"hosts":["10.1.61.175","10.1.61.178"],"device":"10.1.61.175:vol_7fc61913851227ca2c1237b4c4d51997","options":{"backup-volfile-servers":"10.1.61.178"}}},"bricks":[{"id":"004f34fd4eb9e04ca3e1ca7cc1a2dd2c","path":"/var/lib/heketi/mounts/vg_d9fb2bec56cfdf73e21d612b1b3c1feb/brick_004f34fd4eb9e04ca3e1ca7cc1a2dd2c/brick","device":"d9fb2bec56cfdf73e21d612b1b3c1feb","node":"20d14c78691d9caef050b5dc78079947","volume":"7fc61913851227ca2c1237b4c4d51997","size":3145728},{"id":"2876e9a7574b0381dc0479aaa2b64d46","path":"/var/lib/heketi/mounts/vg_b7fd866d3ba90759d0226e26a790d71f/brick_2876e9a7574b0381dc0479aaa2b64d46/brick","device":"b7fd866d3ba90759d0226e26a790d71f","node":"9cddf0ac7899676c86cb135be16649f5","volume":"7fc61913851227ca2c1237b4c4d51997","size":3145728}]}

配置kubernetes使用glusterfs

參考https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims

建立storageclass

新增storageclass-glusterfs.yaml檔案,內容如下:

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: glusterfs
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://192.168.75.175:18080"
  restauthenabled: "true"
  restuser: "admin"
  restuserkey: "adminkey"
  volumetype: "replicate:2"

kubectl apply -f storageclass-glusterfs.yaml 

這是直接將userkey明文寫入配置檔案建立storageclass的方式,官方推薦將key使用secret儲存。示例如下:

# glusterfs-secret.yaml內容如下:

apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: default
data:
  # base64 encoded password. E.g.: echo -n "mypassword" | base64
  key: TFRTTkd6TlZJOEpjUndZNg==
type: kubernetes.io/glusterfs


# storageclass-glusterfs.yaml內容修改如下:

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: glusterfs
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.1.61.175:18080"
  clusterid: "dae1ab512dfad0001c3911850cecbd61"
  restauthenabled: "true"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"
  #restuserkey: "adminkey"
  gidMin: "40000"
  gidMax: "50000"
  volumetype: "replicate:2"

更詳細的用法參考:https://kubernetes.io/docs/concepts/storage/storage-classes/#glusterfs

建立pvc

glusterfs-pvc.yaml內容如下:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: glusterfs-mysql1
  namespace: default
  annotations:
    volume.beta.kubernetes.io/storage-class: "glusterfs"
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
      
kubectl create -f glusterfs-pvc.yaml

建立pod,使用pvc

mysql-deployment.yaml內容如下:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: mysql
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: root123456
        ports:
          - containerPort: 3306
        volumeMounts:
        - name: gluster-mysql-data
          mountPath: "/var/lib/mysql"
      volumes:
        - name: glusterfs-mysql-data
          persistentVolumeClaim:
            claimName: glusterfs-mysql1
            
kubectl create -f /etc/kubernetes/mysql-deployment.yaml

需要說明的是,我這裡使用的動態pvc的方式來建立glusterfs掛載盤,還有一種手動建立pvc的方式,可以參考:http://rdc.hundsun.com/portal/article/826.html

相關推薦

獨立部署GlusterFS+Heketi實現Kubernetes共享儲存

目錄 環境 主機名 系統 ip地址 角色 ops-k8s-175 ubuntu16.04 192.168.75.175 k8s-master,glusterfs,heketi ops-k8s-176 ubuntu16.04 192.168.75.176 k8s-node,glusterfs

glusterfs + heketi實現kubernetes共享存儲

文件 zone 進行 .html directory key hosts amd64 dma [toc] 環境 主機名 系統 ip地址 角色 ops-k8s-175 ubuntu16.04 192.168.75.175 k8s-master,glusterfs

Kubernetes部署GlusterFS+Heketi

目錄 簡介 然而,因為Heketi無法叢集部署,所以這種部署方式中,Heketi是一個單點。要儘可能的消除這個單點,一種方式是直接將Heketi部署到Kubernetes叢集,複用Deployment的特性來確保heketi容器可用。 Gluster-Kubernetes 其實如果想直接將heketi和g

k8s技術預研13--kubernetes共享儲存原理與動態儲存供應用使用示例

1、共享儲存機制概述Kubernetes對於有狀態的容器應用或者對於資料需要持久化的應用,不僅需要將容器內的目錄掛載到宿主機的目錄或者emptyDir臨時儲存卷,而且需要更加可靠的儲存來儲存應用產生的重要資料,以便容器應用在重建之後,仍然可以使用之前的資料。不過,儲存資源和計

附009.Kubernetes永久儲存GlusterFS獨立部署

一 前期準備 1.1 基礎知識 Heketi提供了一個RESTful管理介面,可以用來管理GlusterFS卷的生命週期。Heketi會動態在叢集內選擇bricks構建所需的volumes,從而確保資料的副本會分散到叢集不同的故障域內。同時Heketi還支援任意數量的ClusterFS叢集。 提示:本實驗基於

附010.Kubernetes永久儲存GlusterFS超融合部署

一 前期準備 1.1 基礎知識 在Kubernetes中,使用GlusterFS檔案系統,操作步驟通常是: 建立brick-->建立volume-->建立PV-->建立PVC-->Pod掛載PVC 如果要建立多個PV,則需要手動重複執行,可通過Heketi管理glusterfs。 He

NFS共享儲存服務部署

utils 關閉防火墻 exports cbi water rpc 共享目錄 fff hat6 NFS是一種基於TCP/IP傳輸的網絡文件系統協議,最初由SUN公司開發,通過使用NFS協議,NFS客戶機可以向訪問本地目錄一樣訪問遠程NFS服務器中的共享資源。大多數負載均衡群

LINUX伺服器配置NFS服務,掛載外部儲存實現目錄共享

安裝nfs  rpcbind         一、服務端配置          安裝 NFS 伺服器所需的軟體包:nfs 和&nbs

阿里雲PolarDB及其共享儲存PolarFS技術實現分析(上)

PolarDB是阿里雲基於MySQL推出的雲原生資料庫(Cloud Native Database)產品,通過將資料庫中計算和儲存分離,多個計算節點訪問同一份儲存資料的方式來解決目前MySQL資料庫存在的運維和擴充套件性問題;通過引入RDMA和SPDK等新硬體來改造傳統的網路和IO協議棧來極大提升資料庫效能。

RHCS實現高可用中的共享儲存iscisi(mysql為例)

1、實驗環境 server2 172.25.66.2(配置Nginx、ricci、luci) server3 172.25.66.3(Apache) server4 172.25.66.4 (Apache) server5 172.25.66.5(配置Nginx

Kubernetes共享使用Ceph儲存_Kubernetes中文社群

目錄 簡要概述 環境測試 結果驗證 簡要概述 Kubernetes pod 結合Ceph rbd塊裝置的使用,讓Docker 資料儲存在Ceph,重啟Docker或k8s RC重新排程pod 不會引起資料來回遷移。 工作原理無非就是拿到ceph叢集的key作為認證,遠端rbdmap對映掛載

部署GlusterFSHeketi

一、前言及環境 在實踐kubernetes的StateFulSet及各種需要持久儲存的元件和功能時,通常會用到pv的動態供給,這就需要用到支援此類功能的儲存系統了。在各類支援pv動態供給的儲存系統中,GlusterFS的設定比較簡單,且資料安全性比較有保障,相較於ceph和NFS。 環境(g

spring Session + Redis叢集 + 哨兵部署實現Session共享

1.共享Session問題 HttpSession是通過Servlet容器建立和管理的,像Tomcat/Jetty都是儲存在記憶體中的。而如果我們把web伺服器搭建成分散式的叢集,然後利用LVS或Nginx做負載均衡,那麼來自同一使用者的Http請求將有可能被分發到兩個不同

在Android中使用SharedPreferences儲存資料以實現資料共享

在Android中,我們可以使用SharedPreferences來儲存資料,以實現資料的共享。 (以一個使用者登入為例) 簡介: 首先我們需要了解一下SharedPreferences類,Share

將session儲存到redis上,實現session共享

當一個專案使用叢集部署方案時就必須用到session的共享。在這裡先簡單講述如何在springmvc中將session儲存到redis中。 準備jar包 <dependency> <groupId>org.spring

配置Kubernetes共享使用Ceph儲存

目錄 簡要概述 環境測試 結果驗證 簡要概述 Kubernetes pod 結合Ceph rbd塊裝置的使用,讓Dock

分散式airflow搭建(不使用git或共享儲存實現dag目錄同步——xsync)

叢集資源分配 \master1master2slave1slave2slave3 元件scheduler, webserv

Shell指令碼實現----Kubernetes單叢集二進位制部署

 Shell指令碼實現----Kubernetes單叢集二進位制部署         搭建Kubernetes叢集環境有以下三種方式: 1. Minikube安裝方式Minikube是一個工具,可以在本地快速執行一個單點的Kubernetes,

activiti web流程設計器 工作流的 整合視頻教程 SSM和獨立部署

activiti 工作流 web流程設計器 ssm activiti工作流 本視頻為activiti工作流的web流程設計器整合視頻教程整合Acitiviti在線流程設計器(Activiti-Modeler 5.21.0 官方流程設計器)本視頻共講了兩種整合方式1. 流程設計器和其它工作流

CentOS7 下 Nginx + Tomcat 實現 Session 共享

++ port orange 安裝目錄 nag 教訓 font ext 參考   在之情的文章中搭建的 centos7 + tomcat + nginx 的環境的基礎上, 使用 redis 實現 tomcat 的 session 共享的問題。 一 : 安裝 Redis