Kubernetes 使用 Ceph 存儲

本文主要記錄一下 Kubernetes 使用 Ceph 存儲的相關配置過程,Kubernetes 集羣環境採用的 kargo 部署方式,而且全部組件以容器化運行node

1、基礎環境準備

Kubernetes 集羣總共有 5 臺,部署方式爲 kargo 容器化部署,採用 kargo 部署時確保配置中開啓內核模塊加載( kubelet_load_modules: true );Kubernetes 版本爲 1.6.4,Ceph 採用最新的穩定版 Jeweldocker

節點 IP 部署
docker1 192.168.1.11 master、monitor、osd
docker2 192.168.1.12 master、monitor、osd
docker3 192.168.1.13 node、monitor、osd
docker4 192.168.1.14 node、osd
docker5 192.168.1.15 node、osd

2、部署 Ceph 集羣

具體安裝請參考 Ceph 筆記(一)Ceph 筆記(二),如下直接上命令api

2.一、部署集羣

# 建立集羣配置目錄mkdir ceph-cluster && cd ceph-cluster# 建立 monitor-nodeceph-deploy new docker1 docker2 docker3# 追加 OSD 副本數量echo "osd pool default size = 5" >> ceph.conf# 安裝 cephceph-deploy install docker1 docker2 docker3 docker4 docker5# init monitor nodeceph-deploy mon create-initial# 初始化 odsceph-deploy osd prepare docker1:/dev/sda docker2:/dev/sda docker3:/dev/sda docker4:/dev/sda docker5:/dev/sda# 激活 osdceph-deploy osd activate docker1:/dev/sda1:/dev/sda2 docker2:/dev/sda1:/dev/sda2 docker3:/dev/sda1:/dev/sda2 docker4:/dev/sda1:/dev/sda2 docker5:/dev/sda1:/dev/sda2# 部署 ceph cli 工具和祕鑰文件ceph-deploy admin docker1 docker2 docker3 docker4 docker5# 確保祕鑰有讀取權限chmod +r /etc/ceph/ceph.client.admin.keyring# 檢測集羣狀態ceph health

2.二、建立塊設備

# 建立存儲池rados mkpool data# 建立 p_w_picpathrbd create data --size 10240 -p data# 關閉不支持特性rbd feature disable data exclusive-lock, object-map, fast-diff, deep-flatten -p data# 映射(每一個節點都要映射)rbd map data --name client.admin -p data# 格式化塊設備(單節點便可)mkfs.xfs /dev/rbd0

3、kubernetes 使用 Ceph

3.一、PV & PVC 方式

傳統的使用分佈式存儲的方案通常爲 PV & PVC 方式,也就是說管理員預先建立好相關 PV 和 PVC,而後對應的 deployment 或者 replication 掛載 PVC 來使用app

建立 Secret分佈式

# 獲取管理 key 並進行 base64 編碼ceph auth get-key client.admin | base64# 建立一個 secret 配置(key 爲上條命令生成的)cat << EOF >> ceph-secret.yml
apiVersion: v1
kind: Secret
metadata:
  name: ceph-secret
data:
  key: QVFDaWtERlpzODcwQWhBQTdxMWRGODBWOFZxMWNGNnZtNmJHVGc9PQo=
EOFkubectl create -f ceph-secret.yml

建立 PVide

# monitor 須要多個,pool 和 p_w_picpath 填寫上面建立的cat << EOF >> test.pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-pv
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  rbd:
    monitors:
      - 192.168.1.11:6789
      - 192.168.1.12:6789
      - 192.168.1.13:6789
    pool: data
    p_w_picpath: data
    user: admin
    secretRef:
      name: ceph-secret
    fsType: xfs
    readOnly: false
  persistentVolumeReclaimPolicy: Recycle
EOFkubectl create -f test.pv.yml

建立 PVC工具

cat << EOF >> test.pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
EOFkubectl create -f test.pvc.yml

建立 Deployment並掛載編碼

cat << EOF >> test.deploy.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        p_w_picpath: mritd/demo
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: "/data"
            name: data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: test-pvc
EOFkubectl create -f test.deploy.yml

3.二、StoragaClass 方式

在 1.4 之後,kubernetes 提供了一種更加方便的動態建立 PV 的方式;也就是說使用 StoragaClass 時無需預先建立固定大小的 PV,等待使用者建立 PVC 來使用;而是直接建立 PVC 便可分配使用spa

建立系統級 Secretcode

注意: 因爲 StorageClass 要求 Ceph 的 Secret type 必須爲 kubernetes.io/rbd,因此上一步建立的ceph-secret 須要先被刪除,而後使用以下命令從新建立;此時的 key 並無通過 base64

# 這個 secret type 必須爲 kubernetes.io/rbd,不然會形成 PVC 沒法使用kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCikDFZs870AhAA7q1dF80V8Vq1cF6vm6bGTg==' --namespace=kube-system
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" --from-literal=key='AQCikDFZs870AhAA7q1dF80V8Vq1cF6vm6bGTg==' --namespace=default

建立 StorageClass

cat << EOF >> test.storageclass.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: test-storageclass
provisioner: kubernetes.io/rbd
parameters:
  monitors: 192.168.1.11:6789,192.168.1.12:6789,192.168.1.13:6789
  # Ceph 客戶端用戶 ID(非 k8s 的)
  adminId: admin
  adminSecretName: ceph-secret
  adminSecretNamespace: kube-system
  pool: data
  userId: admin
  userSecretName: ceph-secret
EOFkubectl create -f test.storageclass.yml

關於上面的 adminId 等字段具體含義請參考這裏 Ceph RBD

建立 PVC

cat << EOF >> test.sc.pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-sc-pvc
  annotations: 
    volume.beta.kubernetes.io/storage-class: test-storageclass
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
EOFkubectl create -f test.sc.pvc.yml

建立 Deployment

cat << EOF >> test.sc.deploy.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: demo-sc
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-sc
    spec:
      containers:
      - name: demo-sc
        p_w_picpath: mritd/demo
        ports:
        - containerPort: 80
        volumeMounts:
          - mountPath: "/data"
            name: data
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: test-sc-pvc
EOFkubectl create -f test.sc.deploy.yml

到此完成,檢測是否成功最簡單的方式就是看相關 pod 是否正常運行

轉載請註明出處,本文采用 CC4.0 協議受權


本文轉自: https://mritd.me/2017/06/03/use-ceph-storage-on-kubernetes/

相關文章
相關標籤/搜索