作者简介

Giridhara Prasad,Mayadata Inc.首席工程师。在软件测试自动化、混沌工程(chaos engineering)方面有丰富的经验。目前,他正在研究开源混沌工程项目Litmus。

原文链接:

https://openebs.io/blog/getting-started-with-k3s-in-vsphere-and-openebs-cstor/

K3OS是一个Linux发行版,专为轻量级Kubernetes发行版K3s打造的轻量操作系统。它为K3s的顺利运行专门设计了一些功能。在本文中,我将介绍安装K3OS的步骤以及如何设置OpenEBS。OpenEBS是一个CNCF项目,是一款针对Kubernetes有状态工作负载的开源容器化存储解决方案。

在vSphere中设置K3OS

K3OS的内核是从Ubuntu-18.04 LTS中fork出来的,它的用户空间二进制文件来自alpine。因此在创建虚拟机时,需要选择Ubuntu Linux(64位)作为客户操作系统。



从Github上的release页面下载最新的K3OS iso文件(撰写文章时最新版本为v0.9.0,目前已经更新到v0.10.1),将iso文件添加到虚拟机中,然后使用实时安装选项启动它,如下所示:

选择K3OS LiveCD & Install,并启动操作系统。

成功启动之后,你将进入登录提示。K3OS中的默认用户是rancher,你无需密码即可登录该用户。

执行了实时安装之后,你需要将操作系统安装到磁盘并将机器配置为server(master)或agent(worker)。这可以通过运行命令sudo k3os install来执行。

选择选项1,即Install to disk,以将K3OS安装到磁盘。并且需要为rancher用户设置新密码,以启用与服务器的ssh通信。

安装到磁盘中

你需要选择server或agent以在计算机中安装相关组件。现在,我们选择server来部署K3s server组件。你可以设置token或集群密钥,当需要将K3s agent加入server时可以使用。

完成安装之后,屏幕如下所示:

K3s server已经被成功配置。如果未配置DHCP,则需要使用connmanctl分配IP地址和其他详细的网络信息,然后以rancher用户身份登录server,输入在上一步中配置的密码。通过执行以下命令,让我们找到绑定在eth0设备上的connman网络服务:

sudo connmanctl services

执行以上命令之后,将会列出如下服务:

验证服务后,你可以通过以下命令分配IP地址、网络掩码、网关和DNS服务。

sudo connmanctl config <ethernet service> --ipv4 manual <IP Address> <Netmask> <gateway> --nameservers <DNS Address>

执行以上命令之后,可以通过ifconfig命令,确保网络是否已经配置正确。在完成网络设置之后,重启机器。

安装K3s agent

在K3s术语中,Kubernetes worker被称为agent。将K3OS安装到磁盘中时,你需要选择选项2,agent,以在计算机中配置K3s agent。

选择了Agent之后,你需要提供agent必须配置到的server的URL。K3s server的URL可以通过以下方式生成。

https://<K3s Server IP Address>:6443

键入URL之后,你需要提供集群密钥,该密钥在server安装过程已经配置完成。在输入完成以上内容之后,启动agent部署。

开始配置网络,方式与上述配置server网络相同,然后重启计算机。重启之后,请按照以下步骤检查server中的集群状态。

k3os-1374 [~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3os-1374 Ready master 10m v1.17.2+k3s1
k3os-15360 Ready <none> 10m v1.17.2+k3s1
k3os-1091 Ready <none> 10m v1.17.2+k3s1

执行以下命令,检查集群组件是否已经配置成功,并且所有pod是否已经成功运行。

k3os-1374 [~]$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
helm-install-traefik-nmjvj 0/1 Completed 0 3d
svclb-traefik-gp9ff 2/2 Running 1 2d23h
svclb-traefik-qgdlx 2/2 Running 0 2d23h
local-path-provisioner-58fb86bdfd-wkdtm 1/1 Running 1 3d
metrics-server-6d684c7b5-mrxsr 1/1 Running 0 3d
svclb-traefik-c4v7l 2/2 Running 0 3d
coredns-d798c9dd-td5tr 1/1 Running 0 3d
traefik-6787cddb4b-n57jz 1/1 Running 0 3d

安装OpenEBS

OpenEBS是一个CNCF项目,可以为Kubernetes中部署的工作负载提供持久性块存储。除了Jiva和Local PV之外,cStor也是OpenEBS提供的存储引擎之一。而根据这一issue(https://github.com/rancher/k3os/issues/151 )通过在v0.9.0中添加了对udev的支持才在K3OS中支持cStor。

k3os-1374 [~]$ kubectl apply -f openebs-operator-1.7.0.yaml
namespace/openebs created
serviceaccount/openebs-maya-operator created
clusterrole.rbac.authorization.k8s.io/openebs-maya-operator created
clusterrolebinding.rbac.authorization.k8s.io/openebs-maya-operator created
deployment.apps/maya-apiserver created
service/maya-apiserver-service created
deployment.apps/openebs-provisioner created
deployment.apps/openebs-snapshot-operator created
configmap/openebs-ndm-config created
daemonset.apps/openebs-ndm created
deployment.apps/openebs-ndm-operator created
deployment.apps/openebs-admission-server created
deployment.apps/openebs-localpv-provisioner created

检查是否所有的OpenEBS组件都成功运行。

k3os-1374 [~]$ kubectl get pods -n openebs
NAME READY STATUS RESTARTS AGE
openebs-admission-server-f67f77588-8kl78 1/1 Running 0 65s
openebs-provisioner-7b8c68bf44-7bjw8 1/1 Running 0 66s
openebs-ndm-qp26v 1/1 Running 0 66s
openebs-ndm-84zb4 1/1 Running 0 66s
openebs-ndm-dzghs 1/1 Running 0 66s
openebs-localpv-provisioner-5c87bbd974-55486 1/1 Running 0 65s
openebs-ndm-operator-5fccfb7976-dvhj6 1/1 Running 0 66s
openebs-snapshot-operator-6c4c64d4bc-qxdwd 2/2 Running 0 66s
maya-apiserver-84785d7fbd-ck7sh 1/1 Running 0 66s

OpenEBS cStor引擎需要将外部磁盘连接到组成cStor池的agent上。磁盘或块设备由称为节点磁盘管理器(简称为NDM)的组件管理。将磁盘连接到agent计算机后,通过执行以下命令来检查块设备。

k3os-1374 [~]$ kubectl get blockdevices -n openebs
NAME NODENAME SIZE CLAIMSTATE STATUS AGE
blockdevice-30a3eb18f5b9e2d470de45e39f1036b0 k3os-15360 17179869184 Unclaimed Active 1h
blockdevice-86fc964305abe8970fc1508538a61dbc k3os-1374 17179869184 Unclaimed Active 1h
blockdevice-b8735721689d5843bca10e7028f60a4e k3os-1091 17179869184 Unclaimed Active 1h

在本例中,每个K3s agent计算机上都已连接1个块设备。让我们在spec.blockDevices下的池中创建manifest,然后创建池。


apiVersion: openebs.io/v1alpha1
kind: StoragePoolClaim
metadata:
name: cstor-disk-pool
annotations:
cas.openebs.io/config: |
- name: PoolResourceRequests
value: |-
memory: 2Gi
- name: PoolResourceLimits
value: |-
memory: 4Gi
spec:
name: cstor-disk-pool
type: disk
poolSpec:
poolType: striped
blockDevices:
blockDeviceList:
- blockdevice-30a3eb18f5b9e2d470de45e39f1036b0
- blockdevice-86fc964305abe8970fc1508538a61dbc
- blockdevice-b8735721689d5843bca10e7028f60a4e

应用以上定义之后,通过执行以下命令检查池是否创建成功。

k3os-1374 [~]$ kubectl get csp
NAME ALLOCATED FREE CAPACITY STATUS TYPE AGE
cstor-disk-pool-rgy3 270K 15.9G 15.9G Healthy striped 2m3s
cstor-disk-pool-gij4 270K 15.9G 15.9G Healthy striped 2m2s
cstor-disk-pool-09l1 270K 15.9G 15.9G Healthy striped 2m2s

所有的池实例应该是健康的并且每个实例运行一个pod,通过执行以下命令可以找到pod:

k3os-1374 [~]$ kubectl get pods -n openebs -l app=cstor-pool
NAME READY STATUS RESTARTS AGE
cstor-disk-pool-rgy3-57f965b48c-srz2x 3/3 Running 0 8m33s
cstor-disk-pool-gij4-77bb4b8f44-s6k89 3/3 Running 0 8m33s
cstor-disk-pool-09l1-56d444996b-m698h 3/3 Running 0 8m33s

创建cStor池之后,我们可以开始创建volume。为了能够说明清楚,我们部署一个带有cStor volume的busybox,作为其持久性存储。在创建池之前,我们需要创建一个storage class,它会指定在上述步骤中创建的storagePoolClaim,具体如下所示:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: openebs-cstor
annotations:
openebs.io/cas-type: cstor
cas.openebs.io/config: |
- name: StoragePoolClaim
value: "cstor-disk-pool"
- name: ReplicaCount
value: "3"
provisioner: openebs.io/provisioner-iscsi

根据上述定义中的要求,填充storagePoolClaim和ReplicaCount并创建storage class。创建PVC时必须使用此类存储。


kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: openebs-pvc
spec:
storageClassName: openebs-cstor
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
labels:
name: busybox
name: busybox
spec:
clusterIP: None
selector:
app: busybox
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
labels:
app: busybox
spec:
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: app-busybox
imagePullPolicy: IfNotPresent
image: busybox
command: ["/bin/sh"]
args: ["-c", "while true; do sleep 10;done"]
env:
volumeMounts:
- name: data-vol
mountPath: /busybox
volumes:
- name: data-vol
persistentVolumeClaim:
claimName: openebs-pvc

在上述manifest中升级storage class之后,让我们通过应用以上定义来部署busybox应用程序。通过查看它们的状态来检查PVC是否在应用程序pod上成功创建和成功挂载。

k3os-1374 [~]$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
openebs-pvc Bound pvc-6cd2b30a-49ed-4605-b1e0-dd23c45e548d 10Gi RWO openebs-cstor 4m35s k3os-1374 [~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-748fb77c75-9lwzz 1/1 Running 0 4m42s

由于我们在storage class中将ReplicaCount指定为3,因此需要创建3个volume副本,你可以通过执行以下命令来找到它们。

k3os-1374 [~]$ kubectl get cvr -n openebs
NAME USED ALLOCATED STATUS AGE
pvc-6cd2b30a-49ed-4605-b1e0-dd23c45e548d-cstor-disk-pool-09l1 7.95M 116K Healthy 6m37s
pvc-6cd2b30a-49ed-4605-b1e0-dd23c45e548d-cstor-disk-pool-rgy3 7.95M 116K Healthy 6m37s
pvc-6cd2b30a-49ed-4605-b1e0-dd23c45e548d-cstor-disk-pool-gij4 7.95M 116K Healthy 6m37s

因此,可以使用cStor引擎为K3s中的工作负载提供持久卷。

使用容器化块存储OpenEBS在K3s中实现持久化存储的更多相关文章

  1. Redis持久化存储详解(一)

    > 为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存.我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的 ...

  2. MySQL容器化详细教程

    前言:  上篇文章介绍了Docker工具的安装及常用命令使用.本篇文章我们会介绍如何在Docker中运行MySQL实例,可能有的小伙伴会问:为什么要在Docker里运行MySQL呢?因为在Docker ...

  3. Kubernetes 持久化存储是个难题,解决方案有哪些?\n

    像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...

  4. Derek解读Bytom源码-持久化存储LevelDB

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...

  5. ActiveMQ消息持久化存储策略

    ActiveMQ的内核是Java编写的,也就是说如果服务端没有Java运行环境ActiveMQ是无法运行的.ActiveMQ启动时,启动脚本使用wrapper包装器来启动JVM.JVM相关的配置信息在 ...

  6. mysql中四种存储引擎的区别和选择

    前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...

  7. Android持久化存储——(包含操作SQLite数据库)

    <第一行代码>读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Andro ...

  8. ios开发之数据的持久化存储机制

    IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...

  9. scrapy框架持久化存储

    基于终端指令的持久化存储 基于管道的持久化存储 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文 ...

随机推荐

  1. Java9新特性系列(module&maven&starter)

    上篇已经深入分析了Java9中的模块化,有读者又提到了module与starter是什么关系?本篇将进行分析. 首先先回顾下module与maven/gradle的关系: module与maven/g ...

  2. Codeforces Round #561 (Div. 2) A. Silent Classroom(贪心)

    A. Silent Classroom time limit per test1 second memory limit per test256 megabytes inputstandard inp ...

  3. tarjan 算法应用

    主要讲证明,流程倒是也有 然后发现自己并不会严谨证明 其实后面一些部分流程还是挺详细 本来这篇blog叫做"图论部分算法证明",然后发现OI中的图论想完全用数学上的方法证明完全超出 ...

  4. pyhton中绘制多个图像

    1,在python的图像学习中,有时我们需要在同一个窗口中,显示多个图像,方便我们查看输出图像的区别. 2,在pycharm中,导入matplotlibmokuai,据说此模块来自matlab,因为没 ...

  5. springboot rabbitmq 找不到队列

    错误报告: org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to ...

  6. python模块之time and datetime

    time # python3 # coding = utf-8 import time timestamp = time.time() print('timestamp:%s, type: %s' % ...

  7. Java 创建并应用PPT幻灯片母版

    幻灯片母版,可在幻灯片中预先存储设计模板信息,包括字形.占位符大小或位置.背景设计和配色方案等:对设定好的母版可应用于所有幻灯片,也可设计多个不同母版应用于不同幻灯片.下面通过Java代码示例介绍如何 ...

  8. ArcMap 0 (ArcGIS10.2安装)

    一如GIS深似海,从此相逢是故人(这句话适合初步接触GIS的,我算是初窥门径.还是道行太浅,只是多了感慨) 前言: 1. 本人GIS专业,对于ArcGIS较为熟悉.由于专业和其它经历需要,接触过不少各 ...

  9. C. Coffee Break 贪心 思维 有点难 有意思

    C. Coffee Break 这个贪心之前好像写过,还是感觉挺难的,有点不会写. 这个题目大意是:给你一个数列n个元素,然后给你一天的时间,给你一个间隔时间d, 问你最少要用多少天可以把这个数列的所 ...

  10. maven的pom.xml配置文件相关依赖jar包

    <!--声明变量--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sou ...