使用容器化块存储OpenEBS在K3s中实现持久化存储
作者简介
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中实现持久化存储的更多相关文章
- Redis持久化存储详解(一)
> 为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存.我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的 ...
- MySQL容器化详细教程
前言: 上篇文章介绍了Docker工具的安装及常用命令使用.本篇文章我们会介绍如何在Docker中运行MySQL实例,可能有的小伙伴会问:为什么要在Docker里运行MySQL呢?因为在Docker ...
- Kubernetes 持久化存储是个难题,解决方案有哪些?\n
像Kubernetes 这样的容器编排工具正在彻底改变应用程序的开发和部署方式.随着微服务架构的兴起,以及基础架构与应用程序逻辑从开发人员的角度解耦,开发人员越来越关注构建软件和交付价值. Kuber ...
- Derek解读Bytom源码-持久化存储LevelDB
作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...
- ActiveMQ消息持久化存储策略
ActiveMQ的内核是Java编写的,也就是说如果服务端没有Java运行环境ActiveMQ是无法运行的.ActiveMQ启动时,启动脚本使用wrapper包装器来启动JVM.JVM相关的配置信息在 ...
- mysql中四种存储引擎的区别和选择
前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...
- Android持久化存储——(包含操作SQLite数据库)
<第一行代码>读书手札 你可能会遇到的问题:解决File Explorer 中无显示问题 Android中,持久化存储,常见的一共有三种方法实现 (一.)利用文件存储 文件存储是Andro ...
- ios开发之数据的持久化存储机制
IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式. 对于数据的持久化存储,ios中一般提供了4种不同的机制. 1.属性列表 2.对象归档 3.数据库存储(SQLite3 ...
- scrapy框架持久化存储
基于终端指令的持久化存储 基于管道的持久化存储 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文 ...
随机推荐
- Java实现zip文件解压[到指定目录]
2019独角兽企业重金招聘Python工程师标准>>> package com.ljheee.ziptool.core; import java.io.File; import ja ...
- DeepWalk论文精读:(3)实验
模块三 1 实验设计 1.1 数据集 BLOGCATALOG[39]:博客作者网络.标签为作者感兴趣的主题. FLICKR[39]:照片分享网站的用户网络.标签为用户的兴趣群组,如"黑白照片 ...
- python sort和sorted的区别
sort 与 sorted 区别: sort 是应用在 list 上的方法,使用方法为 list.sort(),是对原有列表进行操作,改变原有列表的排序: sorted 可以对所有可迭代的对象进行排序 ...
- docker学习笔记一篇就通系列(持续更新)
docker三要素 仓库 镜像 容器 仓库 仓库用来存放docker的镜像,类似于github存放代码医养 镜像 镜像是一个模板,封装了应用程序和配置依赖的可交付的运行环境,这个打包好的运行环境就是镜 ...
- python http server handle json
用Python实现一个http server # python2 # coding = utf-8 from BaseHTTPServer import HTTPServer, BaseHTTPReq ...
- C. Cave Painting(最小公倍数的应用)
\(\color{Red}{网上的题解都是投机取巧啊,虽然也没错}\) \(Ⅰ.先说一下投机取巧的方法\) \(自己写几个例子会发现k很小的时候满足条件的n就变得很大\) \(所以我们直接暴力从1判断 ...
- java基础篇 之 非静态内部类
什么是非静态内部类: public class Outer { Outer() { System.out.println("我是外部类"); } class Inner { Inn ...
- 错误:Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.
Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. The ...
- stanfordcorenlp安装教程&问题汇总(importerror-no-module-named-psutil、OSError: stanford-chinese-corenlp-yyyy-MM-dd-models.jar not exists.)&简单使用教程
stanfordcorenlp安装教程&简单使用教程 编译环境:python 3.6 .win10 64位.jdk1.8及以上 1.stanfordcorenlp安装依赖环境 下载安装JDK ...
- python语法学习第十天--魔法方法
魔法方法二!!! 属性访问:在对属性任何操作时,都会调用 有关属性 __getattr__(self, name) 定义当用户试图获取一个不存在的属性时的行为 __getattribute__(s ...