StorageClass&PV&PVC関係図
-
ボリュームは最も基本的なストレージ抽象化であり、ローカルストレージ、NFS、FC、多数のクラウドストレージなど、複数のタイプをサポートします。特定のストレージシステムをサポートする独自のストレージプラグインを作成することもできます。ボリュームは、ポッドまたはPVで直接使用できます。通常のボリュームとポッドの間には静的なバインド関係があります。ポッドを定義するとき、ストレージタイプはボリューム属性によって定義され、コンテナ内のマウントポイントはボリュームマウントによって定義されます。
-
PersistentVolume。通常のボリュームとは異なり、PVはKubernetesのリソースオブジェクトです。PVの作成は、ストレージリソースオブジェクトの作成と同じです。このリソースの使用は、PVCを介して要求する必要があります。
-
PersistentVolumeClaim。PVCは、ストレージリソースPVに対するユーザーの要求です。Kubernetesは、システム内のPVリソースを動的に検索し、PVCで指定された条件に従ってそれらをバインドします。現在、PVCとPVは、StorageClassName、matchLabels、matchExpressionsの3つの方法で照合できます。
- StorageClass。ストレージカテゴリ。現在、kubernetesは、ceph、nfs、glusterfsなどの多くのストレージをサポートしています。。。
次に、この記事では、前の記事「rpmを使用してcephクラスターをデプロイする方法を教えてください」で作成したcephクラスターを使用して、kubernetesのストレージを提供します。
ストレージクラスを作成する
1.管理者キーを取得します
grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF }'|base64
QVFCZ2ZZOWJ1dGdBQ0JBQXN5dGdLZ1BFOGlsblIzWjJqNVVKMUE9PQ==
2.ceph-secret-admin.yamlを記述します
apiVersion: v1
kind: Secret
metadata:
name: ceph-secret-admin
type: "kubernetes.io/rbd"
data:
key: QVFCZ2ZZOWJ1dGdBQ0JBQXN5dGdLZ1BFOGlsblIzWjJqNVVKMUE9PQ==
3.秘密を作成する
kubectl apply -f ceph-secret-admin.yaml
kubectl get secret
NAME TYPE DATA AGE
ceph-secret-admin kubernetes.io/rbd 1 6m
4.rbd-storage-class.yamlを変更します
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rbd
provisioner: kubernetes.io/rbd
parameters:
monitors: 192.168.100.100:6789,192.168.100.101:6789,192.168.100.102:6789
adminId: admin
adminSecretName: ceph-secret-admin
adminSecretNamespace: default
pool: k8s
userId: admin
userSecretName: ceph-secret-admin
userSecretNamespace: default
fsType: ext4
imageFormat: "2"
imageFeatures: "layering"
5.ストレージクラスを作成します
kubectl apply -f rbd-storage-class.yaml
[root@qd01-stop-cloud001 rbd]# kubectl get sc
NAME PROVISIONER AGE
rbd kubernetes.io/rbd 4m
PVCとPVを作成する
6.pvc.yamlを作成します
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: claim
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: rbd
resources:
requests:
storage: 1Gi
7. pvcを確認します。表示ステータスは、成功を示すためにバインドされています。
kubectl apply -f pvc.yaml
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
claim Bound pvc-130c2445-b4a5-11e8-9d27-782bcb3bb379 1Gi RWO slow 13m
テスト検証
8.pod.yamlを作成します
apiVersion: v1
kind: ReplicationController
metadata:
name: server
spec:
replicas: 1
selector:
role: server
template:
metadata:
labels:
role: server
spec:
containers:
- name: server
image: nginx
volumeMounts:
- mountPath: /var/lib/www/html
name: mypvc
volumes:
- name: mypvc
persistentVolumeClaim:
claimName: claim
9.マウントされたストレージを表示する
/dev/rbd0 1G 9.1M 0.98G 1% /var/lib/kubelet/plugins/kubernetes.io/rbd/mounts/k8s-image-kubernetes-dynamic-pvc-198f56b3-b4a5-11e8-97eb-782bcb3bb379
エラー処理
如果出错failed to create rbd image: executable file not found in $PATH
https://blog.csdn.net/aixiaoyang168/article/details/79120095を参照してください。
次のアイテムを使用して、ストレージクラスを作成できます。
外部ストレージを使用してストレージクラスを作成する
$ git clone https://github.com/kubernetes-incubator/external-storage.git
$ tree external-storage/ceph/rbd/deploy/
├── README.md
├── non-rbac
│ └── deployment.yaml
└── rbac
├── clusterrole.yaml
├── clusterrolebinding.yaml
├── deployment.yaml
└── serviceaccount.yaml
Install without RBAC roles:
cd $GOPATH/src/github.com/kubernetes-incubator/external-storage/ceph/rbd/deploy
kubectl apply -f ./non-rbac
Install with RBAC roles:
cd $GOPATH/src/github.com/kubernetes-incubator/external-storage/ceph/rbd/deploy
NAMESPACE=default # change this if you want to deploy it in another namespace
sed -r -i "s/namespace: [^ ]+/namespace: $NAMESPACE/g" ./rbac/clusterrolebinding.yaml ./rbac/rolebinding.yaml
kubectl -n $NAMESPACE apply -f ./rbac
シークレットとプロビジョナーが同じ名前名にない場合、シークレットのアクセス許可は十分ではありません。
解決策:
次のファイルにシークレット権限を追加しますexternal-storage/ceph/rbd/deploy/rbac/clusterrole.yaml
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "create", "delete"]