在 Kubernetes 上使用 KubeVirt 管理虚拟机负载

近几年的时间里,kubernetes 不断发展壮大,各个功能也逐渐完善,越来越多的项目开始基于 kubernetes 构建,企业内部也大多搭建了自己的 kubernetes 平台。同时企业也存在大量的旧的项目,大多都是基于虚拟机构建,迁移到 kubernetes 存在着较高的成本,风险也比较大。随着 kubernetes 的功能完善,很多新业务已经上了 kubernetes,企业内部需要同时维护着 k8s 和虚拟机两套平台,同时维护两套平台给运维带来了巨大的负担,因此急切的需求一种方案解决该问题。在 kubernetes 可以通过 KubeVirt 管理虚拟机,正好用于解决上述管理难题。

LXCFS Part 2 - Implementation Details

上一篇文章我们主要了解了 LXCFS 的使用场景以及在 docker/kubernetes 中如何使用 LXCFS,这篇文章我们从源码入手,了解下 LXCFS 是如何实现上面功能的。LXCFS 是基于 fuse 实现的虚拟文件系统,理解 LXCFS,我们需要先了解 fuse,然后再对 LXCFS 的源码进行解读。下面代码解读是在 lxcfs-3.1.2 的代码基础上进行分析的。

LXCFS Part 1 - Intro to LXCFS

在使用容器部署应用时,我们经常会遇到下面场景:

  • 在对 Java 应用容器化部署的过程中,自己设置了容器的资源限制,但是 Java 应用容器在运行中还是会莫名奇妙地被 OOM Killer 干掉。
  • 在设置了容器的资源限制的容器中通过 top,uptime,free 等查看信息,读到的是 host 上的信息,不是资源限制后的结果。

这是由于 Linux 容器的资源限制是通过 cgroup 实现的,但在容器内部依旧共享宿主机内核的 procfs,其中包含了如:meminfocpuinfostatuptime 等包含宿主机资源信息的 proc 文件。一些应用或者监控工具如 free/top 还依赖 proc 下的文件内容获取资源配置和使用情况。当它们在容器中运行时,就会把宿主机的资源状态读取出来,引起了错误和不便。LXCFS 就是用来解决这类问题的。

Upgrade Glusterfs

支持 3.10.x,3.12.x,4.1.x,5.x 升级到 6.x 版本。

升级前注意事项

  • 只有复制卷和分布式复制卷可以联机升级
  • 分布式卷和条纹卷不支持联机升级
  • 升级过程中不得修改任何配置
  • 如果使用 geo-replication ,先升级 slave 节点,再升级 master 节点
  • 建议先升级服务端再升级客户端
  • 建议使用相同版本的客户端和服务端
  • 升级前建议阅读版本的 release note,熟悉新版本删除和添加的功能

Rebuild kernel package with src.rpm (Centos7)

注意,应使用非 root 用户进行 rpm 包构建。

1
2
3
# add user
useradd -m -r koji
su koji

下载源码包,安装源码包,解压源码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo yum install yum-utils rpm-build
# download source package
yumdownloader --source kernel
# install build dependencies
yum-builddep kernel
# install source package, 
rpm -i kernel-*.src.rpm
cd ~/rpmbuild
# unpacking the sources and applying any patches.
rpmbuild -bp SPECS/kernel.spec

Resizing Persistent Volumes Using Kubernetes

Feature gates:

  • enable ExpandPersistentVolumes feature gate (1.11⬆️ default:ture).
  • enable PersistentVolumeClaimResize admission controller (1.11⬆️ default:ture).

StorageClass:

  • Storage class’s allowVolumeExpansion field should set to true.

Running Containers With OVS-DPDK

DPDK(Data Plane Development Kit),即数据平面开发工具包,是一组用于快速数据包处理的数据平面库和网络接口控制器驱动程序,DPDK 为 x86,ARM 和 PowerPC 处理器提供编程框架,可以更快地开发高速数据包网络应用程序。该平台采用 BSD 许可证发布,目前作为 Linux Foundation 下的开源项目进行管理。

在 X86 架构中,处理数据包的传统方式是 CPU 中断方式,即网卡驱动接收到数据包后通过中断通知 CPU 处理,然后由 CPU 拷贝数据并交给协议栈。在数据量大时,这种方式会产生大量 CPU 中断,导致 CPU 无法运行其他程序。而 DPDK 则采用轮询方式实现数据包处理过程:DPDK 重载了网卡驱动,在收到数据包后不中断通知 CPU,而是将数据包通过零拷贝技术存入内存,这时应用层程序就可以通过 DPDK 提供的接口,直接从内存读取数据包。这种处理方式节省了 CPU 中断时间、内存拷贝时间,并向应用层提供了简单易行且高效的数据包处理方式,使得网络应用的开发更加方便。但同时,由于需要重载网卡驱动,因此该开发包目前只能用在部分网络处理芯片的网卡中。

使用 xmodmap 取消 Linux 下鼠标中键粘贴功能

在 Linux 下选中东西后,按住鼠标的滚轮中键进行粘贴,是 Linux 下非常好用的功能。但是不巧,鼠标的滚轮中键太灵敏,在滚动滚轮时候非常容易按下中键,这时候编辑好的文档突然就插入了不知道从哪复制来的东西。

xmodmap 是用于修改X中键盘映射和指针按钮映射的实用程序,我们可以用 xmodmap 修改鼠标中键的映射,进而关掉鼠标中键的复制功能,解决误触鼠标中键问题。

容器实现技术技术及其原理:Namespace

容器是当前的热门技术,容器使用到 Linux 的 namespacecgroup 功能,namespace 用于资源隔离,cgroup 用于资源限制。除了这两个外,容器还使用到了 selinux/apparmor 增强容器安全,veth pair/bridge/ovs 等技术提供容器网络,aufs/overlayfs/lvm 等技术构建容器的 rootfs。这篇文章主要对 namespace 进行介绍,了解它功能已经使用方式,后续文章再对其他技术进行介绍。

Linux Namespace

Namespace 是 Linux 内核的一项功能,用于对资源进行隔离,namespace 以一种抽象的方式包装特定的资源,使得在这个 namespace 中的进程实例看起来它们具有自己的受到隔离的全局资源,不同 namespace 的进程能看到的资源是不同的。