Kubernetes 构建工具浅析

简介: Kubernetes 集群的组件众多,要部署一套符合生产环境的集群并不是一件容易的事。不过随着云原生生态的逐渐成熟、社区的快速发展,特别是在它成为事实上的容器编排标准以后,基本所有的主流云平台都完全支持 Kubernetes,或把它作为核心的云解决方案。同时,本地部署也伴随着出现了各类成熟的主动化解决方案。

    Kubernetes 集群的组件众多,要部署一套符合生产环境的集群并不是一件容易的事。不过随着云原生生态的逐渐成熟、社区的快速发展,特别是在它成为事实上的容器编排标准以后,基本所有的主流云平台都完全支持 Kubernetes,或把它作为核心的云解决方案。同时,本地部署也伴随着出现了各类成熟的主动化解决方案。    

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

    在本文中,笔者将向大家介绍 4 种不同的技术,大家可以基于此 4 种不同的构建工具在自己的计算机上使用 Kubernetes。对于每一个,笔者尽可能都会对解决方案进行简短描述,并对其优缺点进行分析,以帮助大家能够对 Kubernetes 的有所了解。

Minikube

    Minikube 是由 Kubernetes 社区维护的单机版的 Kubernetes 集群,其支持 macOS, Linux 、以及 Windows 等多种操作系统平台,基于其最新的官方 Stable 版本,并开始支持 Kubernetes 的大部分功能,从基础的容器编排管理,到高级特性如负载均衡、Ingress,权限控制等。非常适合作为 Kubernetes入门,或开发测试环境使用。

   Minikube 支持以下 Kubernetes 功能:DNS、NodePorts、ConfigMaps 和 Secrets、Dashboards、容器运行时: Docker、CRI-O 以及 containerd、启用 CNI (容器网络接口)以及 Ingress 等等。架构示意图如下所示:

    下面我们以 Mac 环境为例,简要描述下 Minikube 相关部署过程,具体如下所示:


[administrator@JavaLangOutOfMemory ~ ]% /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

[administrator@JavaLangOutOfMemory ~ ]% brew  install minikube

[administrator@JavaLangOutOfMemory ~ ]% minikubestart

    当然,我们还可以自定义参数进行启动,具体如下所示:  


[administrator@JavaLangOutOfMemory ~ ]%  minikube start --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.x.x.iso
                 --registry-mirror=https://registry.docker-cn.com
                 --image-mirror-country=cn
                 --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
                 --vm-driver=none
                 --memory=4096

    部署完成后,检测相关配置参数等。


[administrator@JavaLangOutOfMemory ~ ]% kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.2", GitCommit:"092fbfbf53427de67cac1e9fa54aaa09a28371d7", GitTreeState:"clean", BuildDate:"2021-06-16T12:52:14Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.7", GitCommit:"132a687512d7fb058d0f5890f07d4121b3f0a2e2", GitTreeState:"clean", BuildDate:"2021-05-12T12:32:49Z", GoVersion:"go1.15.12", Compiler:"gc", Platform:"linux/amd64"}
[administrator@JavaLangOutOfMemory ~ ]% kubectl get node -o wide
NAME       STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
minikube   Ready    control-plane,master   15h   v1.20.7   192.168.49.2   <none>        Ubuntu 20.04.2 LTS   5.10.25-linuxkit   docker://20.10.7
[administrator@JavaLangOutOfMemory ~ ]% kubectl get pod -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-74ff55c5b-p6dlz            1/1     Running   0          15h
kube-system   etcd-minikube                      1/1     Running   0          15h
kube-system   kube-apiserver-minikube            1/1     Running   0          15h
kube-system   kube-controller-manager-minikube   1/1     Running   0          15h
kube-system   kube-proxy-dcr72                   1/1     Running   0          15h
kube-system   kube-scheduler-minikube            1/1     Running   0          15h
kube-system   storage-provisioner                1/1     Running   3          15h

    Minikube 是一个 Kubernetes-SIGs 项目,其实现方法为生成一个实质上是单节点K8s 集群的 VM。由于对一系列管理程序的支持,它可以在所有主要操作系统上使用。还允许并行创建多个实例。基于用户的角度而言,Minikube 是一款非常适合初学者的工具。使用 minikube start 命令行启动集群,几分钟后 Kubectl 就可以开始了。若要指定特定的 Kubernetes 版本,可以使用--Kubernetes version 标志参数即可。

Kind

    Kind 即 “Kubernetes In Docker” 的缩写,顾名思义是使用 Docker 容器作为 Node 并将 Kubernetes 部署至其中的一个工具。官方文档中也把 Kind 作为一种本地集群搭建的工具进行推荐。Kind 是一个命令行工具,可帮助我们基于 Docker 镜像创建本地 Kubernetes 集群,使其能够模拟本地系统上的 Kubernetes 集群。

   Kind 是另一个 Kubernetes SIGs 项目,但与 Minikube 相比有很大不同。顾名思义,它将集群移动到 Docker 容器中。与生成 VM 相比,这将显著加快启动速度。创建集群与 Minikube 的方法非常相似。执行类创建集群。通过使用不同的名称(-name)kind,可以并行创建多个实例。架构意图如下所示:

     与 Minikube 类似,简要描述一下其部署过程,具体如下所示:


[administrator@JavaLangOutOfMemory ~ ]% brew install kind
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/kind-0.11.1.big_sur.bottle.tar.gz
######################################################################## 100.0%
==> Pouring kind-0.11.1.big_sur.bottle.tar.gz
==> Caveats
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Summary
  /usr/local/Cellar/kind/0.11.1: 8 files, 8.4MB
[administrator@JavaLangOutOfMemory ~ ]% kind version 
kind v0.11.1 go1.16.4 darwin/amd64                                                                              kind v0.11.1 go1.16.4 darwin/amd64

    接下来,将下面的配置内容保存至一个 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.1/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.1/16
  imageRepository: registry.aliyuncs.com/google_containers
nodes:
- role: control-plane
[administrator@JavaLangOutOfMemory ~ ]% Kind create cluster --name demo-cls --config kind.yaml
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.21.1) 🖼
 ✓ 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="demo-cls")"
kubectl cluster-info

    基于此解决方案,允许我们部署所有类型的集群:例如:单节点、1个 Master 和几个 Worker 以及多个 Master 和多个 Worker。不仅如此,这些集群非常容易部署。通常可以借助一个非常简单的 YAML 文件完成。

    从本质上而言,Kind 并不是打包一个虚拟化镜像,而是直接将基于 K8S 组件运行在 Docker 环境。那么,此种模式能够带来了哪些好处呢?具体主要涉及下方面:

    1、不需要运行 Guest OS ,占用资源更低。

    2、不基于虚拟化技术,可以在 VM 中使用。

    3、文件更小,更利于移植。

K3s

   基于其简单性。作为一个单一的二进制文件(约100MB)进行打包和部署,我们只需几秒钟就可以得到一个完全成熟的 Kubernetes 集群。安装体验就像在集群的每个节点上运行一个脚本一样简单。

   基于其二进制文件封装实体,K3s 几乎运行了 Kubernetes 集群的所有组件,包括API server、Scheduler 和 Controller。默认情况下,每个 K3s 的安装都包括控制平面、Kubelet 和 Containerd运行时,这些已经足以运行 Kubernetes 工作负载。当然,也可以添加只运行 Kubelet Agent 和 Containerd 运行时的专用 Worker 节点,来调度和管理 Pod 生命周期。

    与传统的 Kubernetes 集群相比,K3s 中的 Master 节点和 Worker 节点并没有明显的区别。可以在任何节点上调度和管理 Pod,不管它们扮演的是什么角色。所以,Master 节点和 Worker 节点的命名方式不适用于 K3s 集群。

   在 K3s 集群中,将运行控制平面组件与Kubelet的节点称为 Server,而只运行 Kubelet 的节点称为 Agent。Server 和 Agent 都有容器运行时和一个 Kubeproxy ,管理整个集群的 Tunnel 和网络流量。其单节点架构示意图如下所示:

源自官网(同下)

    K3s 单节点集群的架构如上图所示,该集群有一个内嵌 SQLite 数据库的单节点 K3s Server。在这种配置中,每个 Agent 节点都注册到同一个 Server 节点。K3s 用户可以通过调用 Server 节点上的 K3s API 来操作 Kubernetes 资源。

    虽然单节点 k3s 集群可以满足各种用例,但对于 Kubernetes Control-Plane 的正常运行至关重要的环境,我们可以在高可用配置中运行 K3s。一个高可用 K3s 集群由以下几个部分组成:

    1、K3s Server 节点:两个或更多的 Server 节点将为 Kubernetes API 提供服务并运行其他 Control-Plane 服务

    2、外部数据库:与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反,高可用 K3s 需要挂载一个 External Database 外部数据库作为数据存储的媒介。

    其高可用架构示意图如下所示:

    相对于上述的组件工具,K3s 部署起来较为简单,毕竟其已经被作为集成的组件进行部署运行,具体可参考如下命令行所示:


[administrator@JavaLangOutOfMemory ~ ]% curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -


Kubeadm

    Kubeadm 是一个基于 Kubeadm init 和 Kubeadm join 的工具组件, 提供了一个创建 Kubernetes 集群的 “快捷途径” 的最佳实践。通过执行必要的操作来启动和运行最小可用集群。依据其设计理念,仅关注启动引导,而非配置机器。同样的,安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展,都不在讨论范围内。理想情况下,使用 Kubeadm 作为所有部署工作的基准将会更加易于创建一致性集群。

    其参考架构示意图如下所示:

    对于初学者而言,此外,Kubeadm 允许我们选择容器运行时,以及使用默认配置的 Docker。这对大家很有帮助,基于此能够使用 Docker 命令检查 Kubernetes 创建的容器。

    综上所述,在实际的场景中,合理利用“恰如其分”的构建工具,对于我们进行容器平台的部署或多或少具有参考意义。只有对相关工具的深入理解、实践,我们才能够在日常的容器开发、运维活动中从容应对。


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
Kubernetes 监控 网络协议
|
存储 Kubernetes 容器
利用Helm简化Kubernetes应用部署
Helm 是由 Deis 发起的一个开源工具,有助于简化部署和管理 Kubernetes 应用。本文将介绍Helm的基本概念和使用方式,演示在阿里云的Kubenetes集群上利用 Helm 来部署应用。
40377 1
利用Helm简化Kubernetes应用部署
|
存储 Kubernetes 容器
【Kubernetes】retrywatcher 在开发中的应用
介绍了 kubernetes 资源 watch 的工具类 retrywatcher 在开发中的应用
925 0
【Kubernetes】retrywatcher 在开发中的应用
|
Kubernetes 容器 数据安全/隐私保护
【Kubernetes系列】第4篇 Kubernetes包管理工具-helm介绍
01 概述 Helm是kubernetes包管理工具,可以方便快捷的安装、管理、卸载kubernetes应用,类似于Linux操作系统中yum或apt-get软件的作用。其主要的设计目的: 创建新的chart包 将charts包文件打包压缩 同chart仓库进行集成,获取charts文件 安装及卸载charts到kubernetes集群 管理通过helm安装的charts应用 02 概念介绍 chart: 一个 Helm 包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义。
1697 0
|
存储 Kubernetes 容器
简化Kubernetes应用部署工具-Helm安装
本文讲的是简化Kubernetes应用部署工具-Helm安装【编者的话】微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。
4681 0
|
存储 Kubernetes Cloud Native
2021年必会的3个Kubernetes工具
2021年必会的3个Kubernetes工具
255 0
|
Kubernetes 监控 负载均衡
10个最佳的Kubernetes工具
Kubernetes生态工具整理
1239 0
10个最佳的Kubernetes工具
|
Kubernetes 负载均衡 安全
Kubernetes必备知识: CNI插件
CNI插件负责将网络接口插入容器网络命名空间(例如,veth对的一端),并在主机上进行任何必要的改变(例如将veth的另一端连接到网桥)。然后将IP分配给接口,并通过调用适当的IPAM插件来设置与“IP地址管理”部分一致的路由。
630 0
|
Kubernetes Docker 容器
k8s与CICD--利用helm部署应用到kubernetes
前言 本小节应该是这个系列剩下的两个小节之一了。剩下一个是之前承诺好的drone-wechart插件。本节主要介绍利用helm部署应用到kubernetes中。 至于helm,详细可以参考FreeWheel Lead Engineer 张夏写的一系列文章。
2876 0
|
存储 运维 Kubernetes
基于Kubernetes的CICD实战
基于Kubernetes的CICD实战

热门文章

最新文章