仅需60秒,使用k3s创建一个多节点K8S集群!
作者: 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集群!的更多相关文章
- 仅需60秒,使用k3sup快速部署高可用K3s集群
作者简介 Dmitriy Akulov,连续创业者,16岁时搭建了开源CDN公共服务jsDelivr的v1版本.目前是边缘托管平台appfleet创始人. 原文链接: https://ma.ttias ...
- 创建多个节点的集群 - Elastic Stack 8.0
文章转载自:https://mp.weixin.qq.com/s/k6u9Q2nebW9qgZMghQwJng 详述如何安装3个节点的 Elasticsearch 集群.我将使用 Docker 来进行 ...
- 搭建一个完整的K8S集群-------基于CentOS 8系统
创建三个centos节点: 192.168.5.141 k8s-master 192.168.5.142 k8s-nnode1 192.168.5.143 k8s-nnode2 查看centos系统版 ...
- 11. 搭建一个完整的K8S集群
11. 搭建一个完整的Kubernetes集群 1. kubectl的命令遵循分类的原则(重点) 语法1: kubectl 动作 类 具体的对象 例如: """ kube ...
- 二进制搭建一个完整的K8S集群部署文档
服务器规划 角色 IP 组件 k8s-master1 192.168.31.63 kube-apiserver kube-controller-manager kube-scheduler etcd ...
- 一个4节点Hadoop集群的配置示例
环境: 操作系统:CentOS 6.5 64bit Hadoop:Version 1.2.1 Servers:hadoopnamenode,hadoop2ndnamenode,hadoopdatano ...
- Cassandra集群:一,搭建一个三节点的集群
环境准备 JDK1.8 http://download.oracle.com/otn/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8 ...
- 如何使用 Kind 快速创建 K8s 集群?
作者|段超 来源|尔达 Erda 公众号 导读:Erda 作为一站式云原生 PaaS 平台,现已面向广大开发者完成 70w+ 核心代码全部开源!在 Erda 开源的同时,我们计划编写<基于 ...
- 使用Kubeadm创建k8s集群之节点部署(三十一)
前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...
随机推荐
- Java入门 - 语言基础 - 10.条件语句
原文地址:http://www.work100.net/training/java-if-else.html 更多教程:光束云 - 免费课程 条件语句 序号 文内章节 视频 1 概述 2 if...e ...
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3报错解决
报错的原因翻译出来: 预期的一个结果(或null)返回selectOne(),但发现:3 意思就是你想得到一个结果值,但是返回了三个结果值. 一般可能测试的时候我们存了几条一样的数据,在登录时,会把同 ...
- Collections中的常用方法
collections中的常用方法 public class CollectionsTest { public static void main(String[] args) { List list ...
- python+pandas+jupyter notebook 的 hello word
- 浅谈JS异步(asychrouous)
一.概念 (1)asychronous 异步 是JS这种单线程语言解决多任务的一种方法,将耗时的任务(io)设定为异步工作,先交给浏览器负责相关功能的线程来实现耗时的部分工作,按顺序放入任务队列中,等 ...
- 基于Flask框架搭建视频网站的学习日志(一)
------------恢复内容开始------------ 基于Flask框架搭建视频网站的学习日志(一)2020/02/01 一.Flask环境搭建 创建虚拟环境 初次搭建虚拟环境 搭建完虚拟环境 ...
- CSS-05-伪类及伪元素选择器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 《即时消息技术剖析与实战》学习笔记10——IM系统如何应对高并发
一.IM 系统的高并发场景 IM 系统中,高并发多见于直播互动场景.比如直播间,在直播过程中,观众会给主播打赏.送礼.发送弹幕等,尤其是明星直播间,几十万.上百万人的规模一点也不稀奇.近期随着武汉新型 ...
- Nodejs实战系列:数据加密与crypto模块
博客地址:<NodeJS模块研究 - crypto> Github :https://github.com/dongyuanxin/blog nodejs 中的 crypto 模块提供了各 ...
- 记一次golang的内存泄露
程序功能 此程序的主要功能是将文件中数据导入到clickhouse数据库中. [问题描述] 服务器内存每隔一段时间会耗尽 [问题分析] 由于使用的是go语言开发的,所以采用了业界流行的工具pprof. ...