kubernetesストレージクラスとPVおよびPVCの関係とその実践

StorageClass&PV&PVC関係図

kubernetesストレージクラスと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"]

おすすめ

転載: blog.51cto.com/1648324/2551888