Kubernetes部署GlusterFS

KubeSphere 部署的 (k8s)Kubernetes 集群使用 GlusterFS 存储实战入门 上一期实战课程,我们模拟真实的生产环境实战演示了如何使用 KubeKey 将新增 Worker 节点添加到已有的 Kubernetes 集群。最终我们部署完成了一套 3 Master 和 3 Worker 节点的 Kubernetes 集群。本期实战课程,我们将实战如何在上安装部署 GlusterFS、Hekeiti 以及 Kubernetes 使用模式对接 GlusterFS 做为集群的后端存储。 阅读详情

存储是容器编排中非常重要的一部分。Kubernetes从v1.2开始,提供了dynamic provisioning这一强大的特性,可以给集群提供按需分配的存储,并能支持包括AWS-EBS、GCE-PD、Cinder-Openstack、Ceph、GlusterFS等多种云存储。非官方支持的存储也可以通过编写plugin方式支持。
在没有dynamic provisioning时,容器为了使用Volume,需要预先在存储端分配好,这个过程往往是管理员手动的。在引入dynamic provisioning之后,Kubernetes会根据容器所需的volume大小,通过调用存储服务的接口,动态地创建满足所需的存储。

管理员可以配置storageclass,来描述所提供存储的类型。以AWS-EBS为例,管理员可以分别定义两种storageclass: slow和fast。slow对接sc1(机械硬盘),fast对接gp2(固态硬盘)。应用可以根据业务的性能需求,分别选择两种storageclass。

GlusterFS是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBandRDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。

Heketi(https://github.com/heketi/heketi),是一个基于RESTful API的GlusterFS卷管理框架。Heketi可以方便地和云平台整合,提供RESTful API供Kubernetes调用,实现多GlusterFS集群的卷管理。另外,Heketi还有保证bricks和它对应的副本均匀分布在集群中的不同可用区的优点。

部署环境

Kubernetes配置

[root@rancher-server ~]# kubectl get nodes
NAME                      STATUS    AGE
rancher-node1.novalocal   Ready     3h
rancher-node2.novalocal   Ready     3h
rancher-node3.novalocal   Ready     3h
rancher-node4.novalocal   Ready     3h
rancher-node5.novalocal   Ready     3h
rancher-node6.novalocal   Ready     2h

挂载云硬盘到rancher-node4.novalocal、rancher-node5.novalocal、rancher-node6.novalocal上

VDisk

部署GlusterFS

克隆个GlusterFS Kubernetes配置项目地址

git clone https://github.com/gluster/gluster-kubernetes.git

修改部署脚本,Heketi Service需要在Kubernetes集群外部访问,所以要将服务端口导出

442 heketi_service=""
443 debug -n "Determining heketi service URL … "
# 等待负载均衡服务配置完成
444 sleep 120
445 while [[ "x${heketi_service}" == "x" ]]; do
446   if [[ "${CLI}" == *oc ]]; then
447     heketi_service=$(${CLI} describe routes/deploy-heketi | grep "Requested Host:" | awk '{print $3}')
448   else
449     # ${CLI} describe svc/deploy-heketi -n ${NAMESPACE}
450     heketi_service_ip=$(${CLI} describe svc/deploy-heketi -n ${NAMESPACE} | grep "LoadBalancer Ingress:" | awk '{print $3}')
451     heketi_service_port=$(${CLI} describe svc/deploy-heketi -n ${NAMESPACE} | grep "Port:" | grep -v "NodePort" | awk '{print $3}' | awk -F'/' '{print $1}')
452     heketi_service="${heketi_service_ip}:${heketi_service_port}"
453     echo "heketi_service: ${heketi_service}"
454   fi
455   sleep 1
456 done
457 debug “OK"
......
507 heketi_service=""
508 debug -n "Determining heketi service URL … "
# 等待负载均衡服务配置完成
509 sleep 120
510 while [[ "x${heketi_service}" == "x" ]]; do
511   if [[ "${CLI}" == *oc ]]; then
512     heketi_service=$(${CLI} describe routes/heketi | grep "Requested Host:" | awk '{print $3}')
513   else
514     # ${CLI} describe svc/heketi -n ${NAMESPACE}
515     heketi_service_ip=$(${CLI} describe svc/heketi -n ${NAMESPACE} | grep "LoadBalancer Ingress:" | awk '{print $3}')
516     heketi_service_port=$(${CLI} describe svc/heketi -n ${NAMESPACE} | grep "Port:" | grep -v "NodePort" | awk '{print $3}' | awk -F'/' '{print $1}')
517     heketi_service="${heketi_service_ip}:${heketi_service_port}"
518     echo "heketi_service: ${heketi_service}"
519   fi
520   sleep 1
521 done
522 debug "OK"

修改Kubernetes模板配置文件

[root@rancher-server deploy]# cat kube-templates/deploy-heketi-deployment.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: deploy-heketi
  labels:
    glusterfs: heketi-service
    deploy-heketi: support
  annotations:
    description: Exposes Heketi Service
spec:
  # Heketi Service需要在Kubernetes集群外部访问,所以要将服务端口导出
  type: LoadBalancer
  selector:
    name: deploy-heketi
  ports:
  - name: deploy-heketi
    port: 8080
    targetPort: 8080
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: deploy-heketi
  labels:
    glusterfs: heketi-deployment
    deploy-heketi: heketi-deployment
  annotations:
    description: Defines how to deploy Heketi
spec:
  replicas: 1
  template:
    metadata:
      name: deploy-heketi
      labels:
        name: deploy-heketi
        glusterfs: heketi-pod
    spec:
      serviceAccountName: heketi-service-account
      containers:
      - image: heketi/heketi:dev
        imagePullPolicy: IfNotPresent
        name: deploy-heketi
        env:
        - name: HEKETI_EXECUTOR
          value: kubernetes
        - name: HEKETI_KUBE_USE_SECRET
          value: "y"
        - name: HEKETI_FSTAB
          value: "/var/lib/heketi/fstab"
        - name: HEKETI_SNAPSHOT_LIMIT
          value: '14'
        - name: HEKETI_KUBE_GLUSTER_DAEMONSET
          value: "y"
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: db
          mountPath: "/var/lib/heketi"
        readinessProbe:
          timeoutSeconds: 3
          initialDelaySeconds: 3
          httpGet:
            path: "/hello"
            port: 8080
        livenessProbe:
          timeoutSeconds: 3
          initialDelaySeconds: 30
          httpGet:
            path: "/hello"
            port: 8080
      volumes:
      - name: db

[root@rancher-server deploy]# cat kube-templates/heketi-deployment.yaml
---
kind: Service
apiVersion: v1
metadata:
  name: heketi
  labels:
    glusterfs: heketi-service
    deploy-heketi: support
  annotations:
    description: Exposes Heketi Service
spec:
  type: LoadBalancer
  selector:
    name: heketi
  ports:
  - name: heketi
    port: 8080
    targetPort: 8080
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: heketi
  labels:
    glusterfs: heketi-deployment
  annotations:
    description: Defines how to deploy Heketi
spec:
  replicas: 1
  template:
    metadata:
      name: heketi
      labels:
        name: heketi
        glusterfs: heketi-pod
    spec:
      serviceAccountName: heketi-service-account
      containers:
      - image: heketi/heketi:dev
        imagePullPolicy: IfNotPresent
        name: heketi
        env:
        - name: HEKETI_EXECUTOR
          value: kubernetes
        - name: HEKETI_KUBE_USE_SECRET
          value: "y"
        - name: HEKETI_FSTAB
          value: "/var/lib/heketi/fstab"
        - name: HEKETI_SNAPSHOT_LIMIT
          value: '14'
        - name: HEKETI_KUBE_GLUSTER_DAEMONSET
          value: "y"
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: db
          mountPath: "/var/lib/heketi"
        readinessProbe:
          timeoutSeconds: 3
          initialDelaySeconds: 3
          httpGet:
            path: "/hello"
            port: 8080
        livenessProbe:
          timeoutSeconds: 3
          initialDelaySeconds: 30
          httpGet:
            path: "/hello"
            port: 8080
      volumes:
      - name: db
        glusterfs:
          endpoints: heketi-storage-endpoints
          path: heketidbstorage

编写拓扑配置文件

[root@rancher-server deploy]# cat topology.json
{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "rancher-node4.novalocal"
              ],
              "storage": [
                "192.168.101.164"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdb",
            "/dev/vdc"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "rancher-node5.novalocal"
              ],
              "storage": [
                "192.168.101.165"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdb",
            "/dev/vdc"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "rancher-node6.novalocal"
              ],
              "storage": [
                "192.168.101.166"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdb",
            "/dev/vdc"
          ]
        }
      ]
    }
  ]
}

下载heketi客户端

[root@rancher-server deploy]# wget https://github.com/heketi/heketi/releases/download/v4.0.0/heketi-client-v4.0.0.linux.amd64.tar.gz
[root@rancher-server deploy]# tar xzvf heketi-client-v4.0.0.linux.amd64.tar.gz
[root@rancher-server deploy]# cp heketi-client/bin/heketi-cli /usr/local/bin/
[root@rancher-server deploy]# chmod +x /usr/local/bin/heketi-cli

部署服务

[root@rancher-server deploy]# ./gk-deploy -g -n kube-system -c kubectl
Welcome to the deployment tool for GlusterFS on Kubernetes and OpenShift.

Before getting started, this script has some requirements of the execution
environment and of the container platform that you should verify.

The client machine that will run this script must have:
 * Administrative access to an existing Kubernetes or OpenShift cluster
 * Access to a python interpreter 'python'
 * Access to the heketi client 'heketi-cli'

Each of the nodes that will host GlusterFS must also have appropriate firewall
rules for the required GlusterFS ports:
 * 2222  - sshd (if running GlusterFS in a pod)
 * 24007 - GlusterFS Daemon
 * 24008 - GlusterFS Management
 * 49152 to 49251 - Each brick for every volume on the host requires its own
   port. For every new brick, one new port will be used starting at 49152. We
   recommend a default range of 49152-49251 on each host, though you can adjust
   this to fit your needs.

In addition, for an OpenShift deployment you must:
 * Have 'cluster_admin' role on the administrative account doing the deployment
 * Add the 'default' and 'router' Service Accounts to the 'privileged' SCC
 * Add the 'heketi-service-account' Service Account to the 'privileged' SCC
 * Have a router deployed that is configured to allow apps to access services
   running in the cluster

Do you wish to proceed with deployment?

[Y]es, [N]o? [Default: Y]:
Using Kubernetes CLI.
NAME          STATUS    AGE
kube-system   Active    1h
Using namespace "kube-system".
serviceaccount "heketi-service-account" created
node "rancher-node4.novalocal" labeled
node "rancher-node5.novalocal" labeled
node "rancher-node6.novalocal" labeled
daemonset "glusterfs" created
Waiting for GlusterFS pods to start ... OK
service "deploy-heketi" created
deployment "deploy-heketi" created
Waiting for deploy-heketi pod to start ... OK
Name:           deploy-heketi
Namespace:      kube-system
Labels:         deploy-heketi=support
            glusterfs=heketi-service
Selector:       name=deploy-heketi
Type:           LoadBalancer
IP:         10.43.254.191
LoadBalancer Ingress:   10.101.1.162
Port:           deploy-heketi   8080/TCP
NodePort:       deploy-heketi   30985/TCP
Endpoints:      10.42.162.137:8080
Session Affinity:   None
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason          Message
  --------- --------    -----   ----            -------------   --------    ------          -------
  3m        3m      1   {service-controller }           Normal      CreatingLoadBalancer    Creating load balancer
  3m        3m      1   {service-controller }           Normal      CreatedLoadBalancer Created load balancer
heketi_service: 10.101.1.162:8080
Creating cluster ... ID: 1c2fe81a325b048710f3ad6d07ffbff8
    Creating node rancher-node4.novalocal ... ID: bc49ff0bb218fcf2902cb706cdc00d6c
        Adding device /dev/vdb ... OK
        Adding device /dev/vdc ... OK
    Creating node rancher-node5.novalocal ... ID: ea2d9a302006a87a622ac6bcac67555a
        Adding device /dev/vdb ... OK
        Adding device /dev/vdc ... OK
    Creating node rancher-node6.novalocal ... ID: 5d09cd8351fd1e3dab25e251fa6a23d9
        Adding device /dev/vdb ... OK
        Adding device /dev/vdc ... OK
Saving heketi-storage.json
secret "heketi-storage-secret" created
endpoints "heketi-storage-endpoints" created
service "heketi-storage-endpoints" created
job "heketi-storage-copy-job" created
service "deploy-heketi" deleted
job "heketi-storage-copy-job" deleted
deployment "deploy-heketi" deleted
secret "heketi-storage-secret" deleted
service "heketi" created
deployment "heketi" created
Waiting for heketi pod to start ... OK
Name:           heketi
Namespace:      kube-system
Labels:         deploy-heketi=support
            glusterfs=heketi-service
Selector:       name=heketi
Type:           LoadBalancer
IP:         10.43.129.172
LoadBalancer Ingress:   10.101.1.165
Port:           heketi  8080/TCP
NodePort:       heketi  31078/TCP
Endpoints:      10.42.55.126:8080
Session Affinity:   None
Events:
  FirstSeen LastSeen    Count   From            SubObjectPath   Type        Reason          Message
  --------- --------    -----   ----            -------------   --------    ------          -------
  3m        3m      1   {service-controller }           Normal      CreatingLoadBalancer    Creating load balancer
  3m        3m      1   {service-controller }           Normal      CreatedLoadBalancer Created load balancer
heketi_service: 10.101.1.165:8080
heketi is now running.

错误处理

# 当重复执行部署脚本时会出现如下错误
Creating cluster ... ID: e9164fac33d6eb0096f76033c7c5d0d6
     Creating node rancher-node3.novalocal ... ID: dd0af5202c46f4ed6710fa40f466663b
          Adding device /dev/vdb ... Unable to add device: Unable to execute command on glusterfs-pcpjx:   Can't initialize physical volume "/dev/vdb" of volume group "vg_6b153c6002e7983fcfc044d3ab8878d4" without -ff
# 登陆docker加-ff手动执行初始化操作
[root@rancher-node3 ~]# docker exec -ti f89 bash
[root@rancher-node3 /]# pvcreate -ff --metadatasize=128M --dataalignment=256K /dev/vdb
Really INITIALIZE physical volume "/dev/vdb" of volume group "vg_6b153c6002e7983fcfc044d3ab8878d4" [y/n]? y
  WARNING: Forcing physical volume creation on /dev/vdb of volume group "vg_6b153c6002e7983fcfc044d3ab8878d4"
  Physical volume "/dev/vdb" successfully created

导出HEKETI SERVER地址

[root@rancher-server deploy]# export HEKETI_CLI_SERVER=http://10.101.1.165:8080

查看拓扑信息

[root@rancher-server deploy]# heketi-cli topology info

Cluster Id: 1c2fe81a325b048710f3ad6d07ffbff8

    Volumes:

    Name: heketidbstorage
    Size: 32
    Id: 9f08272aedc22b71abd71f2c2f6301d3
    Cluster Id: 1c2fe81a325b048710f3ad6d07ffbff8
    Mount: 192.168.101.164:heketidbstorage
    Mount Options: backup-volfile-servers=192.168.101.165,192.168.101.166
    Durability Type: replicate
    Replica: 3
    Snapshot: Disabled

        Bricks:
            Id: 3443563006e26bb90ab35248a69299fc
            Path: /var/lib/heketi/mounts/vg_be73db47e84d18b8cbeb393e4d75ce39/brick_3443563006e26bb90ab35248a69299fc/brick
            Size (GiB): 32
            Node: bc49ff0bb218fcf2902cb706cdc00d6c
            Device: be73db47e84d18b8cbeb393e4d75ce39

            Id: 9c14bb4250e8a7db29cae00dbf1828c0
            Path: /var/lib/heketi/mounts/vg_1fe52210ca857e3c80b40f159afd18ea/brick_9c14bb4250e8a7db29cae00dbf1828c0/brick
            Size (GiB): 32
            Node: ea2d9a302006a87a622ac6bcac67555a
            Device: 1fe52210ca857e3c80b40f159afd18ea

            Id: b2ead217863feefd265d9103b43962ca
            Path: /var/lib/heketi/mounts/vg_ee1f9901c50b8bc8497cce2a181cd452/brick_b2ead217863feefd265d9103b43962ca/brick
            Size (GiB): 32
            Node: 5d09cd8351fd1e3dab25e251fa6a23d9
            Device: ee1f9901c50b8bc8497cce2a181cd452


    Nodes:

    Node Id: 5d09cd8351fd1e3dab25e251fa6a23d9
    State: online
    Cluster Id: 1c2fe81a325b048710f3ad6d07ffbff8
    Zone: 1
    Management Hostname: rancher-node6.novalocal
    Storage Hostname: 192.168.101.166
    Devices:
        Id:011a77329427848014186c0a1a9d50d1   Name:/dev/vdc            State:online    Size (GiB):199     Used (GiB):0       Free (GiB):199
            Bricks:
        Id:ee1f9901c50b8bc8497cce2a181cd452   Name:/dev/vdb            State:online    Size (GiB):199     Used (GiB):32      Free (GiB):167
            Bricks:
                Id:b2ead217863feefd265d9103b43962ca   Size (GiB):32      Path: /var/lib/heketi/mounts/vg_ee1f9901c50b8bc8497cce2a181cd452/brick_b2ead217863feefd265d9103b43962ca/brick

    Node Id: bc49ff0bb218fcf2902cb706cdc00d6c
    State: online
    Cluster Id: 1c2fe81a325b048710f3ad6d07ffbff8
    Zone: 1
    Management Hostname: rancher-node4.novalocal
    Storage Hostname: 192.168.101.164
    Devices:
        Id:1ba42526a340272a6565118ae86cb655   Name:/dev/vdb            State:online    Size (GiB):199     Used (GiB):0       Free (GiB):199
            Bricks:
        Id:be73db47e84d18b8cbeb393e4d75ce39   Name:/dev/vdc            State:online    Size (GiB):199     Used (GiB):32      Free (GiB):167
            Bricks:
                Id:3443563006e26bb90ab35248a69299fc   Size (GiB):32      Path: /var/lib/heketi/mounts/vg_be73db47e84d18b8cbeb393e4d75ce39/brick_3443563006e26bb90ab35248a69299fc/brick

    Node Id: ea2d9a302006a87a622ac6bcac67555a
    State: online
    Cluster Id: 1c2fe81a325b048710f3ad6d07ffbff8
    Zone: 1
    Management Hostname: rancher-node5.novalocal
    Storage Hostname: 192.168.101.165
    Devices:
        Id:1fe52210ca857e3c80b40f159afd18ea   Name:/dev/vdc            State:online    Size (GiB):199     Used (GiB):32      Free (GiB):167
            Bricks:
                Id:9c14bb4250e8a7db29cae00dbf1828c0   Size (GiB):32      Path: /var/lib/heketi/mounts/vg_1fe52210ca857e3c80b40f159afd18ea/brick_9c14bb4250e8a7db29cae00dbf1828c0/brick
        Id:7657b6d493bf403671636e0239428c65   Name:/dev/vdb            State:online    Size (GiB):199     Used (GiB):0       Free (GiB):199
            Bricks:

列出volume

[root@rancher-server deploy]# heketi-cli volume list
Id:9f08272aedc22b71abd71f2c2f6301d3    Cluster:1c2fe81a325b048710f3ad6d07ffbff8    Name:heketidbstorage

查看volume信息

[root@rancher-server ~]# heketi-cli volume info 9f08272aedc22b71abd71f2c2f6301d3
Name: heketidbstorage
Size: 32
Volume Id: 9f08272aedc22b71abd71f2c2f6301d3
Cluster Id: 1c2fe81a325b048710f3ad6d07ffbff8
Mount: 192.168.101.164:heketidbstorage
Mount Options: backup-volfile-servers=192.168.101.165,192.168.101.166
Durability Type: replicate
Distributed+Replica: 3

生成endpoints配置文件并创建

[root@rancher-server deploy]# heketi-cli volume create --size=200 \
>   --persistent-volume \
>   --persistent-volume-endpoint=heketi-storage-endpoints >heketi-storage-endpoints.yaml
[root@rancher-server deploy]# cat heketi-storage-endpoints.yaml
{
  "kind": "PersistentVolume",
  "apiVersion": "v1",
  "metadata": {
    "name": "glusterfs-b510d672",
    "creationTimestamp": null
  },
  "spec": {
    "capacity": {
      "storage": "200Gi"
    },
    "glusterfs": {
      "endpoints": "heketi-storage-endpoints",
      "path": "vol_b510d67274e2104df3d4e6ca84555aec"
    },
    "accessModes": [
      "ReadWriteMany"
    ],
    "persistentVolumeReclaimPolicy": "Retain"
  },
  "status": {}
}
[root@rancher-server deploy]# kubectl create -f heketi-storage-endpoints.yaml -n kube-system
persistentvolume "glusterfs-8b77713d" created

查看endpoints

[root@rancher-server deploy]# kubectl get endpoints -n kube-system
NAME                       ENDPOINTS                                               AGE
heketi                     10.42.55.126:8080                                       15m
heketi-storage-endpoints   192.168.101.164:1,192.168.101.165:1,192.168.101.166:1   17m
kube-controller-manager    <none>                                                  1h
kube-dns                   10.42.108.229:53,10.42.108.229:53                       1h
kube-scheduler             <none>                                                  1h
kubernetes-dashboard       10.42.31.157:9090                                       1h

查看StorageClass配置文件

[root@rancher-server deploy]# cat gluster-storage-class.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-heketi
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.101.1.165:8080"
  restauthenabled: "flase"
  restuser: "admin"
  secretNamespace: "default"
  secretName: "heketi-secret"

创建StorageClass

[root@rancher-server deploy]# kubectl create -f gluster-storage-class.yaml
storageclass "gluster-heketi" created

[root@rancher-server deploy]# kubectl get StorageClass
NAME             TYPE
gluster-heketi   kubernetes.io/glusterfs

查看PVC配置文件

[root@rancher-server deploy]# cat gluster-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: glusterfs-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: gluster-heketi
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

创建PVC

[root@rancher-server deploy]# kubectl create -f gluster-pvc.yaml
persistentvolumeclaim "glusterfs-claim” created
[root@rancher-server deploy]# kubectl get pvc
NAME              STATUS    VOLUME                                     CAPACITY   ACCESSMODES   AGE
glusterfs-claim   Bound     pvc-3777ed68-f18c-11e6-9e78-7aebc4e21f54   5Gi        RWX           43s
[root@rancher-server deploy]# kubectl describe pvc glusterfs-claim
Name:          glusterfs-claim
Namespace:     default
StorageClass:     gluster-heketi
Status:          Bound
Volume:          pvc-3777ed68-f18c-11e6-9e78-7aebc4e21f54
Labels:          <none>
Capacity:     5Gi
Access Modes:     RWX

查看busybox应用配置文件

[root@rancher-server deploy]# cat app.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
    - image: busybox
      command:
        - sleep
        - "3600"
      name: busybox
      volumeMounts:
        - mountPath: /usr/share/busybox
          name: mypvc
  volumes:
    - name: mypvc
      persistentVolumeClaim:
        claimName: glusterfs-claim

创建应用

[root@rancher-server deploy]# kubectl create -f app.yaml
pod "busybox" created

[root@rancher-server deploy]# kubectl get pods -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP             NODE
busybox   1/1       Running   0          1m        10.42.143.75   rancher-node3.novalocal
[root@rancher-node3 ~]# docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED              STATUS              PORTS               NAMES
107200c3da74        busybox                                    "sleep 3600"             About a minute ago   Up About a minute                       k8s_busybox.19973479_busybox_default_9f126f56-f18c-11e6-9e78-7aebc4e21f54_3a83e561
[root@rancher-node3 ~]# docker exec -ti 1072 /bin/sh
/ # df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/mapper/docker-253:1-310378690-7ffa15d771fc235224960bf5a02a773f930f8196ef99d35bf7a9a07a36859ca9
                         10.0G     33.9M     10.0G   0% /
tmpfs                     3.8G         0      3.8G   0% /dev
tmpfs                     3.8G         0      3.8G   0% /sys/fs/cgroup
/dev/vda1                80.0G     12.0G     67.9G  15% /dev/termination-log
/dev/vda1                80.0G     12.0G     67.9G  15% /etc/resolv.conf
/dev/vda1                80.0G     12.0G     67.9G  15% /etc/hostname
/dev/vda1                80.0G     12.0G     67.9G  15% /etc/hosts
shm                      64.0M         0     64.0M   0% /dev/shm
192.168.101.164:vol_930e466feced37f287d9f543f4eab597
                          5.0G     32.6M      5.0G   1% /usr/share/busybox
tmpfs                     3.8G     12.0K      3.8G   0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs                     3.8G         0      3.8G   0% /proc/kcore
tmpfs                     3.8G         0      3.8G   0% /proc/timer_list
tmpfs                     3.8G         0      3.8G   0% /proc/timer_stats
tmpfs                     3.8G         0      3.8G   0% /proc/sched_debug

参考

GlusterFS集群文件系统研究:http://blog.sae.sina.com.cn/archives/4004
GlusterFS系统中文管理手册:http://www.blogchong.com/?mod=pad&act=view&id=18
https://github.com/gluster/gluster-kubernetes/blob/master/docs/setup-guide.md
https://access.redhat.com/documentation/en/red-hat-gluster-storage/3.1/single/deployment-guide-for-containerized-red-hat-gluster-storage-in-openshift-enterprise/
Running a Replicated Stateful Application:https://kubernetes.io/docs/tutorials/stateful-application/run-replicated-stateful-application/

附010.Kubernetes永久存储之GlusterFS超融合部署 一 前期准备 1.1 基础知识 在Kubernetes中,使用GlusterFS文件系统,操作步骤通常是: 创建brick-->创建volume-->创建PV-->创建PVC-->Pod挂载PVC 如果要创建多个PV,则需要手动重复执行,可通过Heketi管理glusterfs。 Heketi是用来管理GlusterFS卷的生命周期... 阅读详情

相关推荐

Kubernetes集群中GlusterFS的动态存储部署教程

Heketi的架构设计允许它作为GlusterFS存储卷的管理前端,为容器编排工具如Kubernetes提供了一个统一的API接口。在深入了解Heketi组件之前,让我们先来看看它的RESTful API的主要特点和功能:创建和删除存储卷:容器编排工具可以请求创建和删除存储卷。获取存储容量信息:查询特定GlusterFS集群的可用存储容量。访问控制:通过身份验证和授权机制控制API访问。状态和故障检测:持续监控存储卷状态,并提供故障检测。

weixin_35899324的博客 1069

使用kubernetes方式部署glusterfs作为kubernetes持久化文件存储

准备四台虚拟机,系统使用centos7,并安装配置好kubernetes集群环境,本次实验使用kubeadm来安装单master多node集群。所有工作节点新挂在一块硬盘,不需要格式化。 [root@k8s-node1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ├─sda1 8:1 0 300M 0 part /boot ├─sda2 8:2 0 3

myitsite的博客 1835

debian linux系统安装教程,Debian 10(Buster)安装过程图文详解

Debian 项目发布了它的最新稳定版 Debian 10,其代号是 “Buster”,这个发布版将获得 5 年的支持。Debian 10 可用于 32 位和 64 位系统。这个发布版带来很多新的特色,列出下面一些特色:引入新的 Debian 10 的主题 “FuturePrototype”新版本的电脑桌面环境 GNOME 3.30、Cinnamon 3.8、KDE Plasma 5.14、MAT...

weixin_39864601的博客 4988

kubernetes动态存储之glusterfs集群(heketi)

kubernetes存储类资源的详细实现过程

taonihou_的博客 1373

国产机载操作系统天脉ACoreOS实战:从零搭建开发环境到应用移植

本文详细介绍了国产机载操作系统天脉ACoreOS的实战开发流程,从核心特性解析到开发环境搭建,再到VxWorks应用移植策略。重点阐述了其符合ARINC 653标准的时空分区架构如何保障高可靠性,并提供了从零创建分区工程、重构通信与任务代码的具体步骤,为开发者向这一国产化平台迁移提供了实用指南。

flower的专栏 634

海豚调度器(dolphinscheduler)再次使用,添加钉钉预警

1,首先我们部署是海豚调度器 1.3.8版本,由于页面只有邮件预警,所以在了解源码的同时,需要添加钉钉预警 2,说明,这一块是同事搞的,不是我搞的,新版本的dolphinscheduler已经有了钉钉模块,只是新版本还没有发布 3,我们现在只是添加简单的钉钉预警,任务成功或者失败会发送邮件+钉钉 4,具体操作 找到最新的源码devhttps://github1s.com/apache/dolphinscheduler/blob/dev/dolphinscheduler-alert/src/ma...

qq_31866793的博客 3085

Kubernetes(k8s)之分布式文件系统glusterfs

1、为什么使用分布式文件系统glusterfs? 答:使用持久化存储nfs,但是使用nfs这个共享存储特别简单,但是后期在扩容和管理方面都特别的不方便,在生产中一般都是使用分布式文件系统,这里使用的是分布式文件系统glusterfs。 2、什么是分布式文件系统glusterfs? 答:分布式文件系统glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可以支持数PB存储容器...

HiterCoder 1075

安卓中蓝牙免提HFP的一些分析

最近看了一些大牛的博客,无不提到了技术分享的重要性,的确,分享自己的知识不仅仅是与他人讨论并相互提高的过程,更是对自己知识的梳理。希望自己能以此为契机,形成周期性博客分享的习惯。 文章标题为HFP的一些分析,HFP(Hand Free Profile)主要定义了安卓中与接打电话相关的一些功能的实现。本文主要介绍这其中对于HFP非常重要的Service Level Connection的建立。首先...

底层码农 772

kubernetes集群部署GlusterFS分布式文件系统

#1.metadata:data:EOF##2.metadata:true 2d23h定义文件如下,该PVC申请1G空间,StorageClass使用gluster-heketi。PVC一旦生成,系统便触发Heketi进行相应操作:1、GlusterFS集群上创建Brick,再创建Volume。

刘元林的博客 1661

机器学习势能(MLPs) 第一章 基础理论与核心概念 第二章 数据生成与训练集构建

密度泛函理论(DFT)作为现代计算材料科学的基石,通过求解Kohn-Sham方程在电子结构层面提供可靠的势能面信息。然而,其计算复杂度随体系电子数呈O(N3) 至O(N4) 增长,对于包含数百个原子的体系,单点计算往往需消耗数小时至数天的计算资源。这一瓶颈严重限制了分子动力学模拟的时间尺度,传统DFT-MD通常仅能覆盖皮秒量级,远不足以观测扩散、相变等慢动力学过程。经验力场通过解析函数形式描述原子间相互作用,实现了经典力学的计算效率,但其参数化过程高度依赖物理直觉与经验调参。

VectorShift的博客 185

ICLR 2025 | MambaPEFT: 探索针对Mamba的参数高效微调方法

通过利用海量数据构建大型模型,基于Transformer的模型生态系统已逐步确立。参数高效微调(PEFT)是一项至关重要的技术,它能以最低成本将这些模型应用于下游任务,同时实现高效的性能表现。最近,基于状态空间模型(SSM)的Mamba模型作为Transformer的潜在替代方案受到了广泛关注。尽管已经提出了许多基于Mamba的大规模模型,但如何高效地将预训练的Mamba模型应用于下游任务仍有待研究。在本文中,作者对适用于Mamba的PEFT方法展开了探索性分析。

小白学视觉 329

GlusterFS 部署全攻略:详细步骤与要点解析(下)

GlusterFS 部署全攻略:详细步骤与要点解析(下)

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 1197

31、MSP430FR2355时钟系统与低功耗模式解析

本文详细解析了MSP430FR2355的时钟系统和低功耗模式。首先介绍了时钟系统的组成,包括XT1振荡器、DCO、MODCLK、MCLK、SMCLK和ACLK的功能与配置方法。接着探讨了MSP430FR2355的五种低功耗模式及其配置要点,并分析了时钟系统与低功耗模式之间的协同关系。最后通过实际应用案例展示了如何在具体场景中优化系统功耗。文章旨在帮助开发者充分利用MSP430FR2355的时钟与低功耗特性,实现高性能、低功耗的嵌入式系统设计。

mars5的博客 198

在k8s中部署glusterfs-kubernetes

GlusterFS是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBandRDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。 Heketi(https://github.com/heketi/heketi),是一个基于RESTful API的GlusterFS卷管...

weixin_30664539的博客 500

Android Jetpack 最全面试题及参考答案

要使用 WorkManager 定义一个异步任务,以下是详细步骤。首先,需要创建一个继承自 Worker 类的自定义类,这个类代表了要执行的具体任务逻辑。// 在这里编写具体的任务逻辑,比如从网络下载文件try {在上述代码中,doWork方法就是任务的核心执行逻辑所在,这里模拟了从给定的 URL 下载文件到本地的操作,若下载成功返回,若出现异常则返回。然后,在需要调度任务的地方,比如在某个 Activity 或者 Fragment 中,通过构建 WorkRequest 来安排任务执行。

大模型大数据攻城狮的专栏 1899

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

使用GlusterFS和kubernetes部署PostgreSQL

k8s学习官网:k8s中文文档 使用基于浏览器的交互式场景学习Kubernetes:https://www.katacoda.com/courses/kubernetes 容器学习:https://developer.ibm.com/zh/series/kubernetes-learning-path/ 0.前提:搭建GlusterFS集群参考文章:K8S中使用glusterfs 1.拉PostgreSQL image $ docker pull postgres:12.1 2.创建Gluster En

supergirlll的博客 476

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

部署 Kubernetes 持久化存储 GlusterFS

第四章 部署 Kuberbetes 持久化存储 Glusterfs 文章目录第四章 部署 Kuberbetes 持久化存储 Glusterfs前言一、准备工作1、下载 gluster-kubernetes-master2、GlusterFS 客户端安装3、加载相应模块4、K8S 集群 node 添加标签二、Kubernetes 安装 Glusterfs 集群1、修改 gluster-kubernetes-master 得yaml模板文件。1.1 deploy-heketi-deployment.yaml1.

weixin_43354218的博客 1258

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

带你玩转kubernetes-k8s(第26篇:k8s-深入掌握Pod-使用StatefulSet 搭建MongoDB已经GlusterFS+Heketi的部署-1)

昨天的内容,大家了解概念就好,至于实例,我们后面service章节详细来做。 本节以MongoDB为例,使用StatefulSet 完成MongoDB集群的创建,为每个MongoDB实例在共享存储中(这里采用GlusterFs)都申请一篇存储空间,以实现一个无单点故障、高可用、可动态扩展的MongoDB集群。部署架构如下图: 前提条件 在创建StatefulSet ...

坚持的道路注定孤独 2732

Kubernetes部署(十):储存之glusterfs和heketi部署

相关内容: Kubernetes部署(一):架构及功能说明Kubernetes部署(二):系统环境初始化Kubernetes部署(三):CA证书制作Kubernetes部署(四):ETCD集群部署Kubernetes部署(五):Haproxy、Keppalived部署Kubernetes部署(六):Master节点部署Kubernetes部署(七):Node节点部署Kubernetes部署(八):...

weixin_34405925的博客 1067

Kubernetes中部署Heketi和GlusterFS

Kubernetes中部署Heketi和GlusterFS Kubernetes中部署Heketi和GlusterFS 1. 前言 2. 环境说明 3. gluster-kubernetes部署 1. 前言 在Kubernetes中,使用GlusterFS文件系统,操作步骤通常是: 创建brick–&gt;创建volume–&gt;创建PV–&gt;创建PVC–&gt;Pod...

ygqygq2的IT博客 2856

Kubernetes 集群存储解决方案:GlusterFS 深度解析

本文介绍了在Kubernetes集群中部署GlusterFS分布式存储系统的方案。GlusterFS作为开源分布式文件系统,支持PB级存储和横向扩展,通过Heketi实现卷管理。环境包括3节点k8s集群(v1.21.10)和3节点GlusterFS集群(各100G硬盘)。部署步骤涵盖主机配置(IP、免密登录、硬盘格式化挂载)、安全设置(关闭防火墙和SELinux),并借助Heketi的RESTful API实现与k8s的集成,确保存储副本均匀分布。

qq_62935472的博客 1006

K8S部署Heketi与GlusterFS实战指南

/heketi-cli -s $HEKETI_CLI_SERVER(heketi的server接口) --user admin --secret 'hsop' topology load --json=/opt/heketi/topology.json。./heketi-cli -s http://192.168.0.210:8080 --user admin --secret 'hsop' cluster list 查看集群。最后在K8S上创建storageclass。log都正常的话表示启动成功。

cleveryangguang的博客 618

在Kubernetes中部署GlusterFS+Heketi

目录 简介 Gluster-Kubernetes 部署 环境准备 下载相关文件 部署glusterfs 部署heketi server端 配置heketi client 简介 在上一篇《...

weixin_34050427的博客 314

glusterfs中部署mysql_Centos7通过Kubernetes+GlusterFS部署wordpress+mysql

glusterfs 3.12.3操作步骤这里的配置步骤都是基于前几篇文章来的,就不详细说明了PV&PVC配置1.编写mysql pv yaml文件如下:[root@k8s-master yaml]# vi glusterfs-pv.yamlapiVersion: v1kind: PersistentVolumemetadata:name: wordpress-mysqllabels:nam...

weixin_39717865的博客 193

Kubernetes存储之Heketi管理GlusterFS

Kubernetes存储之Heketi管理GlusterFS GlusterFS是一个可扩展,分布式文件系统,集成来自多台服务器上的磁盘存储资源到单一全局命名空间,以提供共享文件存储 特点: 可以扩展到几PB容量 支持处理数千个客户端 兼容POSIX接口 使用通用硬件,普通服务器即可构建 能够使用支持扩展属性的文件系统,例如ext4,XFS 支持...

weixin_44949973的博客 2138

独立部署GlusterFS+Heketi实现Kubernetes共享存储

目录 环境 glusterfs配置 安装 测试 heketi配置 部署 简介 修改heketi配置文件 配置ssh密钥 启动heketi 生产案例 heketi添加glusterfs 添加cluster 将4个glusterfs作为node添加到cluster 添加device 生产实际配置 添加volume 配置kubernetes使用glusterfs 创建storageclass 创建pvc 创建pod,使用pvc 环境 主机名 系统

因上努力,果上随缘。但行好事,莫问前程。 1167
上一篇: 面试问题(jvm怎么判断一个对象已经没用)
下一篇: Centos7下Kubernetes配置使用GlusterFS
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值