使用 Kind 搭建你的本地 Kubernetes 集群

Kind 是我很喜欢也一直在参与的项目,我计划将 Kind 相关的文章写成一个系列。(flag++) 这是第一篇。

Kind 介绍

Kind 是 Kubernetes In Docker 的缩写,顾名思义是使用 Docker 容器作为 Node 并将 Kubernetes 部署至其中的一个工具。官方文档中也把 Kind 作为一种本地集群搭建的工具进行推荐。

安装

二进制安装

Kind 使用 Golang 进行开发,在仓库的 Release 页面,已经上传了构建好的二进制,支持多种操作系统,可直接按需下载进行使用。

e.g.

# 下载最新的 0.2.0 版本
wget -O /usr/local/bin/kind https://github.com/kubernetes-sigs/kind/releases/download/0.2.0/kind-linux-amd64 && chmod +x /usr/local/bin/kind

通过源码安装

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

e.g.

go get -u sigs.k8s.io/kind

运行完上述命令后,会将 kind 的可执行文件放到 $(go env GOPATH)/bin 文件夹内,你可能需要将此目录加入到 $PATH 中。

或者也可以先 clone 源代码再通过 go build 进行构建。

依赖

  • Kind 的主要功能目前需要有 Docker 环境的支持,可参考 Docker 官方文档进行安装。
  • 如果需要操作集群,则需要安装 kubectl 命令行。安装方法可参考官方文档

搭建单节点集群

以下的演示均使用最新的代码(即通过源码安装)。

基础用法

搭建单节点集群是 Kind 最基础的功能。

e.g.

master $ kind create cluster --name moelove
Creating cluster "moelove" ...
 ✓ Ensuring node image (kindest/node:v1.13.4) 🖼
 ✓ 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="moelove")"
kubectl cluster-info

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

我们根据命令执行完的输出进行操作:

master $ export KUBECONFIG="$(kind get kubeconfig-path --name="moelove")"
master $ 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'.
master $ kubectl get nodes
NAME                    STATUS    ROLES     AGE       VERSION
moelove-control-plane   Ready     master    2m        v1.13.4

以上命令中,kind get kubeconfig-path --name="moelove" 会返回该指定集群配置文件所在的路径。

可以看到单节点的 Kubernetes 已经搭建成功。

注意

  • 默认情况下,Kind 会先下载 kindest/node:v1.13.4 镜像,该镜像目前托管于 Docker Hub 上,下载时间取决于网络状况。
  • Kind 实际使用 kubeadm 进行集群的创建,对 kubeadm 有所了解的人都知道它默认使用的镜像在国内下载不到,所以需要自己解决网络问题。或者参考下面的方式:

Kind 在创建集群的时候,支持通过 --config 的参数传递配置文件给 Kind,在国内,我们可以通过使用国内镜像源的方式来加速集群的创建。(这个方法也适用于直接通过 kubeadm 搭建 Kubernetes 集群)

我们先通过以下命令删除刚才搭建的集群:

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

接下来,将下面的配置内容保存至一个 YAML 文件中,比如名为 kind-config.yaml

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta1
  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/v1beta1
  kind: InitConfiguration
  metadata:
    name: config
  networking:
    serviceSubnet: 10.0.0.0/16
  imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane

我们使用该配置文件搭建集群。

master $ kind create cluster --name moelove --config kind.yaml
Creating cluster "moelove" ...
 ✓ Ensuring node image (kindest/node:v1.13.4) 🖼
 ✓ 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="moelove")"
kubectl cluster-info

上面通过 --config 将我们的配置文件传递给 Kind 用于搭建集群,推荐国内用户使用这种方式

搭建高可用集群

Kind 也支持搭建高可用的 K8S 集群,不过只能通过配置文件来实现。可以直接将下面的内容保存至文件中,再将配置文件传递给 Kind 即可。

e.g.

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
  apiVersion: kubeadm.k8s.io/v1beta1
  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/v1beta1
  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

我们使用以下的命令来搭建高可用的 Kubernetes 集群:

master $ kind create cluster --name moelove-ha --config kind-ha-config.yaml
Creating cluster "moelove-ha" ...
 ✓ Ensuring node image (kindest/node:v1.13.4) 🖼
 ✓ 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="moelove-ha")"
kubectl cluster-info
master $ export KUBECONFIG="$(kind get kubeconfig-path --name="moelove-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'.

可以做下简单的验证:

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

可以看到已经成功创建了多 master 的 Kubernetes 集群。

总结

这是使用 Kind 搭建本地 Kubernetes 集群的第一篇,同时本篇的内容也是《Kubernetes 从上手到实践》第 4 节内容的补充,搭配食用效果更佳 :)


可以通过下面二维码订阅我的文章公众号【MoeLove】

TheMoeLove


K8S生态
Container, Docker, Go, Kubernetes, Python, Vim; 微信公众号: MoeLove
1.5k 声望
19.7k 粉丝
0 条评论
推荐阅读
K8S 生态周报| Podman 开始废弃 CNI plugins, 推进自己的网络堆栈
BuildKit 我以前有很多篇文章中都有介绍过了。它是 Docker 的下一代构建引擎,目前在 Docker Desktop 中已经默认启用,在 Docker 的下一个版本 v23.0 中也会默认启用,对 Docker 中构建引擎感兴趣的小伙伴可以查...

张晋涛阅读 257

封面图
Docker学习:Image的本地存储结构
在使用Docker时候,针对镜像的操作一般就是docker pull,docker build,docker commit(刚开始接触Docker的时候,还不会Dockerfile,经常使用这个命令,但是经历了一次血的教训,已经放弃这个命令很久)这些操作...

backbp4阅读 9.7k评论 3

使用docker快速搭建xssPlatform测试平台实践
笔者之前给一些开发团队多次做Web安全开发培训,为了让培训的学员能够理解XSS原理和XSS的危害,将xssPlatform进行了更新,之前一直放在GitHub中;发现关注的人越来越多,很多人在安装的过程中遇到问题不知道怎么...

汤青松1阅读 25.8k

利用Docker部署管理LDAP及其初次使用
前言:本周主要写了gitlabWebhook转github的项目,总体上没有遇到什么大问题,这周接触到了LDAP,于是就花时间实际操作了解了一下。

李明5阅读 884

BI系统打包Docker镜像及部署的技术难度和实现
随着容器化技术盛行,Docker在前端领域也有着越来越广泛的应用;传统的前端部署方式需要我们将项目打包生成一系列的静态文件,然后上传到服务器,配置nginx文件;如果我们使用容器化部署,将部署操作都命令化,集...

葡萄城技术团队2阅读 8.3k

Kubernetes v1.26 新特性一览
我每期的 「k8s生态周报」都有一个叫上游进展的部分,所以很多值得关注的内容在之前的文章中已经发过了。这篇中我会再额外介绍一些之前未涵盖的,和之前介绍过的值得关注的内容。

张晋涛2阅读 628评论 1

封面图
深入剖析容器网络和 iptables
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。

张晋涛3阅读 1.3k

封面图
1.5k 声望
19.7k 粉丝
宣传栏