天天看點

雲原生(三十三) | Kubernetes篇之平台存儲系統部署

雲原生(三十三) | Kubernetes篇之平台存儲系統部署

文章目錄

​​Kubernetes平台存儲系統部署​​

​​一、檢視前提條件​​

​​二、部署&修改operator​​

​​三、部署叢集​​

​​四、部署dashboard​​

​​五、神坑​​

​​六、解除安裝​​

Kubernetes平台存儲系統部署

官方文檔:​​https://rook.io/docs/rook/v1.6/ceph-quickstart.html​​

一、檢視前提條件

  • Raw devices (no partitions or formatted filesystems); 原始磁盤,無分區或者格式化
  • Raw partitions (no formatted filesystem);原始分區,無格式化檔案系統
fdisk -l 
# 找到自己挂載的磁盤
# 如: /dev/vdc

# 檢視滿足要求的
lsblk -f

#雲廠商都這麼磁盤清0
dd if=/dev/zero of=/dev/vdc bs=1M status=progress      

NAME                  FSTYPE      LABEL UUID                                   MOUNTPOINT

vda

└─vda1                LVM2_member       >eSO50t-GkUV-YKTH-WsGq-hNJY-eKNf-3i07IB

 ├─ubuntu--vg-root   ext4              c2366f76-6e21-4f10-a8f3-6776212e2fe4   /

 └─ubuntu--vg-swap_1 swap              9492a3dc-ad75-47cd-9596-678e8cf17ff9   [SWAP]

vdb

vdb 是可用的

二、部署&修改operator

cd cluster/examples/kubernetes/ceph
kubectl create -f crds.yaml -f common.yaml -f operator.yaml #注意修改operator鏡像

# verify the rook-ceph-operator is in the `Running` state before proceeding
kubectl -n rook-ceph get pod      

修改operator.yaml

把以前的預設鏡像換成能用的,如下

# ROOK_CSI_CEPH_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/cephcsi:v3.3.1"
  # ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-node-driver-registrar:v2.0.1"
  # ROOK_CSI_RESIZER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-resizer:v1.0.1"
  # ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-provisioner:v2.0.4"
  # ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-snapshotter:v4.0.0"
  # ROOK_CSI_ATTACHER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-attacher:v3.0.2"      

 鏡像: ​

​rook/ceph:v1.6.3​

​​ 換成 ​

​registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/rook-ceph:v1.6.3​

## 建議修改以下的東西。在operator.yaml裡面

ROOK_CSI_CEPH_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/cephcsi:v3.3.1"
ROOK_CSI_REGISTRAR_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-node-driver-registrar:v2.0.1"
ROOK_CSI_RESIZER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-resizer:v1.0.1"
ROOK_CSI_PROVISIONER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-provisioner:v2.0.4"
ROOK_CSI_SNAPSHOTTER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-snapshotter:v4.0.0"
ROOK_CSI_ATTACHER_IMAGE: "registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/csi-attacher:v3.0.2"      

三、部署叢集

修改​

​cluster.yaml​

​使用我們指定的磁盤當做存儲節點即可
storage: # cluster level storage configuration and selection
    useAllNodes: false
    useAllDevices: false
    config:
      osdsPerDevice: "3" #每個裝置osd數量
    nodes:
    - name: "k8s-node3"
      devices: 
      - name: "vdc"
    - name: "k8s-node1"
      devices: 
      - name: "vdc"
    - name: "k8s-node2"
      devices: 
      - name: "vdc"      

鏡像: ​

​ceph/ceph:v15.2.11​

​​ 換成 ​

​registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ceph-ceph:v15.2.11​

四、部署dashboard

​​Ceph Docs​​

前面的步驟,已經自動部署了

kubectl -n rook-ceph get service
#檢視service


#為了友善通路我們改為nodePort。應用nodePort檔案


#擷取通路密碼
kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo

#預設賬号 admin
4/qt]e5wad_HY:0&V.ba      

MGR: 2;隻有一個能用

Mon: 3; 全部可用

Osd: 全部可用

部署了高可用的mgr:提供頁面。

  • 先部署nodePort,驗證到底哪個mgr不能通路
  • 他是主備模式的高可用。kubectl get svc -n rook-ceph|grep dashboard
  • curl 通路dashboard确定哪個mgr不能通路
  • 自己做一個可通路到的service。如果哪天伺服器故障mgr有問題。修改svc的selector即可
apiVersion: v1
kind: Service
metadata:
  labels:
    app: rook-ceph-mgr
    ceph_daemon_id: a
    rook_cluster: rook-ceph
  name: rook-ceph-mgr-dashboard-active
  namespace: rook-ceph
spec:
  ports:
  - name: dashboard
    port: 8443
    protocol: TCP
    targetPort: 8443
  selector:  #service選擇哪些Pod
    app: rook-ceph-mgr
    ceph_daemon_id: a
    rook_cluster: rook-ceph
  sessionAffinity: None
  type: ClusterIP      
  • 再部署如下的ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ceph-rook-dash
  namespace: rook-ceph
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/server-snippet: |
      proxy_ssl_verify off;
spec:
  # tls:  不用每個名稱空間都配置證書資訊
  # - hosts:
  #     - itdachang.com
  #     -  未來的
  #   secretName: testsecret-tls
  rules:
  - host: rook.itdachang.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: rook-ceph-mgr-dashboard-active
            port:
              number: 8443      

五、神坑

#部署完成的最終結果一定要有這些元件
NAME                                                 READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-provisioner-d77bb49c6-n5tgs         5/5     Running     0          140s
csi-cephfsplugin-provisioner-d77bb49c6-v9rvn         5/5     Running     0          140s
csi-cephfsplugin-rthrp                               3/3     Running     0          140s
csi-rbdplugin-hbsm7                                  3/3     Running     0          140s
csi-rbdplugin-provisioner-5b5cd64fd-nvk6c            6/6     Running     0          140s
csi-rbdplugin-provisioner-5b5cd64fd-q7bxl            6/6     Running     0          140s
rook-ceph-crashcollector-minikube-5b57b7c5d4-hfldl   1/1     Running     0          105s
rook-ceph-mgr-a-64cd7cdf54-j8b5p                     1/1     Running     0          77s
rook-ceph-mon-a-694bb7987d-fp9w7                     1/1     Running     0          105s
rook-ceph-mon-b-856fdd5cb9-5h2qk                     1/1     Running     0          94s
rook-ceph-mon-c-57545897fc-j576h                     1/1     Running     0          85s
rook-ceph-operator-85f5b946bd-s8grz                  1/1     Running     0          92m
rook-ceph-osd-0-6bb747b6c5-lnvb6                     1/1     Running     0          23s
rook-ceph-osd-1-7f67f9646d-44p7v                     1/1     Running     0          24s
rook-ceph-osd-2-6cd4b776ff-v4d68                     1/1     Running     0          25s
rook-ceph-osd-prepare-node1-vx2rz                    0/2     Completed   0          60s
rook-ceph-osd-prepare-node2-ab3fd                    0/2     Completed   0          60s
rook-ceph-osd-prepare-node3-w4xyz                    0/2     Completed   0          60s      
#解決方案。
#找到自己的operator,删除這個pod,讓重新執行

kubectl delete pod rook-ceph-operator-65965c66b5-cxrl8 -n rook-ceph


#rbd:是ceph用來做塊存儲的
#cephfs:是用來做共享檔案系統的      

六、解除安裝

# rook叢集的清除,
##1、 delete -f 之前的yaml

##2、 再執行如下指令
kubectl -n rook-ceph get cephcluster
kubectl -n rook-ceph patch cephclusters.ceph.rook.io rook-ceph -p '{"metadata":{"finalizers": []}}' --type=merge

##3、 清除每個節點的 /var/lib/rook 目錄


## 頑固的自定義資源删除;
kubectl -n rook-ceph patch cephblockpool.ceph.rook.io replicapool -p '{"metadata":{"finalizers": []}}' --type=merge      

Rook+Ceph;

  • Rook幫我們建立好 StorageClass
  • pvc隻需要指定存儲類,Rook自動調用 StorageClass 裡面的 Provisioner供應商,接下來對ceph叢集操作
  • Ceph
  • Block:塊存儲。RWO(ReadWriteOnce)單節點讀寫【一個Pod操作一個自己專屬的讀寫區】,适用于(有狀态副本集)
  • Share FS:共享存儲。RWX(ReadWriteMany)多節點讀寫【多個Pod操作同一個存儲區,可讀可寫】,适用于無狀态應用。(檔案系統 )
  • 總結: 無狀态應用随意複制多少份,一定用到RWX能力。有狀态應用複制任意份,每份都隻是讀寫自己的存儲,用到RWO(優先)或者RWX。
  • 直接通過Rook可以使用到任意能力的存儲。

CRI、CNI、CSI

CRI:Container Runtime Interface:容器運作時接口(k8s叢集整合容器運作時環境)

  • 啟動Pod流程
  • 每個Pod,都伴随一個Pause容器(沙箱容器)。真正的容器(nginx-pvc)和沙箱容器是公用一個網絡、存儲、名稱空間。。。。
  • 啟動沙箱容器。給沙箱容器設定好網絡,存儲
  • CRI。建立沙箱容器的運作時環境
  • CNI。挂載沙箱容器網絡等
  • CSI。調用存儲系統進行資料挂載。(提前把應用容器需要挂載的挂進來)
  • 啟動應用容器。(kubectl get pod 1/1【不算沙箱容器】 )
  • 應用容器直接建立運作時CRI,用以上的 CNI、CSI
  • 從應用容器角度出發:​

    ​CSI先與CRI啟動​

    ​。
  • 從Pod出發。CRI。CNI。CSI
  • 沙箱容器代碼​​kubernetes/docker_sandbox.go at d541872f9a036ed4f792232e43fde6dacf0e1084 · kubernetes/kubernetes · GitHub​​
  • 應用容器​​kubernetes/kubelet.go at d541872f9a036ed4f792232e43fde6dacf0e1084 · kubernetes/kubernetes · GitHub​​
  • 判斷網絡(前面準備好的)
  • 挂載
  • 容器啟動
  • 📢歡迎點贊 👍 收藏 ⭐留言 📝 如有錯誤敬請指正!
  • 📢本文由 Lansonli 原創
  • 📢停下休息的時候不要忘了别人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活✨

繼續閱讀