• Kubernetes安装篇(三):基于kind快速部署本地多套K8S集群

一种更加简洁、方便的 kubernetes 集群部署方式,支持本地快速搭建多套 Kubernetes 集群环境,通过集群切换可以完成不同场景的测试,基本满足所有需求。

blog-thumb

涉足于 Kubernetes 之初时,必然少不了环境的搭建,你是否因为集群搭建步骤繁琐个人电脑配置不高运行集群多个节点有些力不从心。

VMware Fusion 12.0 发布,将 Kind 带入了我们的视野,这是 Google 官方的一个工具,是在单机运行 Kubernetes 群集的最佳方案。笔者在个人电脑上运行 Kind,并基于 Kind 搭建了多套 Kubernetes 集群环境,通过集群切换可以完成不同场景的测试,基本满足所有需求。

1、简介

kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Nodes 节点,在本地创建和运行 Kubernetes 集群的工具。适用于在本机/单机环境下快速创建 Kubernetes 集群环境进行开发和测试。

官网:https://kind.sigs.k8s.io/

优势如下:

  • 支持多节点(包括HA)集群。
  • 支持从源代码构建Kubernetes发布版本。
  • 支持Linux、macOS和Windows。
  • 是一个经过CNCF认证的符合Kubernetes的安装程序。

包含以下组件:

  • 实现集群创建、镜像构建等功能的 Golang 包。
  • 基于这些 Golang 包的命令行接口kind。
  • 提供运行在 systemd、kubernetes等环境的Docker镜像。

2、Kind 架构

kind 官方架构图如下,它将 docker 容器作为 kubernetes 的 “node”,并在该 “node” 中安装 kubernetes 组件,包括一个或者多个 Control Plane 和 一个或者多个 Work nodes。因此,解决了在本机运行多个 node 的问题,而不需要虚拟化。

Kind 架构图

3、Kind 安装

  1. Docker环境

    参考官网:Install Docker Engine

  2. 安装 kubectl

    kind 不需要 kubectl,但如果没有它,你将无法执行 kubernetes 的测试。

    MacOS:

    curl -Lo ./kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
    

    Windows 中使用 PowerShel:

    curl.exe -Lo kubectl.exe https://storage.googleapis.com/kubernetes-release/release/$(curl.exe -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/windows/amd64/kubectl.exe
    

    Linux:

    curl -Lo ./kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
    
  3. 安装 Kind

    MacOS:

    brew install kind
    

    或者

    # for Intel Macs
    [ $(uname -m) = x86_64 ]&& curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-darwin-amd64
    # for M1 / ARM Macs
    [ $(uname -m) = arm64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-darwin-arm64
    chmod +x ./kind ./kubectl
    

    Windows 中使用 PowerShel:

    curl.exe -Lo kind-windows-amd64.exe https://kind.sigs.k8s.io/dl/v0.18.0/kind-windows-amd64
    Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe
    

    Linux:

    curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
    chmod +x ./kind
    sudo mv ./kind /usr/local/bin/kind
    

4、快速上手

为创建不同配置的多套集群,建议通过定义不同集群配置文件,来完成集群的创建。

  1. 创建 kind 集群配置文件 cluster.conf

    例如:

    # cluster.conf
    kind: Cluster
    apiVersion: kind.x-k8s.io/v1alpha4
    nodes:
    - role: control-plane
    extraPortMappings:
    - containerPort: 80
       hostPort: 80
       protocol: TCP
    - containerPort: 443
       hostPort: 443
       protocol: TCP
    
  2. 创建集群

    kind create cluster --name <kind-name> --config=cluster.conf --image kindest/node:v1.21.14
    

    参数说明:

    • –config: 用于指定集群配置文件。不指定,则为默认配置。
    • –image:指定安装的 Kubernetes 版本。不指定,则为最新版本。
  3. 开始使用

    此时,kubernetes 已成功搭建,可完成所有 Kubernetes功能验证。

    # 笔者是创建了一个单节点的K8S集群。K8S集群配置,可通过集群配置文件 cluster.conf 来完成不同集群需求。
    $ kubectl get nodes
       NAME                  STATUS   ROLES                  AGE   VERSION
       istio-control-plane   Ready    control-plane,master   10s   v1.21.14
    

    如果有多个集群,可通过以下命令快速切换:

    kubectl config use-context <kind-name>
    

5、Kind 命令

子命令 说明
build base-image 构建节点Base镜像 –image string 制作出的镜像name:tag,默认kindest/base:latest –source string 镜像源码路径,默认自动检测
build node-image 构建节点镜像 –base-image 使用什么作为Base镜像 –image string 制作出的镜像name:tag,默认kindest/node:latest –kube-root string Kubernetes项目的源码目录路径,默认自动检测 –type string 构建方式,docker或bazel,默认docker
completion bash Bash自动完成
create cluster 创建一个基于Docker容器“节点”的K8S集群 –image string 用于启动集群的节点镜像 –name string 集群上下文名称,默认kind –retain 如果集群创建失败,保留节点用于诊断 –wait duration 等待控制平面节点可用,默认0s –config path 指定配置文件
delete cluster 删除一个集群 –name string 集群名称,默认kind
export logs 导出日志到指定目录,默认导出到临时目录: kind export logs ~/Downloads –name string 集群名称,默认kind
get clusters 列出已经创建的kind集群列表
get kubeconfig 打印某个集群的Kubeconfig –name string 集群名称,默认kind
get kubeconfig-path 打印某个集群的Kubeconfig的默认路径
load docker-image 从宿主机加载镜像到节点: kind load docker-image name:tag –name string 集群上下文名称,默认kind –nodes strings 目标节点列表,逗号分隔
load image-archive 从归档文件加载镜像到节点:–name string 集群上下文名称,默认kind –nodes strings 目标节点列表,逗号分隔

6、个性化集群

为了满足不同需求,建议创建多个集群,方便不同场景的测试。

创建集群时,只需指定一个配置文件(kind create cluster --name <kind-name> --config=cluster.conf),并通过 kubectl config use-context <kind-name> 完成集群的切换。

下面列举几个常用的集群配置。

6.1 多节点集群

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker

6.2 高可用控制平面

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

6.3 端口映射

可以将容器端口映射到宿主机端口,以支持NodePort类型的服务。

kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    # 默认0.0.0.0
    listenAddress: "0.0.0.0"
    # 默认tcp
    protocol: udp

6.4 指定 kubernetes 版本

可以通过设置 node 的容器镜像版本运行指定版本的 kubernetes 群集。可以在官方Release页面中中查找需要镜像 tag,带上 sha256 shasum(非必须),例如:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
- role: worker
  image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4

更多个性化配置,参考官网:Configuration


参考文章:

  1. https://kind.sigs.k8s.io
  2. 利用kind搭建本地K8S集群