跟我學 K8S--運維: helm 安裝 ceph 到 kubernetes 集羣

參考 ceph 官方文檔進行操做: http://docs.ceph.com/docs/mas...node

本文假設kubernetes 環境正常運行,而且 host 已經安裝 helm client。nginx

經過 helm 來部署 ceph 用到了社區的 ceph-helm 項目( https://github.com/ceph/ceph-... ),這是一個 helm 的 chart,本文使用的master 分支,最新commit id 爲743a7441ba4361866a6e017b4f8fa5c15e34e640。git

# 克隆 ceph-helm 代碼到本地
git clone https://github.com/ceph/ceph-helm/

# 若是環境中已經存在tiller 服務,則不須要執行下面這條命令
helm init

# ceph-helm 默認使用本地 helm-repo 的存儲 charts,要在本地啓動 helm repo 服務器,運行:
helm serve &
helm repo add my_local http://localhost:8879/charts

# 切換到 ceph-helm/ceph 目錄並執行編譯
cd ceps-helm/ceph
make

建議提早準備好須要的鏡像:github

docker pull docker.io/ceph/daemon:tag-build-master-luminous-ubuntu-16.04
  docker pull docker.io/kolla/ubuntu-source-kubernetes-entrypoint:4.0.0
  docker pull docker.io/port/ceph-config-helper:v1.7.5
  docker pull quay.io/external_storage/rbd-provisioner:v0.1.1
  docker pull docker.io/alpine:latest

具體部署步驟以下docker

1. 建立 ceph-overrides.yaml 文件

到此初步準備工做完成,爲了執行 helm 安裝,須要提供覆蓋 values.yaml 中默認值的配置項,一般命名爲ceph-overrides.yaml,其位置能夠任意。
因爲我用的是 openstack 上虛擬機,網段爲 10.24.0.0/24,而且虛擬機 attach 一塊 cinder 建立的雲硬盤,盤名爲 /dev/vdb,那麼就有了下面的配置文件。ubuntu

network:
  public:   10.24.0.0/24
  cluster:  10.24.0.0/24

osd_devices:
  - name: dev-vdb
    device: /dev/vdb
    zap: "1"

storageclass:
  name: ceph-rbd
  pool: rbd
  user_id: admin

注意,這裏的 storageclass中的user_id 若是不是 admin,則須要在 ceph 集羣手動建立並在 kubernetes 中建立對應的 secret。api

2. 在 kubernetes 環境提供權限和標籤

首先,ceph-helm 會把ceph 集羣安裝在 ceph 命名空間下,須要建立之。
其次,因爲kubernetes >= 1.6使用了 RBAC 的 admission controller,ceph-helm 須要爲每一個組件提供 RBAC 角色和權限。
最後,因爲安裝 ceph 組件的 ceph-mon 與ceph-osd-<device-name>屬於 daemonsets,知足label 條件後纔會安裝。服務器

# 建立 ceph namespace
kubectl create namespace ceph

# 建立相關 rbac
kubectl create -f ~/ceph-helm/ceph/rbac.yaml

# 爲節點打標籤
kubectl label node node-1 ceph-mon=enabled
kubectl label node node-2 ceph-mon=enabled
kubectl label node node-3 ceph-mon=enabled

kubectl label node node-1 ceph-mgr=enabled

kubectl label node node-1  ceph-osd-device-dev-vdb=enabled ceph-osd=enabled
kubectl label node node-2  ceph-osd-device-dev-vdb=enabled ceph-osd=enabled
kubectl label node node-3  ceph-osd-device-dev-vdb=enabled ceph-osd=enabled

注意ide

1) 這裏的 ceph-osd-dev-vdb 這個label 是根據 ceps-overrides.yaml中的 osd_devices 的名稱建立,若是每一個節點多個 osd 盤,那麼須要打相應個數的 labels。
2) ceph-mgr 只能以單副本運行

3. ceph 部署

運行 helm 命令來安裝 Ceph:ui

cd ~/ceph-helm

helm install --name=ceph ceph/ceph-0.1.0.tgz --namespace=ceph -f ceph-overrides.yaml

等待一段時間執行完成後,經過以下命令肯定 ceph 集羣是否成功運行:

# 檢查 kubernetes 的 pod 狀態
~ # kubectl get po -n ceph
NAME                                    READY     STATUS    RESTARTS   AGE
ceph-mds-5696f9df5d-8fc7l               0/1       Pending   0          3h
ceph-mgr-8656b978df-kcb6f               1/1       Running   0          3h
ceph-mon-9xqms                          3/3       Running   0          3h
ceph-mon-check-7d49bd686c-pkk7w         1/1       Running   0          3h
ceph-mon-tw5n5                          3/3       Running   0          3h
ceph-mon-x25rv                          3/3       Running   0          3h
ceph-osd-dev-vdb-9t8fh                  1/1       Running   0          2h
ceph-osd-dev-vdb-fgl8w                  1/1       Running   0          2h
ceph-osd-dev-vdb-sssqq                  1/1       Running   0          2h
ceph-rbd-provisioner-5544dcbcf5-97nxn   1/1       Running   0          3h
ceph-rbd-provisioner-5544dcbcf5-nfkhw   1/1       Running   0          3h
ceph-rgw-65b4bd8cc5-ml7gk               0/1       Pending   0          3h

# 檢查 ceph 集羣狀態
~ # kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- ceph -s
  cluster:
    id:     726cc770-3daa-4792-8cd9-b100aea87711
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum host-10-24-0-14,host-10-24-0-15,host-10-24-0-16
    mgr: host-10-24-0-14(active)
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   1 pools, 128 pgs
    objects: 3 objects, 16 bytes
    usage:   324 MB used, 104 GB / 104 GB avail
    pgs:     128 active+clean

至此,ceph 集羣部署完成。 可是 建立的 storageclass 中的 secret 爲空,須要更新 key:

# 獲取 ceph 集羣的 client-admin-keyring
kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- grep key /etc/ceph/ceph.client.admin.keyring |awk '{printf "%s", $NF}’|base64

# 將上面輸出的編碼的 keyring 填入到 storageclass使用的 secret: pvc-ceph-client-key中, 替換 null 爲以上值
kubectl edit secret pvc-ceph-client-key  -n ceph

# 建立並初始化 rbd 池
kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- ceph osd pool create rbd 128 
kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- rbd pool init rbd

最後, 驗證經過 storageclass 動態分配 rbd image。
~/template/ceph_connect # cat test-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-pvc-2
spec:
  accessModes:
   - ReadWriteOnce
  resources:
    requests:
       storage: 2Gi
  storageClassName: ceph-rbd


~/template/ceph_connect # kubectl get pvc
NAME         STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ceph-pvc     Bound     pvc-a56fd3d2-9157-11e8-bd1d-fa163eaae838   2Gi        RWO            ceph-pool      1h
ceph-pvc-2   Bound     pvc-b28baac0-9161-11e8-bd1d-fa163eaae838   2Gi        RWO            ceph-rbd       7s

~/template/ceph_connect # kubectl exec -it ceph-mon-9xqms -n ceph -c ceph-mon -- rbd ls
kubernetes-dynamic-pvc-a57200fe-9157-11e8-9008-fa163eaae838
kubernetes-dynamic-pvc-b2931fd1-9161-11e8-9ac7-0a580ae9410b

注意事項:

問題1

遇到了一個問題,從新安裝的時候 osd 會init/Error,是由於osd 盤頭部數據沒有被清理,致使osd的 initContainer 中的prepare-old-pod 這個 container 腳本執行錯誤,內容爲:
圖片描述

雖然已經在 ceph-overriders.yaml 的 osd-devices 中 設置了 zap=「1」,但多是代碼邏輯有問題,致使並無清理,須要手動清理,步驟爲:

# 查看/dev/vdb 設備狀態
~/template/ceph_connect # lsblk /dev/vdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vdb    252:16   0  40G  0 disk
|-vdb1 252:17   0  35G  0 part
`-vdb2 252:18   0   5G  0 part

# 經過 dd 向清空盤頭部的110M覆蓋分區信息
dd if=/dev/zero of=/dev/vdb1 bs=1M count=110 oflag=sync 
dd if=/dev/zero of=/dev/vdb2 bs=1M count=110 oflag=sync

# 經過 parted 刪除分區
parted /dev/vdb rm 1
parted /dev/vdb rm 2

問題2

storageclass 方式建立 pod 掛在 volume,老是報錯

timeout expired waiting for volumes to attach/mount for pod : 
Error syncing pod 096ac42b-919a-11e8-bd1d-fa163eaae838 ("mypod_ceph(096ac42b-919a-11e8-bd1d-fa163eaae838)"), skipping: timeout expired waiting for volumes to attach/mount for pod "ceph"/"mypod". list of unattached/unmounted volumes=[vol1]

具體的建立步驟是:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: ceph-pvc
  namespace: ceph
spec:
  accessModes:
   - ReadWriteOnce
  resources:
    requests:
       storage: 2Gi
  storageClassName: ceph-rbd
---
kind: Pod
apiVersion: v1
metadata:
  name: mypod
  namespace: ceph
spec:
  containers:
    - name: nginx
      image: nginx
      command:
        - sleep
        - "3600"
      volumeMounts:
      - mountPath: "/mnt/rbd"
        name: vol1
  volumes:
    - name: vol1
      persistentVolumeClaim:
        claimName: ceph-pvc

這個問題在網上目前沒有解決的明確說法,因爲看 log 沒有明顯報錯,pvc 和 pv 正常建立可是掛不上去,考慮多是 kubernetes 這邊調用 ceph 有問題,就將集羣內全部 host 的 ceph-common 包升級到對應的版本,解決了這個問題。若是遇到這個問題,不妨一試。我 host 的 ceph-common是以前對接 j 版 ceph 時安裝, 如今安裝的 l 版。

相關文章
相關標籤/搜索