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クラスタのノードは 高可用性(少なくとも3つのノード):glusterfsクラスタを配備するために少なくともノードが必要であり、この3つのノードは各ノードに少なくとも1つの空きディスクが必要である. インフラストラクチャの要件:実行中のKubernetesクラスタは、少なくとも3つのnodeノードがあり、各ノードには少なくとも1つの利用可能な裸のブロックデバイス(EBSボリュームやローカルディスクなど、フォーマットされていない)がある. GlusterFSノードを実行するには、GlusterFS通信に対応するポートを開く必要があります(ファイアウォールが開いている場合は、これらの操作は必要ありません).各ノードで次のコマンド を実行します.
Heketiインストール
Heketiはgolangによって作成され、直接静的コンパイルでバイナリを実行することもできます.yumインストールやdocker導入によって、主にdbファイルにcluster、node、device、volumeなどの情報が格納されます.
ssh-keyの作成
我々glusterFSはk 8 sクラスタの外に配置されているので、heketiはsshを通じてglusterFSを管理します.すべてのglusterFSノードに秘密鍵なしでログインする必要があります.
プロファイルの変更
リファレンスhttps://github.com/heketi/heketi/blob/master/client/cli/go/topology-sample.json
注意:説明する必要があるのは、heketiには3種類のexecutorがあり、それぞれmock、ssh、kubernetesであり、テスト環境でmockを使用し、生産環境でsshを使用することを提案し、glusterfsが容器でkubernetesに配置された場合、kubernetesを使用する.ここではglusterfsとheketiを独立して配置し、sshを使用する. dockerを使用して配備する場合は、/var/lib/heketi/mountsをコンテナにマウントする必要があります.heketiはこのディレクトリをgluster volumeのマウントポイントとします.
システム構成
heketiサービスの開始
Heketi管理GlusterFS
clusterの追加
3つのglusterfsノードをnodeとしてclusterに追加
heketi認証をオンにしたので、heketi-cli操作を実行するたびに、認証フィールドを山積みにする必要があります.面倒ですが、ここで別名を作成して、関連操作を回避します.
ノードの追加
注意:heketi実行アカウントがrootでない場合は、sudo権限を保証する必要があります.
デバイスの追加
マシンはglusterの実行ユニットとしてのみ使用され、volumeはdeviceに基づいて作成されます.また、heketiは現在、ファイルシステムをサポートしていない裸のパーティションまたは裸のディスク(フォーマットされていない)を使用してdeviceに追加することをサポートしています.
本番構成
以上のad-hocコマンドは、プロファイルを作成してインポートできます.
作成:
volumeの追加
ここではテストを行うだけで、実際に使用するとkubernetesが自動的にpvを作成します.
サイズ3 G、コピー2のvolumeを作成
kubernetes storageclass構成
storageclassの作成
storageclass-glusterfs.yamlファイルを追加します.内容は次のとおりです.
注意: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の作成
podを作成しpvcを使用
statefulsetの作成
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
最近、ステータスサービスを配備する必要があるため、クラウド環境のサポートがなく、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の生命周期を管理するために用いられ、初期化時に裸ディスク(フォーマットされていない)設備を割り当てる.
注意事項
modprobe dm_thin_pool
を実行し、カーネルモジュールをロードする.$ 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"
}
}
注意:
[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
注意:
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がテストされたことがわかります
リファレンスドキュメント