TOC
前言
前提
- 使用OpenEBS需要机器已经安装了
iSCSI - 已经安装了kubernetes
 
ubuntu可以用下面的命令安装和开启:
sudo apt-get update
sudo apt-get install open-iscsi
sudo systemctl enable --now iscsid
centos系列系统可以用下面的命令安装和开启:
yum install iscsi-initiator-utils -y
sudo systemctl enable --now iscsid
安装OpenEBS
Helm方式
helm repo add openebs https://openebs.github.io/charts
helm repo update
helm install openebs --namespace openebs openebs/openebs --create-namespace
上述命令将会安装OpenEBS并且默认安装Jiva和Local PV组件,如果需要其他的存储引擎可以用下面的安装命令开启:
helm install openebs --namespace openebs openebs/openebs --create-namespace --set cstor.enabled=true
等待一会后会出现helm安装成功的提示:
oem@lan:~/k8s/openebs$ helm install openebs --namespace openebs openebs/openebs --create-namespace --set cstor.enabled=true
NAME: openebs
LAST DEPLOYED: Mon Jan  3 00:28:41 2022
NAMESPACE: openebs
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Successfully installed OpenEBS.
Check the status by running: kubectl get pods -n openebs
The default values will install NDM and enable OpenEBS hostpath and device
storage engines along with their default StorageClasses. Use `kubectl get sc`
to see the list of installed OpenEBS StorageClasses.
**Note**: If you are upgrading from the older helm chart that was using cStor
and Jiva (non-csi) volumes, you will have to run the following command to include
the older provisioners:
helm upgrade openebs openebs/openebs \
        --namespace openebs \
        --set legacy.enabled=true \
        --reuse-values
For other engines, you will need to perform a few more additional steps to
enable the engine, configure the engines (e.g. creating pools) and create 
StorageClasses. 
For example, cStor can be enabled using commands like:
helm upgrade openebs openebs/openebs \
        --namespace openebs \
        --set cstor.enabled=true \
        --reuse-values
For more information, 
- view the online documentation at https://openebs.io/ or
- connect with an active community on Kubernetes slack #openebs channel.
可以看一下openebs相关的日志运行情况,耐心等待容器运行成功就可以了,第一次需要拉去镜像,所以需要一点时间:
运行命令watch kubectl get po -n openebs
Every 2.0s: kubectl get po -n openebs                                                                                       lan: Mon Jan  3 00:30:41 2022
NAME                                            READY   STATUS              RESTARTS   AGE
openebs-cstor-admission-server-f7c94c6d-n82n6   0/1     ContainerCreating   0          118s
openebs-cstor-csi-controller-0                  0/6     ContainerCreating   0          118s
openebs-cstor-csi-node-hk6kg                    0/2     ContainerCreating   0          118s
openebs-cstor-cspc-operator-d576bb58d-cqcln     0/1     ContainerCreating   0          118s
openebs-cstor-cvc-operator-867b5697b5-glh76     1/1     Running             0          118s
openebs-localpv-provisioner-6f686f7697-967kj    0/1     ContainerCreating   0          118s
openebs-ndm-operator-5948569558-frhjd           0/1     ContainerCreating   0          118s
openebs-ndm-pjfmz                               1/1     Running             0          118s
过了一会可能会出现失败,原因是 CSI 的镜像的官方地址是k8s.gcr.io,国内访问不了,不过没关系,这时候只需要将k8s.gcr.io修改为lank8s.cn就可以了.
可以运行下下面的命令将 CSI 相关的镜像都设置为国内可访问的镜像地址.
helm upgrade openebs --namespace openebs openebs/openebs --set cstor.enabled=true --create-namespace --set cstor.csiController.resizer.image.registry=lank8s.cn/  --set cstor.csiController.snapshotter.image.registry=lank8s.cn/  --set cstor.csiController.snapshotController.image.registry=lank8s.cn/  --set cstor.csiController.attacher.image.registry=lank8s.cn/    --set cstor.csiController.provisioner.image.registry=lank8s.cn/  --set cstor.csiNode.driverRegistrar.image.registry=lank8s.cn/ 
同时可以运行kubectl get storageClass看看 storageClass:
NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
longhorn (default)   driver.longhorn.io   Delete          Immediate              true                   4d3h
openebs-device       openebs.io/local     Delete          WaitForFirstConsumer   false                  3m12s
openebs-hostpath     openebs.io/local     Delete          WaitForFirstConsumer   false                  3m12s
试用动态PVC
当 openebs 的所有 pod 都处于 Running 的时候就已经真正安装 OpenEBS 成功了,接下来试用一下动态PVC的效果.
以redis作为有状态服务部署.
redis.yaml:
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: redis
  name: redis
spec:
  selector:
    matchLabels: 
      app: redis
  serviceName: redis-svc
  replicas: 1
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - image: redis:7.0.7
          name: redis
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: redis-vct
              mountPath: /data
  volumeClaimTemplates:
    - metadata:
        name: redis-vct
      spec:
        storageClassName: openebs-jiva-csi-default
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    app: redis
spec:
  ports:
    - port: 6379
      name: redis
  type: ClusterIP
  selector:
    app: redis
写好 yaml 文件后运行kubectl apply -f redis.yaml部署 redis.
redis的pod运行起来后进到 redis 存一条数据:
- kubectl exec -it redis-0 sh
 - redis-cli
 - set lank8scn 1
 
这时候数据已经存在pvc里面了,可以验证一下,将redis-0这个pod删除,如果重建后的redis-0这个pod还有lank8scn这个key的数据,那么说明数据已经持久化成功了.
- kubectl delete po redis-0
 - kubectl exec -it redis-0 sh(等待redis的pod成功运行后)
 - redis-cli
 - get lank8scn
 
顺利的话你得到key的数据:
127.0.0.1:6379> get lank8scn
"1"
这时候说明已经使用 openebs 作为 storageclass 并且动态生成 PVC 成功了,甚至还部署了一个 redis 应用并且持久化了数据,最简单的一整个流程都跑通了.
再简化
可以思考一下,在上述一整个过程当中哪一个步骤是最麻烦的?
在我看来是当部署 helm chart 时镜像中包含了k8s.gcr.io或gcr.io等国内不可访问的镜像后去helm chart模板里面翻到底是哪个参数可以 将这个镜像仓库地址修改的时候.
本次部署 openebs 的时候我就经过了一番折腾才最终找到这个修改的地方.
首先我去 openebs 的 slack 提问,如果有人回答我那就太好了(很遗憾,到最后也没有人给我回答),同时去找到 openebs 对应的 helm chart 仓库,一步一步翻看这个镜像是哪里用到了,如何通过参数修改.
对于只有很长时间内只有这么一次经历其实也还好,但是我们难免还是会在其他常用的 helm chart 中遇到这样的问题,在这里我推荐一下在线的lank8s webhook服务,只需要在k8s集群当中部署一个MutatingWebhook就可以了,不再需要到处找参数去修改.
当然也正在持续的做些准备,将这个 webhook 的所有内容都开源出来并且手把手教学如何在不可访问外网的k8s集群中使用这个 webhook,可以持续关注上面文章的地址,当做好准备时将会更新上述文章.
如果使用了这个 webhook 后(不论在线服务还是本地部署),你不再需要担心哪里会用到不可访问的k8s.gcr.io或gcr.io的镜像,轻松解决全局问题.
以本文为例子的话那就是直接运行helm install openebs --namespace openebs  --create-namespace --set cstor.enabled=true openebs/openebs就可以了,不需要那些特殊设置镜像的参数了.
对于 gcr.io 和 registry.k8s.io 的镜像拉取,可以了解下 lank8s.cn服务.
从此告别镜像拉取困难.
心路历程
刚开始设置CSI镜像那块发现无法生效,然后我在slack给openebs提问是否没有开放这个设置.
最后也没有人回答这个问题.
在我从 openebs 的几个 chart 中找了一番终于是找到了设置的地方,在 openebs/openebs 的这个 chart 中的 Chart.yaml 文件中有几个子chart,而CSI的镜像就是在 cstor 这个子 chart 设置的,去看看 cstor 这个 chart 的 values.yaml 后明白了设置的方法.
...
dependencies:
...
 - name: cstor
   version: "3.0.2"
   repository: "https://openebs.github.io/cstor-operators"
...
微信公众号
扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。
        