作者: Dawid Ziolkowski丨Container Solution云原生工程师

最近,我一直在Kubernetes上进行各种测试和部署。因此,我不得不一次又一次创建和销毁Kubernetes集群,有的时候甚至在一个小时内执行好几次。但由于我需要测试的某个事项需要一个全新的集群,所以简单地删除所有的pod、service、deployment等,来让集群变得“像新的一样”并没有任何作用。

同时,我还需要一个尽可能与生产环境相似的集群,所以所有的本地解决方案(如Minikube、Vagrant等)都没有任何作用。

一开始,我使用了一个云提供商的托管Kubernetes,因为它易于部署,并且一旦集群启动,我只需要单击一下按钮就可以下载kubectl配置。但是它存在三个问题:

  • 它会花费很多时间——每个集群大约需要10分钟进行部署。如果我每天都要部署并销毁它,那么这些时间加起来就十分可观了。

  • 需要手动下载与加载kubectl配置文件(这个操作尽管很简单,但手动还是略微麻烦)

  • 这是一项托管服务,因此我没有对集群的完全访问权限。

所以我决定创建一个解决方案,可以让我在云上快速又简单地部署和销毁Kubernetes集群:

https://github.com/DavidZisky/60sk3s

最终,我得到了一个简单的Bash脚本,该脚本可以在Google Cloud上创建虚拟机,部署一个4节点的Kubernetes集群(1个主节点和3个worker节点),下载kubectl配置,并将其加载到我的系统中,而完成这一切仅需60秒!从零开始(甚至没有虚拟机)到能够执行kubectl apply -f any_deployment.yaml,仅需不到1分钟!那么具体要怎么操作呢?

具体需求

于我而言,这一解决方案需要考虑的一个重要因素是尽可能可移植。因此我尽量让自己不使用太多工具(因此不需要Terraform、Ansible,也不需要安装和配置)。这是为什么我用Bash编写它的原因,而我唯一的依赖项是安装和配置了GCloud CLI(带有默认区域和项目集)。

30秒启动虚拟机

我们从虚拟机开始。一般情况下,在云上创建虚拟机大约需要45秒到60秒的时间。例如,在DigitalOcean上,启动虚拟机(意味着ping开始响应)需要40秒,但你需要额外的15秒来启动其他系统服务(最重要的是,SSH server能够接收连接)。

所以,首先我们需要让整个流程更快,至少快两倍。

我们可以通过使用内存更小的OS镜像来实现。这就是我坚持用Google Cloud的原因,因为它们提供最小的Ubuntu镜像(小于200MB)。同时,我尝试了许多轻量级发行版,但它们要不就是没有核心模块,要不就是需要花很长的时间启动。

在Google Cloud上创建和启动Ubuntu迷你虚拟机花费大约30秒(从GCloud API调用到SSH Server准备就绪)。那么,我们第一步就完成了,现在我们接下来看剩下的30秒。

30秒部署K8S集群

我们应该如何在30秒内部署一个Kubernetes集群呢?答案是使用k3s!如果你还没有听说过k3s,可以翻阅我们往期文章或报名参加今天晚上8点半的在线培训(http://z-mz.cn/Pmwv)进行了解

通过使用k3s,我们不需要为Kubernetes启动和运行操心太多,因为k3s安装程序会为我们完成这些操作。所以,我的脚本仅需下载并执行它即可。

将一切都连接起来

我们通过使用轻量的OS镜像来在30秒之内启动虚拟机。我们使用了k3s,可以让我们在20秒之内运行Kubernetes。现在,我们需要将所有的部件连接在一起。为了完成这一操作,我们准备了一个Bash脚本:

  • GCloud命令以部署虚拟机
  • 在主节点下载并执行k3s安装程序
  • 获取由k3s生成的token,它可用于给集群添加节点
  • 在worker节点上下载并执行k3s安装程序(将token作为参数)

唯一的挑战是获取生成的kubectl配置——Google虚拟机上的公共IP地址在计算机上是不可见/无法访问的(当你执行“ip addr”或“ifconfig”时,你也无法找到该IP地址)。所以,当k3s生成证书以及kubeconfig时,从外部访问集群是无效的。

但经过多方面搜索,我发现了参数“--tls-san=”,它可以为证书生成提供额外的IP地址。因此,我们可以通过GCloud命令获取IP地址,然后安装k3s时,将其作为参数的值传递。如果k3s部署在所有节点上,并且worker节点已在master节点上正确注册,那么集群就已经准备就绪。

剩下的最后一件事就是下载kubectl配置(使用scp以从master节点获得文件)。完成所有步骤仅需55到58秒。正如你所见,这个解决方案没有什么特别之处,只有几个GCloud和curl命令粘贴在一个bash脚本中。但这可以很快完成工作。

下一步是?

首先,当前整个解决方案都经过硬编码,以具有4个节点的集群(一个主节点和3个worker节点)。使其易于配置,但我还从未测试过更大的集群。但我会尽快添加该选项。

其次,现在kubectl配置仅供下载(因此你可以将其作为参数传递给kubectl命令),或覆盖现有的kubectl配置(已经能够满足我的需求,因为我没有长期运行的集群)。但是,添加一个将配置附加到现有配置中的功能选项,然后更改上下文,长期来看是有益的。

仅需60秒,使用k3s创建一个多节点K8S集群!的更多相关文章

  1. 仅需60秒,使用k3sup快速部署高可用K3s集群

    作者简介 Dmitriy Akulov,连续创业者,16岁时搭建了开源CDN公共服务jsDelivr的v1版本.目前是边缘托管平台appfleet创始人. 原文链接: https://ma.ttias ...

  2. 创建多个节点的集群 - Elastic Stack 8.0

    文章转载自:https://mp.weixin.qq.com/s/k6u9Q2nebW9qgZMghQwJng 详述如何安装3个节点的 Elasticsearch 集群.我将使用 Docker 来进行 ...

  3. 搭建一个完整的K8S集群-------基于CentOS 8系统

    创建三个centos节点: 192.168.5.141 k8s-master 192.168.5.142 k8s-nnode1 192.168.5.143 k8s-nnode2 查看centos系统版 ...

  4. 11. 搭建一个完整的K8S集群

    11. 搭建一个完整的Kubernetes集群 1. kubectl的命令遵循分类的原则(重点) 语法1: kubectl 动作 类 具体的对象 例如: """ kube ...

  5. 二进制搭建一个完整的K8S集群部署文档

    服务器规划 角色 IP 组件 k8s-master1 192.168.31.63 kube-apiserver kube-controller-manager kube-scheduler etcd ...

  6. 一个4节点Hadoop集群的配置示例

    环境: 操作系统:CentOS 6.5 64bit Hadoop:Version 1.2.1 Servers:hadoopnamenode,hadoop2ndnamenode,hadoopdatano ...

  7. Cassandra集群:一,搭建一个三节点的集群

    环境准备 JDK1.8 http://download.oracle.com/otn/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8 ...

  8. 如何使用 Kind 快速创建 K8s 集群?

    作者|段超 来源|尔达 Erda 公众号 ​ 导读:Erda 作为一站式云原生 PaaS 平台,现已面向广大开发者完成 70w+ 核心代码全部开源!在 Erda 开源的同时,我们计划编写<基于 ...

  9. 使用Kubeadm创建k8s集群之节点部署(三十一)

    前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...

随机推荐

  1. iOS的项目目录结构

    一.一般面试官都会问这样的一个问题,你怎样划分你项目的目录结构,就能测试出这个人是否有经验? 目前,比较常规的两种结构: 1.主目录按照业务分类,内目录按照模块分类(主目录按照MVC架构分类,内部根据 ...

  2. OpenCV图像数字化

    灰度图像数字化 我们平时使用PS或者其它图像处理的软件打开一个要处理的图像,当我们将图像放大的足够大的时候我们会发现很多个灰度程度不同的小方格,其中每个方格就相当于一个像素,水平方向的方格数代表这个图 ...

  3. java面试| 精选基础题(2)

    关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...

  4. python类型-字典

    字典是python语言中唯一的映射类型,映射对象里哈希值(键,key)和指向的对象(值,value)是一对多的关系.一个字典对象是可变的,是一个容器类型,可存储任意个数的python对象,其中也可以包 ...

  5. C++内存管理与注意事项

    内存是程序运行必不可少的资源,由操作系统分配和管理.作为程序员,我们通常做的只能是申请和归还.本文主要介绍C++内存的申请和释放(归还),以及注意事项. 1 申请和释放内存的运算符 申请 new 释放 ...

  6. 事件总线 EventBus

    661. .net中事件模型很优雅的实现了观察者模式,同时被大量的使用在各种框架中. [2016-04-30 10:52:42]662. Prism框架中实现了一个典型的EventAggregator ...

  7. Java&Eclipse&Maven的折腾

    趁着寒假对于Java的余热,继续了对Java的征途.这次并没有太多琐碎的事情打断我的学习,于是借着这股热情去图书馆借了两本国外的书(中译版),对于程序的爱好一定要坚持下来,才开通了这个博客以坚持学习.

  8. 面试必备!Java核心技术100+面试题

    一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...

  9. 解决Idea的Generate Sources无法生成QueryDSL问题

    今天是2020年第一天在家办公,就出现了跟在公司不一样的现象,deploy项目到maven库时失败,之前一直成功. 查到原因在于QueryDSL类没有生成,但为何在公司可以而在家里就不行呢? 鉴于Id ...

  10. SpringBoot系列专栏

    学会使用SpringBoot能够极大地提升Spring应用的开发效率,可以说是目前开发应用Java必需掌握的工具之一,而且SpringBoot也是微服务应用的基础,只有学会了SpringBoot,你才 ...