您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群

时间:2019-09-20 09:49:58  来源:  作者:
使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群

 

什么是 Kind

Kind(Kubernetes in Docker) 是一个Kubernetes孵化项目,Kind是一套开箱即用的Kubernetes环境搭建方案。顾名思义,就是将Kubernetes所需要的所有组件,全部部署在一个Docker容器中,可以很方便的搭建Kubernetes集群。

Kind已经广泛的应用于Kubernetes上游及相关项目的CI环境中,官方文档中也把Kind作为一种本地集群搭建的工具推荐给大家。

项目地址:https://github.com/kubernetes-sigs/kind

Kind 可以做什么?

  1. 快速创建一个或多个 Kubernetes集群

  2. 支持部署高可用的 Kubernetes集群

  3. 支持从源码构建并部署一个 Kubernetes集群

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

  5. 支持本地离线运行一个多节点集群

Kind 有哪些优势?

  1. 最小的安装依赖,仅需要安装 Docker即可

  2. 使用方法简单,只需 Kind Cli工具即可快速创建集群

  3. 使用容器来模似 Kubernetes节点

  4. 内部使用 Kubeadm的官方主流部署工具

  5. 通过了 CNCF官方的K8S Conformance测试

Kind 是如何工作的?

Kind使用容器来模拟每一个Kubernetes节点,并在容器里面运行Systemd。 容器里的Systemd托管了KubeletContainerd,然后容器内部的Kubelet把其它Kubernetes组件:Kube-ApiserverEtcdCNI等等组件运行起来。

Kind内部使用了Kubeadm这个工具来做集群的部署,包括高可用集群也是借助Kubeadm提供的特性来完成的。在高用集群下还会额外部署了一个Nginx来提供负载均衡VIP

 

安装 Kind

安装 Kind 依赖组件

Kind把部署Kubernetes环境的依赖降低到了最小,仅需要机器安装Docker即可。

  1. 安装 Docker

这里以 linux系统为例:

$ curl -sSL https://get.daocloud.io/docker | sh

更多平台的安装方法可参考官方文档:https://docs.docker.com/install/

  1. 安装 Kubectl

如果你需要通过命令行管理集群,则需要安装 Kubectl

这里以 Linux系统为例:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.15.0/bin/linux/amd64/kubectl$ chmod +x ./kubectl$ sudo mv ./kubectl /usr/local/bin/kubectl

更多平台的安装方法可参考官方文档:https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl

 

安装 Kind

Kind使用Golang进行开发,原生支持良好的跨平台特性,通常只需要直接下载构建好的二进制文件就可使用。

  1. 通过二进制安装

  • Linux

$ curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-linux-amd64$ chmod +x ./kind$ mv ./kind /usr/local/bin/kind
$ curl.exe -Lo kind-windows-amd64.exe https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-windows-amd64$ mv .kind-windows-amd64.exe c:kind.exe

更多平台的安装方法可参考官方文档:https://kind.sigs.k8s.io/docs/user/quick-start/

  1. 通过源码安装

如果本地环境已经配置好 Golang (1.11+) 的开发环境,你也可以直接通过源码进行安装。

$ go get sigs.k8s.io/kind@v0.5.1

运行完上述命令后,会将 Kind的可执行文件放到$GOPATH/bin目录内。为了方便使用,你需要将此目录加入到$PATH中。

 

使用 Kind

安装完成之后,我们可以来看看 Kind支持哪些命令行操作。

$ kindkind creates and manages local Kubernetes clusters using Docker container 'nodes'
Usage: kind [command]
Available Commands: build Build one of [base-image, node-image] create Creates one of [cluster] delete Deletes one of [cluster] export exports one of [logs] get Gets one of [clusters, nodes, kubeconfig-path] help Help about any command load Loads images into nodes version prints the kind CLI version
Flags: -h, --help help for kind --loglevel string logrus log level [panic, fatal, error, warning, info, debug] (default "warning") --version version for kind
Use "kind [command] --help" for more information about a command.

简单说下几个比较常用选项的含义:

  • build:用来从Kubernetes源代码构建一个新的镜像。

  • create:创建一个Kubernetes集群。

  • delete:删除一个Kubernetes集群。

  • get:可用来查看当前集群、节点信息以及Kubectl配置文件的地址。

  • load:从宿主机向Kubernetes节点内导入镜像。

 

使用 Kind 创建 Kubernetes 集群

搭建一个单节点集群

搭建单节点集群是 Kind最基础的功能,当然使用起来也很简单,仅需一条指令即可完成。

$ kind create cluster --name my-clusterCreating cluster "my-cluster" ... ✓ Ensuring node image (kindest/node:v1.15.3)  ✓ Preparing nodes  ✓ Creating kubeadm config  ✓ Starting control-plane ️Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"kubectl cluster-info

以上命令中 --name是可选参数。如果不指定,默认创建出来的集群名字为kind

使用默认安装的方式时,我们没有指定任何配置文件。从安装过程的输出来看,一共分为 4 步:

  • 检查本地环境是否存在一个基础的安装镜像,默认是 kindest/node:v1.15.3,该镜像里面包含了所有需要安装的东西,包括:kubectlkubeadmkubelet的二进制文件,以及安装对应版本Kubernetes所需要的镜像。

  • 准备 Kubernetes节点,主要就是启动容器、解压镜像这类的操作。

  • 建立对应的 kubeadm的配置,完成之后就通过kubeadm进行安装。安装完成后还会做一些清理操作,比如:删掉主节点上的污点,否则对于没有容忍的Pod无法完成部署。

  • 上面所有操作都完成后,就成功启动了一个 Kubernetes集群并输出一些操作集群的提示信息。

  1. 默认情况下,Kind会先下载kindest/node:v1.15.3镜像。如果你想指定不同版本,可以使用--image参数,类似这样:kind create cluster --image kindest/node:v1.15.3

  2. kindest/node这个镜像目前托管于 Docker Hub 上,下载时可能会较慢。同样的问题Kind进行集群的创建也是存在的,Kind实际使用Kubeadm进行集群的创建。对Kubeadm有所了解的同学都知道它默认使用的镜像在国内是不能访问的,所以一样需要自行解决网络问题。

  3. 如果你存在上面说的网络问题,最好配置一个国内的加速器或者镜像源。如果你还不知道如何配置加速器和镜像源可以参考:「Docker / Kubernetes 镜像源不可用,教你几招搞定它!」和 「 Docker 下使用 DaoCloud / 阿里云镜像加速」两篇文章。

接下来,我们根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。

# 获取指定集群的配置文件所在的路径$ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster")"$ kubectl cluster-infoKubernetes master is running at https://localhost:34458KubeDNS is running at https://localhost:34458/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-cluster-control-plane Ready master 2m v1.15.3
$ kubectl get po -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-86c58d9df4-6g66f 1/1 Running 0 21mcoredns-86c58d9df4-pqcc4 1/1 Running 0 21metcd-my-cluster-control-plane 1/1 Running 0 20mkube-apiserver-my-cluster-control-plane 1/1 Running 0 20mkube-controller-manager-my-cluster-control-plane 1/1 Running 0 20mkube-proxy-cjgnt 1/1 Running 0 21mkube-scheduler-my-cluster-control-plane 1/1 Running 0 21mweave-net-ls2v8 2/2 Running 1 21m

从上面的输出结果,可以看到单节点的 Kubernetes已经搭建成功。单节点集群默认方式启动的节点类型是control-plane,该节点包含了所有的组件。这些组件分别是:2*CorednsEtcdApi-ServerController-ManagerKube-ProxySheduler和网络插件Weave,目前默认使用的网络插件也是Weave

 

创建多节点的集群

默认安装的集群只部署了一个控制节点,如果需要部署多节点集群,我们可以通过配置文件的方式来创建多个容器。这样就可以达到模拟多个节点目的,并以这些节点来构建一个多节点的 Kubernetes集群。

  1. 创建多节点 Kubernetes 集群配置文件

Kind在创建集群的时候,支持通过--config参数传递配置文件给Kind,配置文件可修改的内容主要有 role 和 节点使用的镜像。

$ vim my-cluster-multi-node.yaml# 一共两个节点,一个主节点,一个从节点。kind: ClusterapiVersion: kind.sigs.k8s.io/v1alpha3nodes:- role: control-plane- role: worker
  1. 创建多节点 Kubernetes 集群

配置文件创建完成后,就可以使用下面的命令来完成多节点 Kubernetes集群搭建。

$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-nodeCreating cluster "my-cluster-multi-node" ... ✓ Ensuring node image (kindest/node:v1.15.3)  ✓ Preparing nodes   ✓ Creating kubeadm config   ✓ Starting control-plane ️  ✓ Joining worker nodes  Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-multi-node")"kubectl cluster-info

和上面创建的单节点集群一样,我们同样根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。

$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-cluster-multi-node-control-plane Ready master 3m20s v1.15.3my-cluster-multi-node-worker Ready <none> 3m8s v1.15.3
$ kubectl get po -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-86c58d9df4-cnqhc 1/1 Running 0 5m29scoredns-86c58d9df4-hn9mv 1/1 Running 0 5m29setcd-my-cluster-multi-node-control-plane 1/1 Running 0 4m24skube-apiserver-my-cluster-multi-node-control-plane 1/1 Running 0 4m17skube-controller-manager-my-cluster-multi-node-control-plane 1/1 Running 0 4m21skube-proxy-8t4xt 1/1 Running 0 5m27skube-proxy-skd5v 1/1 Running 0 5m29skube-scheduler-my-cluster-multi-node-control-plane 1/1 Running 0 4m18sweave-net-nmfq2 2/2 Running 1 5m27sweave-net-srdfw 2/2 Running 0 5m29s

 

创建高可用 Kubernetes 集群

Kind也支持搭建高可用的Kubernetes集群,创建方式和多节点集群类似,也是通过配置文件来实现。

  1. 创建高可用 Kubernetes 集群配置文件

$ vim my-cluster-ha.yaml
# 一共六个节点,三个 control-plane 节点,三个 workers 节点kind: ClusterapiVersion: kind.sigs.k8s.io/v1alpha3kubeadmConfigPatches:- | apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration metadata: name: config networking: serviceSubnet: 10.0.0.0/16 imageRepository: registry.aliyuncs.com/google_containers nodeRegistration: kubeletExtraArgs: pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1- | apiVersion: kubeadm.k8s.io/v1beta2 kind: InitConfiguration metadata: name: config networking: serviceSubnet: 10.0.0.0/16 imageRepository: registry.aliyuncs.com/google_containersnodes:- role: control-plane- role: control-plane- role: control-plane- role: worker- role: worker- role: worker

这里,我们通过直接在配置文件里使用国内容器镜像源的方式解决了官方容器镜像源不可用的问题,同时也达到了加速集群创建的目的。

  1. 创建高可用 Kubernetes 集群

配置文件创建完成后,就可以使用下面的命令来完成高可用 Kubernetes集群搭建。

$ kind create cluster --name my-cluster-ha --config my-cluster-ha.yamlCreating cluster "my-cluster-ha" ... ✓ Ensuring node image (kindest/node:v1.15.3)  ✓ Preparing nodes  ✓ Starting the external load balancer ⚖️ ✓ Creating kubeadm config  ✓ Starting control-plane ️ ✓ Joining more control-plane nodes  ✓ Joining worker nodes Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"kubectl cluster-infomaster $ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"master $ kubectl cluster-infoKubernetes master is running at https://localhost:44019KubeDNS is running at https://localhost:44019/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

同样,我们根据上面命令执行完后,输出的提示信息进行操作来验证一下集群是否部署成功。

$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-cluster-ha-control-plane Ready master 3m42s v1.15.3my-cluster-ha-control-plane2 Ready master 3m24s v1.15.3my-cluster-ha-control-plane3 Ready master 2m13s v1.15.3my-cluster-ha-worker Ready <none> 96s v1.15.3my-cluster-ha-worker2 Ready <none> 98s v1.15.3my-cluster-ha-worker3 Ready <none> 95s v1.15.3

从上面的输出结果,可以看到包含了多个 master 节点,说明高可用的 Kubernetes集群已经搭建成功。

 

其它相关知识

Kind 的镜像里的秘密

Kind镜像一共分为两类,一类是Base镜像,另一类是Node镜像。

  1. Base 镜像

Base 镜像目前使用了 ubuntu:19.04作为基础镜像,并做了下面的调整:

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

  • 安装 Kubernetes运行时的依赖包,比如:ConntrackSocatCNI等。

  • 安装容器运行环境,比如: ContainerdCrictl等。

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

更多具体的构建逻辑可以参考:https://github.com/kubernetes-sigs/kind/blob/master/images/base/Dockerfile

  1. Node 镜像

Node镜像的构建比较复杂,目前是通过运行Base镜像并在Base镜像内执行操作,再保存此容器内容为镜像的方式来构建的,包含的操作有:

  • 构建 Kubernetes相关资源,比如:二进制文件和镜像。

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

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

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

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

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

 

如何快速删除一个集群

如果你不需要本地的集群环境,通过以下命令进行删除:

$ kind delete cluster --name my-clusterDeleting cluster "my-cluster" ...$KUBECONFIG is still set to use /root/.kube/kind-config-my-cluster even though that file has been deleted, remember to unset it

至此,我们就演示完了如何使用 Kind快速搭建一个Kubernetes集群。不过有一个你需要注意的地方,Kind搭建的集群不适用于生产环境中使用。但是如果你想在本地快速构建一个Kubernetes集群环境,并且不想占用太多的硬件资源,那么Kind会是你不错的选择。

 

参考文档

  1. https://www.google.com

  2. http://t.cn/AiRVBwDS

  3. https://zhuanlan.zhihu.com/p/60464867

  4. https://yeya24.github.io/post/kind/

  5. http://dockerone.com/article/8974

  6. https://kind.sigs.k8s.io/docs/user/quick-start/



Tags:Kind   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
什么是 KindKind(Kubernetes in Docker) 是一个Kubernetes孵化项目,Kind是一套开箱即用的Kubernetes环境搭建方案。顾名思义,就是将Kubernetes所需要的所有组件,全部部署在一个D...【详细内容】
2019-09-20  Tags: Kind  点击:(135)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的&emsp;&emsp;程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条