专栏首页雪雁的专栏使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群

使用 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
  • Windows
$ 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 支持哪些命令行操作。

$ kind
kind 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-cluster
Creating 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-info
Kubernetes master is running at https://localhost:34458
KubeDNS is running at https://localhost:34458/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

$ kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
my-cluster-control-plane   Ready     master    2m        v1.15.3

$ kubectl get po -n kube-system
NAME                                                  READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-6g66f                              1/1     Running   0          21m
coredns-86c58d9df4-pqcc4                              1/1     Running   0          21m
etcd-my-cluster-control-plane                         1/1     Running   0          20m
kube-apiserver-my-cluster-control-plane               1/1     Running   0          20m
kube-controller-manager-my-cluster-control-plane      1/1     Running   0          20m
kube-proxy-cjgnt                                      1/1     Running   0          21m
kube-scheduler-my-cluster-control-plane               1/1     Running   0          21m
weave-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: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
  1. 创建多节点 Kubernetes 集群

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

$ kind create cluster --config my-cluster-multi-node.yaml --name my-cluster-multi-node
Creating 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 nodes
NAME                                  STATUS   ROLES    AGE     VERSION
my-cluster-multi-node-control-plane   Ready    master   3m20s   v1.15.3
my-cluster-multi-node-worker          Ready    <none>   3m8s    v1.15.3

$ kubectl get po -n kube-system
NAME                                                          READY   STATUS    RESTARTS   AGE
coredns-86c58d9df4-cnqhc                                      1/1     Running   0          5m29s
coredns-86c58d9df4-hn9mv                                      1/1     Running   0          5m29s
etcd-my-cluster-multi-node-control-plane                      1/1     Running   0          4m24s
kube-apiserver-my-cluster-multi-node-control-plane            1/1     Running   0          4m17s
kube-controller-manager-my-cluster-multi-node-control-plane   1/1     Running   0          4m21s
kube-proxy-8t4xt                                              1/1     Running   0          5m27s
kube-proxy-skd5v                                              1/1     Running   0          5m29s
kube-scheduler-my-cluster-multi-node-control-plane            1/1     Running   0          4m18s
weave-net-nmfq2                                               2/2     Running   1          5m27s
weave-net-srdfw                                               2/2     Running   0          5m29s

创建高可用 Kubernetes 集群

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

  1. 创建高可用 Kubernetes 集群配置文件
$ vim my-cluster-ha.yaml

# 一共六个节点,三个 control-plane 节点,三个 workers 节点
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  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_containers
nodes:
- 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.yaml
Creating 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-info
master $ export KUBECONFIG="$(kind get kubeconfig-path --name="my-cluster-ha")"
master $ kubectl cluster-info
Kubernetes master is running at https://localhost:44019
KubeDNS 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 nodes
NAME                           STATUS   ROLES    AGE     VERSION
my-cluster-ha-control-plane    Ready    master   3m42s   v1.15.3
my-cluster-ha-control-plane2   Ready    master   3m24s   v1.15.3
my-cluster-ha-control-plane3   Ready    master   2m13s   v1.15.3
my-cluster-ha-worker           Ready    <none>   96s     v1.15.3
my-cluster-ha-worker2          Ready    <none>   98s     v1.15.3
my-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-cluster
Deleting 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/
文章分享自微信公众号:
magiccodes

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

原始发表时间:2019-09-20
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

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

    Kind(Kubernetes in Docker) 是一个 Kubernetes 孵化项目,Kind 是一套开箱即用的 Kubernetes 环境搭建方案。顾...

    iMike
  • 使用 Sealos 在 3 分钟内快速部署一个生产级别的 Kubernetes 高可用集群

    前段时间,我们在 「使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群」一文中介绍了如何使用 Kind 这个开箱即可快速部署 Kube...

    iMike
  • 使用easzup 快速部署一个 kubernetes的高可用集群

    如果提示kubectl: command not found,退出重新ssh登录一下,环境变量生效即可

    jwangkun
  • 【愚公系列】2022年04月 Kubernetes容器集群快速部署之kind高可用集群

    k8s普通搭建出来只是单master节点,如果该节点挂掉,则整个集群都无法调度,K8s高可用集群是用多个master节点加负载均衡节点组成,外层再接高可用分布式...

    愚公搬代码
  • 使用 etcdadm 三分钟内快速搭建一个生产级别的高可用 etcd 集群

    在搭建 Kubernetes 集群的过程中首先要搞定 Etcd 集群,虽然说 kubeadm 工具已经提供了默认和 master 节点绑定的 Etcd 集群自动...

    iMike
  • Kubernetes 构建工具浅析

    因此,当我们计划或者开始使用 Kubernetes 时,我们都应该尝试问自己一个问题:“我该如何进行第一次的部署?”。

    Luga Lee
  • Kubernetes 构建工具浅析

    Kubernetes 集群的组件众多,要部署一套符合生产环境的集群并不是一件容易的事。不过随着云原生生态的逐渐成熟、社区的快速发展,特别是在它成为事实上的容器编...

    Luga Lee
  • 本地运行 Kubernetes 的 4 种方法

    Kubernetes 是一个开源的容器编排平台。它由 Google 开发,为自动化部署、扩展和管理容器化应用提供了一个开源系统。虽然大多数人在云环境中运行 Ku...

    用户1880875
  • K8s节点故障:资源控制器会触发哪些动作

    定义:在Kubernetes中,不可达节点被称为分区节点partitioned node,为了了解操作方法,让我们创建一个分区节点方案并了解其行为。

    公众号: 云原生生态圈
  • 通过自定义prometheus数据实现k8s hpa

    从 Kubernetes 1.8 开始,资源使用指标(如容器 CPU 和内存使用率)通过 Metrics API 在 Kubernetes 中获取。 这些指标...

    有点技术
  • 原生Kubernetes监控功能详解-Part2

    本周三晚20:30,Kubernetes Master Class在线培训第六期《在Kubernetes中创建高可用应用》即将开播,点击文末【阅读原文】即可免费...

    CNCF
  • 使用 kube-vip 搭建高可用 Kubernetes 集群

    kube-vip 可以在你的控制平面节点上提供一个 Kubernetes 原生的 HA 负载均衡,我们不需要再在外部设置 HAProxy 和 Keepalive...

    我是阳明
  • 揭秘有状态服务上 Kubernetes 的核心技术

    之前在中通负责过缓存平台的建设工作,当时的缓存系统使用搜狐 TV 开源的 CacheCloud 缓存服务平台进行托管,但随着公司业务发展,随着而来的是资源隔离、...

    张乘辉
  • 使用kind搭建kubernetes

    kind是一个非常方便的用于创建kubernetes测试集群的工具,可以使用kind创建的集群来对kubernetes进行测试。

    charlieroro
  • 揭秘有状态服务上 Kubernetes 的核心技术

    唐聪,腾讯云资深工程师,极客时间专栏《etcd实战课》作者,etcd活跃贡献者,主要负责腾讯云大规模K8s/etcd平台、有状态服务容器化、在离线混部等产品研发...

    腾讯云原生
  • Getting Started and Beyond|云原生应用负载均衡选型指南

    冉昕,腾讯云服务网格TCM产品经理,现负责云原生流量接入网关与应用通信可观测性等产品特性策划与设计工作。

    腾讯云原生
  • 在线教育源码:使用kind快速搭建kubernetes环境的方法

    kind(KubernetesINDocker)是一个基于docker构建Kubernetes集群的工具,非常适合用来在本地搭建基于Kubernetes的开发/...

    万岳教育源码

扫码关注腾讯云开发者

领取腾讯云代金券