AICon全球人工智能与机器学习技术大会周四开幕,点击查看完整日程>> 了解详情
写点什么

Kind:用于测试 Kubernetes 的本地集群

  • 2020 年 3 月 02 日
  • 本文字数:1739 字

    阅读完需:约 6 分钟

Kind:用于测试 Kubernetes 的本地集群


Kind 是一种使用 Docker 容器作为 node 节点,运行本地 Kubernetes 集群的工具,在 K8s 中有着非常广泛的应用。在这篇文章中,才云科技工程师 Cat 总结了工作中使用 Kind 的心得,对 Kind 的实现原理和创建集群方式做了全面梳理。


什么是 Kind

Kind(Kubernetes IN Docker)[1]是一个用来快速创建和测试 kubernetes 的工具,它把环境的依赖降低到最小,仅需要机器安装了 Docker 即可使用。


Q:Kind 可以做什么?


  • 快速创建一个或多个 Kubernetes 集群(几分钟);

  • 支持 HA master 部署高可用的 Kubernetes 集群;

  • 支持从源码构建并部署一个 Kubernetes 集群;

  • 可以快速低成本体验一个最新的 Kubernetes 集群,并支持 Kubernetes 的绝大部分功能;

  • 支持本地离线运行一个多节点集群。

  • Q:Kind 有哪些优势?

  • 最小的安装依赖,仅需要安装 Docker 即可;

  • 使用快速简单,使用 Kind CLI 工具即可快速创建集群;

  • 使用 container 来 mock Kubernetes node;

  • 内部使用 kubeadm 的官方主流部署工具;

  • 使用了 Containerd;

  • 通过了 CNCF 官方的 K8s conformance 测试。


使用 Kind


Kind 的原理

Kind 使用一个 container 来模拟一个 node,在 container 里面跑 systemd ,并用 systemd 托管 kubelet 以及 containerd,然后通过容器内部的 kubelet 把其他 K8s 组件,比如 kube-apiserver、etcd、CNI 等跑起来。


它可以通过配置文件的方式创建多个 container 来模拟创建多个 node,并以这些 node 构建一个多节点的 Kubernetes 集群。


Kind 内部使用的集群部署工具是 kubeadm,借助 kubeadm 提供的 Alpha 特性,它可以部署包括 HA master 的高可用集群。同时,在 HA master 下, 它还额外部署了一个 Nginx,用来提供负载均衡 vip。


构建镜像

Kind 的镜像分为两个,一个 node 镜像,一个 base 镜像。


node 镜像


node 镜像的构建比较复杂,需要通过运行 base 镜像,并在 base 镜像内执行操作,再保存此容器内容为镜像的方式来完成构建。它包含的操作有:


  • 构建 Kubernetes 相关资源(比如二进制文件和镜像);

  • 运行一个用于构建的容器;

  • 把构建的 Kubernetes 相关资源复制到容器里;

  • 调整部分组件配置参数,以支持在容器内运行;

  • 预先拉去运行环境需要的镜像;

  • 通过 docker commit 方式保存当前的构建容器为 node 镜像。

  • 具体的逻辑,可以参考 node.go[2]。


base 镜像


base 镜像目前使用了 Ubuntu:19.04 作为基础镜像,做了以下调整:


  • 安装 systemd 相关的包,并调整一些配置以适应在容器内运行;

  • 安装 Kubernetes 运行时的依赖包,比如 conntrack、socat、CNI;

  • 安装容器;

  • 运行环境,比如 Containerd、crictl;

  • 配置自己的 ENTRYPOINT 脚本,以适应和调整容器内运行的问题。

  • 具体的逻辑,可以参考构建的 Dockerfile[3]。


创建集群

Kind 创建集群的基本过程为:


  • 根据传入的参数创建 container,分为 control node 和 worker node 两种(如果是 HA master,还有一个 loadbalancer node);

  • 如果需要,配置 loadbalancer 的配置,主要是 Nginx 配置文件;

  • 生成 kubeadm 配置 ;

  • 对于第一个控制节点,使用 kubeadm init 初始化单节点集群;

  • 配置安装 CNI 插件;

  • 配置存储(实际是安装了一个使用 hostpath 的 storageclass);

  • 其他的控制节点,通过 kubeadm join --experimental-control-plane 的方式扩容控制节点;

  • 通过 kubeadm join 扩容其他的工作节点;

  • 等待集群创建完成;

  • 生成访问配置,打印使用帮助具体的创建流程,可以参考代码 create.go[4]。

  • 关于每个容器是如何作为 node 跑起来的,这里简单讲解下原理:根据不同的角色,调用不同的函数创建节点 nodes.go[5]。


节点(容器)创建时,通过配置 --privileged、挂载 tmpfs、修改主机名等,来运行节点 create[6]。



更多

Kind 是一个比较简单有趣的项目,它的 scope [7]定得比较明确具体,也比较小。开发者可以借助 Kind 或 Kind 的思想做更多事情,比如:


  • 在单节点部署自己的上层平台;

  • 借助容器 mock 节点的方式,优化现有的测试方案;

  • 自动化的部署测试;

  • 自动化的 e2e 测试。

  • 此外,文中提及到的 Kind 借助 kubeadm 新特性实现 HA master 高可用集群、借助 join 的方式扩容 master 节点达到 HA master,其内部实现方式也有优缺点,感兴趣的读者可以参考 kubeadm 源码[8]。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/iE277g9f9VqlnAVQZI-dAw


2020 年 3 月 02 日 21:26328

评论

发布
暂无评论
发现更多内容

阿里花500万年薪招天才黑客?官方回应:这种人得交给警察

程序员生活志

黑客 阿里

如何不写一行代码就做出一款游戏来

Lawliet

开源 Vue 游戏开发 游戏制作 前端进阶训练营

如何编写可怕的 Java 代码?

武培轩

Java 编程 程序员 后端

了不起的 Webpack Scope Hoisting 学习指南

pingan8787

Java 前端 webpack

ARST Week7

时之虫

ARTS 打卡计划

并行流ParallelStream中隐藏的陷阱

Throwable

Java

谈谈对分布式事务的一点理解和解决方案

Throwable

分布式 分布式事务 架构设计

如何搭建Hive 环境

Rayjun

大数据 hive

玛雅密码社区不忘初心 共筑未来通证新经济

Geek_116789

架构师训练营第六周学习总结

张明森

帮助小团队实现大梦想 | Atlassian 云产品免费使用

Atlassian

百万级别数据Excel导出优化

Throwable

架构设计 springboot

list vs tupple

Leetao

Python 数据结构 Python基础知识

3W字干货深入分析基于Micrometer和Prometheus实现度量和监控的方案

Throwable

Java 监控 Grafana Prometheus springboot

修炼我们的智慧之眼

J.Smile

认知提升

关于架构的几件小事:架构概述(1)

北风

架构 架构设计 架构师 架构设计原则

工程规约 - maven统一管理

Man

maven DevOps 工程规约

AOP有几种实现方式?

八苦-瞿昙

技术 随笔杂谈 aop 代理 框架

U盘+grub2安装centos8实战

昌安古城

要不要做一个gif动态图玩一下?

诸葛小猿

GIF ScreenToGif 动态图

SpringBoot2.x入门:应用打包与启动

Throwable

springboot

iOS - CollectionViewCell对应不同flow layout的实例

teoking

ios

看动画学算法之:排序-冒泡排序

程序那些事

算法 动画 排序算法 轻松学

SpringBoot 入门:02 - 实现 MVC

封不羁

Java spring springboot

如何使用预测性指标衡量敏捷转型的成功?

Atlassian

敏捷开发 开发工具 Atlassian Jira

北京区块链规划重点发展海淀朝阳通州等区,加大对代币监管力度

Geek_987812

北京行动计划 四个高地 需求导向 为政务服务

架构师训练营第六周作业

Melo

Vagrant 快速入门

FeiLong

vagrant

十个提高产品经理工作效率的必备工具,果断收藏

马踏飞机747

大数据 设计 产品经理

大话设计模式 | 4. 装饰模式

Puran

C# 设计模式

Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?

newbe36524

Docker .net core netcore ASP.NET Core

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

Kind:用于测试 Kubernetes 的本地集群-InfoQ