Kubernetes GlusterFSベースの動的ストレージ管理StorageClass

18721 ワード

説明
最近、ステータスサービスを配備する必要があるため、クラウド環境のサポートがなく、cloud providerを通じてクラウドディスクEBSを呼び出すことができないため、nodeノードにglusterFS分布式ファイルストレージシステムを配備し、非構造化データストレージ、ピクチャ、大ファイルなどを提供する.
KubernetesではGlusterFSを永続化ストレージとして使用しており、storageClassの使用を提供するにはHeketiツールに依存する必要があります.Heketiはresetfulインタフェースを持つglusterfs管理プログラムで、kubernetesのStorageとして格納されているexternal provisionerです.「Heketiには、GlusterFSボリュームのライフサイクルを管理するRESTful管理インタフェースが用意されています.OpenStack Manila、Kubernetes、OpenShiftのようなクラウドサービスによって、GlusterFSボリュームとサポートされている永続性のタイプを動的に構成できます.Heketiは、クラスタ全体のbrick位置を自動的に特定し、brickとそのコピーを異なる障害ドメインに配置することを保証します.Heketiはetiはまた、単一のGlusterFSクラスタに限定されることなく、クラウドサービスがネットワークファイルストレージを提供することを可能にする任意の数のGlusterFSクラスタをサポートする.
heketi:RESTfulインタフェースに基づいてglusterfsを管理する機能を提供し、便利にクラスタ管理glusterfsのnode,device,volumeを作成することができる;k 8 sと結合して動的なPVを作成することができ、glusterfs記憶の動的管理機能を拡張することができる.主にglusterFS volumeの生命周期を管理するために用いられ、初期化時に裸ディスク(フォーマットされていない)設備を割り当てる.
注意事項
  • Glusterfsクライアントのインストール:各kubernetesクラスタのノードにはglusterfs-cli,glusterfs-fuseなどのgulsterfsクライアントをインストールする必要があります.主にnodeノードごとにvolumeをマウントするために使用されます.
  • カーネルモジュールのロード:各kubernetesクラスタのノードはmodprobe dm_thin_poolを実行し、カーネルモジュールをロードする.
  • 高可用性(少なくとも3つのノード):glusterfsクラスタを配備するために少なくともノードが必要であり、この3つのノードは各ノードに少なくとも1つの空きディスクが必要である.
  • インフラストラクチャの要件:
  • 実行中のKubernetesクラスタは、少なくとも3つのnodeノードがあり、各ノードには少なくとも1つの利用可能な裸のブロックデバイス(EBSボリュームやローカルディスクなど、フォーマットされていない)がある.
  • GlusterFSノードを実行するには、GlusterFS通信に対応するポートを開く必要があります(ファイアウォールが開いている場合は、これらの操作は必要ありません).各ノードで次のコマンド
  • を実行します.
    $ sudo iptables -N heketi
    $ sudo iptables -A heketi -p tcp -m state --state NEW -m tcp --dport 24007 -j $ sudo ACCEPT
    $ sudo iptables -A heketi -p tcp -m state --state NEW -m tcp --dport 24008 -j ACCEPT
    $ sudo iptables -A heketi -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
    $ sudo iptables -A heketi -p tcp -m state --state NEW -m multiport --dports 49152:49251 -j ACCEPT
    $ sudo service iptables save
    

    Heketiインストール
    Heketiはgolangによって作成され、直接静的コンパイルでバイナリを実行することもできます.yumインストールやdocker導入によって、主にdbファイルにcluster、node、device、volumeなどの情報が格納されます.
    #/bin/bash
    wget -c https://github.com/heketi/heketi/releases/download/v8.0.0/heketi-v8.0.0.linux.amd64.tar.gz
    tar xzf heketi-v8.0.0.linux.amd64.tar.gz
    mkdir -pv /data/heketi/{bin,conf,data}
    cp heketi/heketi.json /data/heketi/conf/
    cp heketi/{heketi,heketi-cli} /data/heketi/bin/
    mv heketi-v8.0.0.linux.amd64.tar.gz /tmp/
    

    ssh-keyの作成
    我々glusterFSはk 8 sクラスタの外に配置されているので、heketiはsshを通じてglusterFSを管理します.すべてのglusterFSノードに秘密鍵なしでログインする必要があります.
    $ sudo  ssh-keygen -f /data/heketi/conf/heketi_key -t rsa -N ''
    #        GlusterFS  
    $ sudo ssh-copy-id -i /data/heketi/conf/heketi_key.pub root@node1
    $ ...
    
    

    プロファイルの変更
    リファレンスhttps://github.com/heketi/heketi/blob/master/client/cli/go/topology-sample.json
    {
      "_port_comment": "Heketi Server Port Number",
      "port": "18080",
    
      "_use_auth": "Enable JWT authorization. Please enable for deployment",
      #     
      "use_auth": true,
    
      "_jwt": "Private keys for access",
      "jwt": {
        "_admin": "Admin has access to all APIs",
        # admin   key
        "admin": {
          "key": "adminkey"
        },
        "_user": "User only has access to /volumes endpoint",
        "user": {
          "key": "userkey"
        }
      },
    
      "_glusterfs_comment": "GlusterFS Configuration",
      "glusterfs": {
        "_executor_comment": [
          "Execute plugin. Possible choices: mock, ssh",
          "mock: This setting is used for testing and development.",
          "      It will not send commands to any node.",
          "ssh:  This setting will notify Heketi to ssh to the nodes.",
          "      It will need the values in sshexec to be configured.",
          "kubernetes: Communicate with GlusterFS containers over",
          "            Kubernetes exec api."
        ],
        #        ssh,   ssh     ,             ssh  ,  ssh-copy-id pub key    glusterfs    
        # heketi   ssh    glusterfs volume    。
        "executor": "ssh",
    
        "_sshexec_comment": "SSH username and private key file information",
        "sshexec": {
           # ssh-keygen   ,     glusterfs    
          "keyfile": "/data/heketi/conf/heketi_key",
          "user": "root",
          "port": "22",
          #      volume,heketi   fstab              。
          "fstab": "/etc/fstab"
        },
    
        "_kubeexec_comment": "Kubernetes configuration",
        "kubeexec": {
          "host" :"https://kubernetes.host:8443",
          "cert" : "/path/to/crt.file",
          "insecure": false,
          "user": "kubernetes username",
          "password": "password for kubernetes user",
          "namespace": "OpenShift project or Kubernetes namespace",
          "fstab": "Optional: Specify fstab file on node.  Default is /etc/fstab"
        },
    
        "_db_comment": "Database file name",
        #   heketi  db  
        "db": "/data/heketi/data/heketi.db",
    
        "_loglevel_comment": [
          "Set log level. Choices are:",
          "  none, critical, error, warning, info, debug",
          "Default is warning"
        ],
        "loglevel" : "debug"
      }
    }
    

    注意:
  • 説明する必要があるのは、heketiには3種類のexecutorがあり、それぞれmock、ssh、kubernetesであり、テスト環境でmockを使用し、生産環境でsshを使用することを提案し、glusterfsが容器でkubernetesに配置された場合、kubernetesを使用する.ここではglusterfsとheketiを独立して配置し、sshを使用する.
  • dockerを使用して配備する場合は、/var/lib/heketi/mountsをコンテナにマウントする必要があります.heketiはこのディレクトリをgluster volumeのマウントポイントとします.
  • [root@k8s1 ~]# more /etc/fstab
    #
    # /etc/fstab
    # Created by anaconda on Sun Oct 15 15:19:00 2017
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=eb448abb-3012-4d8d-bcde-94434d586a31 /                       ext4    defaults        1 1
    UUID=63b64b3a-2961-4798-b7f1-cc97484ee49f /data                   ext4    defaults        1 1
    /dev/mapper/vg_fd3a11426117508af77aa38e9565ce65-brick_4b7854340fa8ee78106b1b1446abf078 /var/lib/heketi/mounts/vg_fd3a11426117508af77aa38e9565ce65/brick_4b
    7854340fa8ee78106b1b1446abf078 xfs rw,inode64,noatime,nouuid 1 2
    /dev/mapper/vg_fd3a11426117508af77aa38e9565ce65-brick_1904166cdf0846ee649ccefe66ce1e50 /var/lib/heketi/mounts/vg_fd3a11426117508af77aa38e9565ce65/brick_19
    04166cdf0846ee649ccefe66ce1e50 xfs rw,inode64,noatime,nouuid 1 2
    

    システム構成
    # cat /usr/lib/system/systemd/heketi.service
    [Unit]
    Description=RESTful based volume management framework for GlusterFS
    Before=network-online.target
    After=network-online.target
    Documentation=https://github.com/heketi/heketi
    
    [Service]
    Type=simple
    LimitNOFILE=65536
    ExecStart=/data/heketi/bin/heketi --config=/data/heketi/conf/heketi.json
    KillMode=process
    Restart=on-failure
    RestartSec=5
    SuccessExitStatus=15
    StandardOutput=syslog
    StandardError=syslog
    
    [Install]
    WantedBy=multi-user.target
    

    heketiサービスの開始
    $ sudo systemctl start heketi
    $sudo systemctl enable heketi
    $sudo systemctl status heketi
    

    Heketi管理GlusterFS
    clusterの追加
    
    $ sudo heketi-cli --user admin --server http://10.111.209.188:18080 --secret adminkey --json  cluster create
    {"id":"d102a74079dd79aceb3c70d6a7e8b7c4","nodes":[],"volumes":[],"block":true,"file":true,"blockvolumes":[]}
    
    

    3つのglusterfsノードをnodeとしてclusterに追加
    heketi認証をオンにしたので、heketi-cli操作を実行するたびに、認証フィールドを山積みにする必要があります.面倒ですが、ここで別名を作成して、関連操作を回避します.
    
    $ sudo  alias heketi-cli='heketi-cli --server "[http://192.168.75.175:18080"](http://192.168.75.175:18080/) --user "admin" --secret "adminkey"'
    
    

    ノードの追加
    
    $sudo heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name k8s1 --storage-host-name 10.111.209.188  --zone 1
    
    $sudo heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name k8s1 --storage-host-name 10.111.209.189 --zone 1
    
    $sudo heketi-cli --json node add --cluster "d102a74079dd79aceb3c70d6a7e8b7c4" --management-host-name k8s3 --storage-host-name  10.111.209.190 --zone 1
    
    

    注意:heketi実行アカウントがrootでない場合は、sudo権限を保証する必要があります.
    デバイスの追加
    マシンはglusterの実行ユニットとしてのみ使用され、volumeはdeviceに基づいて作成されます.また、heketiは現在、ファイルシステムをサポートしていない裸のパーティションまたは裸のディスク(フォーマットされていない)を使用してdeviceに追加することをサポートしています.
    
    # --node     id      node    ,            ,     ,                   `
    
    $ sudo  heketi-cli  -json device add -name="/dev/vdc1" --node ``"2e4dc73fb2657586e7a9e64e39c8f01a"
    
    $ sudo heketi-cli node list`
    
    Id:2e4dc73fb2657586e7a9e64e39c8f01a     Cluster:d102a74079dd79aceb3c70d6a7e8b7c4
    
    Id:43a661a917c42dfe9b6659b8c9d848e9     Cluster:d102a74079dd79aceb3c70d6a7e8b7c4
    
    Id:ce5a9e2983d067051b6ccad0a4bd0988     Cluster:d102a74079dd79aceb3c70d6a7e8b7c4
    
    

    本番構成
    以上のad-hocコマンドは、プロファイルを作成してインポートできます.
    
    $ sudo  cat /data/heketi/conf/topology.json
    
    {
        "clusters": [
            {
                "nodes": [
                    {
                        "node": {
                            "hostnames": {
                                "manage": [
                                    "k8s1"
                                ],
                                "storage": [
                                    "10.111.209.188"
                                ]
                            },
                            "zone": 1
                        },
                        "devices": [
                            "/dev/vdc1"
                        ]
                    },
                    {
                        "node": {
                            "hostnames": {
                                "manage": [
                                    "k8s2"
                                ],
                                "storage": [
                                    "10.111.209.189"
                                ]
                            },
                            "zone": 1
                        },
                        "devices": [
                            "/dev/vdc1"
                        ]
                    },
                    {
                        "node": {
                            "hostnames": {
                                "manage": [
                                    "k8s3"
                                ],
                                "storage": [
                                    "10.111.209.190"
                                ]
                            },
                            "zone": 1
                        },
                        "devices": [
                            "/dev/vdc1"
                        ]
                    }             
                ]
            }
        ]
    }
    
    

    作成:
    
    $ sudo heketi-cli  topology load --json topology.json
    
    

    volumeの追加
    ここではテストを行うだけで、実際に使用するとkubernetesが自動的にpvを作成します.
    サイズ3 G、コピー2のvolumeを作成
    
    $ sudo  heketi-cli volume create --size 3 --replica 2
    
    Name: vol_685f9aea1896f53f30a22a9d15de1680
    
    Size: 3
    
    Volume Id: 685f9aea1896f53f30a22a9d15de1680
    
    Cluster Id: d102a74079dd79aceb3c70d6a7e8b7c4
    
    Mount: 10.111.209.188:vol_685f9aea1896f53f30a22a9d15de1680
    
    Mount Options: backup-volfile-servers=10.111.209.190,10.111.209.189
    
    Block: false
    
    Free Size: 0
    
    Reserved Size: 0
    
    Block Hosting Restriction: (none)
    
    Block Volumes: []
    
    Durability Type: replicate
    
    Distributed+Replica: 2
    
    

    kubernetes storageclass構成
    storageclassの作成
    storageclass-glusterfs.yamlファイルを追加します.内容は次のとおりです.
    
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: heketi-secret
      namespace: default
    data:
      # base64 encoded password. E.g.: echo -n "mypassword" | base64
      key: YWRtaW5rZXk=
    type: kubernetes.io/glusterfs
    
    ---
    apiVersion: storage.k8s.io/v1beta1
    kind: StorageClass
    metadata:
      name: glusterfs
    provisioner: kubernetes.io/glusterfs
    allowVolumeExpansion: true
    parameters:
      resturl: "http://10.111.209.188:18080"
      clusterid: "6fd6bf78b84315e12abcf8b6db6b1a40"
      restauthenabled: "true"
      restuser: "admin"
      #secretNamespace: "default"
      #secretName: "heketi-secret"
      restuserkey: "adminkey"
      gidMin: "40000"
      gidMax: "50000"
      volumetype: "replicate:2"
    # kubectl apply -f glusterfs-storageclass.yml
    secret/heketi-secret created
    storageclass.storage.k8s.io/glusterfs created
    # kubectl get sc
    NAME                  PROVISIONER               AGE
    glusterfs (default)   kubernetes.io/glusterfs   2m19s
    

    注意:
  • storageclass.beta.kubernetes.io/is-default-class:「true」#このstorageclassをdefault scとして表し、pvcを作成してscを指定しない場合、デフォルトでこのscを使用します.
  • reclaimPolicy:Retainは、pv回収ポリシーが保持されていることを示し、pvcを削除するとpvは削除されません.
  • 使用方法の詳細:https://kubernetes.io/docs/concepts/storage/storage-classes/#glusterfs
    pvcの作成
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: glusterfs-mysql1
      namespace: default
      annotations:
        volume.beta.kubernetes.io/storage-class: "glusterfs"
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
          
    # kubectl create -f glusterfs-pvc.yaml
    persistentvolumeclaim/glusterfs-mysql1 created
    # kubectl get pv,pvc
    NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE
    persistentvolume/pvc-11aa48c5-fe0f-11e8-9803-00163e13b711   1Gi        RWX            Retain           Bound    default/glusterfs-mysql1   glusterfs               2m
    
    NAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/glusterfs-mysql1   Bound    pvc-11aa48c5-fe0f-11e8-9803-00163e13b711   1Gi        RWX            glusterfs      2m20s
    
    

    podを作成しpvcを使用
    ---
    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: gluster-mysql-data
              persistentVolumeClaim:
                claimName: glusterfs-mysql1
                
    # kubectl create -f /etc/kubernetes/mysql-deployment.yaml
    deployment.extensions/mysql created
    # kubectl exec -it mysql-84786cf494-hb2ss -- df -PHT /var/lib/mysql
    Filesystem                                          Type            Size  Used Avail Use% Mounted on
    10.111.209.188:vol_426e62366141c789dac33f2e68dfb13b fuse.glusterfs  1.1G  266M  798M  25% /var/lib/mysql
    
    

    statefulsetの作成
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx # has to match .spec.template.metadata.labels
      serviceName: "nginx"
      replicas: 3 # by default is 1
      template:
        metadata:
          labels:
            app: nginx # has to match .spec.selector.matchLabels
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "glusterfs"
          resources:
            requests:
              storage: 1Gi
    # kubectl apply -f nginx-statefulset.yml
    service/nginx created
    statefulset.apps/nginx created
    
    
    # kubectl get pod,pv,pvc
    NAME           READY   STATUS    RESTARTS   AGE
    pod/nginx-0    1/1     Running   0          116s
    pod/nginx-1    1/1     Running   0          98s
    pod/nginx-2    1/1     Running   0          91s
    
    NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
    persistentvolume/pvc-5ac3eba9-fe12-11e8-a19e-00163e14b18f   1Gi        RWO            Retain           Bound    default/www-nginx-0   glusterfs               99s
    persistentvolume/pvc-65f27519-fe12-11e8-a19e-00163e14b18f   1Gi        RWO            Retain           Bound    default/www-nginx-1   glusterfs               93s
    persistentvolume/pvc-69b31512-fe12-11e8-a19e-00163e14b18f   1Gi        RWO            Retain           Bound    default/www-nginx-2   glusterfs               86s
    
    NAME                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/www-nginx-0   Bound    pvc-5ac3eba9-fe12-11e8-a19e-00163e14b18f   1Gi        RWO            glusterfs      116s
    persistentvolumeclaim/www-nginx-1   Bound    pvc-65f27519-fe12-11e8-a19e-00163e14b18f   1Gi        RWO            glusterfs      98s
    persistentvolumeclaim/www-nginx-2   Bound    pvc-69b31512-fe12-11e8-a19e-00163e14b18f   1Gi        RWO            glusterfs      91s
    

    RECLAIM POLICY:Retainがテストされたことがわかります
  • pvcを削除すると、pv statusはReleased状態になり、削除されません
  • pvを削除し、heketi-cli volume listで表示すると、volumeは削除されません
  • kubernetes pvとgluster volumeが一致しない場合、heketiを使用してvolumeを統一的に管理できます.このドキュメントheketiとglusterfsは、kubernetesクラスタの外に配置されています.AWS EBSをサポートするディスクについては、EBS storageClass方式でglusterFS heketiをコンテナに配置して管理できます.参照https://github.com/gluster/gluster-kubernetes
    リファレンスドキュメント
  • https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
  • https://kubernetes.io/docs/concepts/storage/storage-classes/#glusterfs
  • https://github.com/heketi/heketi/blob/master/docs/admin/readme.md
  • https://www.cnblogs.com/breezey/p/8849466.html