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

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

什么是 Kind

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

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

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

Kind 可以做什么?

  1. 快速创建一个或多个 <code>Kubernetes/<code>集群

  2. 支持部署高可用的 <code>Kubernetes/<code>集群

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

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

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

Kind 有哪些优势?

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

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

  3. 使用容器来模似 <code>Kubernetes/<code>节点

  4. 内部使用 <code>Kubeadm/<code>的官方主流部署工具

  5. 通过了 <code>CNCF/<code>官方的<code>K8S Conformance/<code>测试

Kind 是如何工作的?

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

<code>Kind/<code>使用容器来模拟每一个<code>Kubernetes/<code>节点,并在容器里面运行<code>Systemd/<code>。 容器里的<code>Systemd/<code>托管了<code>Kubelet/<code>和<code>Containerd/<code>,然后容器内部的<code>Kubelet/<code>把其它<code>Kubernetes/<code>组件:<code>Kube-Apiserver/<code>、<code>Etcd/<code>、<code>CNI/<code>等等组件运行起来。

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

安装 Kind

安装 Kind 依赖组件

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

  1. 安装 Docker

这里以 <code>Linux/<code>系统为例:

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

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

  1. 安装 Kubectl

如果你需要通过命令行管理集群,则需要安装 <code>Kubectl/<code>。

这里以 <code>Linux/<code>系统为例:

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

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

安装 Kind

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

  1. 通过二进制安装

  • Linux

<code>$ curl -Lo ./kind https://github 
.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-linux-amd64/<code><code>$ chmod +x ./kind/<code><code>$ mv ./kind /usr/local/bin/kind/<code>
  • Windows

<code>$ curl.exe -Lo kind-windows-amd64.exe https://github.com/kubernetes-sigs/kind/releases/download/v0.5.1/kind-windows-amd64/<code><code>$ mv .\\kind-windows-amd64.exe c:\\kind.exe/<code>

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

  1. 通过源码安装

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

<code>$ go get sigs.k8s.io/[email protected]/<code>

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

使用 Kind

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

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

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

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

  • <code>create/<code>:创建一个<code>Kubernetes/<code>集群。

  • <code>delete/<code>:删除一个<code>Kubernetes/<code>集群。

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

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

使用 Kind 创建 Kubernetes 集群

搭建一个单节点集群

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

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

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

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

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

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

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

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

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

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

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

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

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

从上面的输出结果,可以看到单节点的 <code>Kubernetes/<code>已经搭建成功。单节点集群默认方式启动的节点类型是<code>control-plane/<code>,该节点包含了所有的组件。这些组件分别是:<code>2*Coredns/<code>、<code>Etcd/<code>、<code>Api-Server/<code>、<code>Controller-Manager/<code>、<code>Kube-Proxy/<code>、<code>Sheduler/<code>和网络插件<code>Weave/<code>,目前默认使用的网络插件也是<code>Weave/<code>。

创建多节点的集群

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

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

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

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

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

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

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

<code>$ kubectl get nodes/<code><code>NAME STATUS ROLES AGE VERSION/<code><code>my-cluster-multi-node-control-plane Ready master 3m20s v1.15.3/<code><code>my-cluster-multi-node-worker Ready <none> 3m8s v1.15.3/<none>/<code>
<code>$ kubectl get po -n kube-system/<code><code>NAME READY STATUS RESTARTS AGE/<code><code>coredns-86c58d9df4-cnqhc 1/1 Running 0 5m29s/<code><code>coredns-86c58d9df4-hn9mv 1/1 Running 0 5m29s/<code><code>etcd-my-cluster-multi-node-control-plane 1/1 Running 0 4m24s/<code><code>kube-apiserver-my-cluster-multi-node-control-plane 1/1 Running 0 4m17s/<code><code>kube-controller-manager-my-cluster-multi-node-control-plane 1/1 Running 0 4m21s/<code><code>kube-proxy-8t4xt 1/1 Running 0 5m27s/<code><code>kube-proxy-skd5v 1/1 Running 0 5m29s/<code><code>kube-scheduler-my-cluster-multi-node-control-plane 1/1 Running 0 4m18s/<code><code>weave-net-nmfq2 2/2 Running 1 5m27s/<code><code>weave-net-srdfw 2/2 Running 0 5m29s/<code>

创建高可用 Kubernetes 集群

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

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

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

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

  1. 创建高可用 Kubernetes 集群

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

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

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

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

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

其它相关知识

Kind 的镜像里的秘密

<code>Kind/<code>镜像一共分为两类,一类是<code>Base/<code>镜像,另一类是<code>Node/<code>镜像。

  1. Base 镜像

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

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

  • 安装 <code>Kubernetes/<code>运行时的依赖包,比如:<code>Conntrack/<code>、<code>Socat/<code>、<code>CNI/<code>等。

  • 安装容器运行环境,比如: <code>Containerd/<code>、<code>Crictl/<code>等。

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

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

  1. Node 镜像

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

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

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

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

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

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

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

如何快速删除一个集群

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

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

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

参考文档

  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/

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

你可能还喜欢

Docker / Kubernetes 镜像源不可用,教你几招搞定它!

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


分享到:


相關文章: