一、什么是容器编排?

容器技术的核心概念是容器、镜像、仓库,使用这三大基本要素我们就可以轻松地完成应用的打包、分发工作,实现“一次开发,到处运行”的梦想。

不过,当我们熟练地掌握了容器技术,信心满满地要在服务器集群里大规模实施的时候,却会发现容器技术的创新只是解决了运维部署工作中一个很小的问题。现实生产环境的复杂程度实在是太高了,除了最基本的安装,还会有各式各样的需求,比如服务发现、负载均衡、状态监控、健康检查、扩容缩容、应用迁移、高可用等等。

虽然容器技术开启了云原生时代,但它也只走出了一小步,再继续前进就无能为力了,因为这已经不再是隔离一两个进程的普通问题,而是要隔离数不清的进程,还有它们之间互相通信、互相协作的超级问题,困难程度可以说是指数级别的上升。

这些容器之上的管理、调度工作,就是这些年最流行的词汇:“容器编排”(Container Orchestration)

容器编排这个词听起来好像挺高大上,但如果你理解了之后就会发现其实也并不神秘。像我们在上次课里使用 Docker 部署 WordPress 网站的时候,把 Nginx、WordPress、MariaDB 这三个容器理清次序、配好 IP 地址去运行,就是最初级的一种“容器编排”,只不过这是纯手工操作,比较原始、粗糙。

面对单机上的几个容器,“人肉”编排调度还可以应付,但如果规模上到几百台服务器、成千上万的容器,处理它们之间的复杂联系就必须要依靠计算机了,而目前计算机用来调度管理的“事实标准”,就是我们主角:Kubernetes。

二、什么是 Kubernetes

简单来说,Kubernetes 就是一个生产级别的容器编排平台和集群管理系统,不仅能够创建、调度容器,还能够监控、管理服务器,它凝聚了 Google 等大公司和开源社区的集体智慧,从而让中小型公司也可以具备轻松运维海量计算节点——也就是“云计算”的能力。

三、什么是 minikube

快速搭建Kubernetes 环境的工具(官网) 点我 >_< !

它是一个“迷你”版本的 Kubernetes,自从 2016 年发布以来一直在积极地开发维护,紧跟 Kubernetes 的版本更新,同时也兼容较旧的版本(最多只到之前的 6 个小版本)。minikube 最大特点就是“小而美”,可执行文件仅有不到 100MB,运行镜像也不过 1GB,但就在这么小的空间里却集成了 Kubernetes 的绝大多数功能特性,不仅有核心的容器编排功能,还有丰富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等等,综合来看非常完善。

四、如何搭建 minikube 环境

minikube 支持 Mac、Windows、Linux 这三种主流平台,你可以在它的官网(https://minikube.sigs.k8s.io/docs/start/)找到详细的安装说明,当然在我这里就只用虚拟机里的 Linux 了。

minikube 不包含在系统自带的 apt/yum 软件仓库里,我们只能自己去网上找安装包。不过因为它是用 Go 语言开发的,整体就是一个二进制文件,没有多余的依赖,所以安装过程也非常简单,只需要用 curl 或者 wget 下载就行。
在这里插入图片描述

注意:这里我下载v1.25.2版本的minikube 支持的k8s版本,支持的 Kubernetes 版本是 1.23.3,如果想要安装最新版本可以直接用releases版本 支持1.26版本的k8s

1.下载minikube并安装

# 根据服务器的架构选择对应的二进制包
# Intel x86_64
curl -Lo minikube https://storage.googleapis.com/minikube/v1.25.2/latest/minikube-linux-amd64
sudo install minikube /usr/local/bin/
# 最新版本 
# Intel x86_64
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube /usr/local/bin/

2.检测minikube是否正常安装

安装完成之后,你可以执行命令 minikube version,看看它的版本号,验证是否安装成功:

[root@k8s-minkube ~]# minikube version
minikube version: v1.25.2
commit: 362d5fdc0a3dbee389b3d3f1034e8023e72bd3a7

在这里插入图片描述

3.k8s命令客户端工具-kubectl

minikube 只能够搭建 Kubernetes 环境,要操作 Kubernetes,还需要另一个专门的客户端工具“kubectl”。
kubectl 它是一个命令行工具,作用也比较类似,同样是与 Kubernetes 后台服务通信,把我们的命令转发给 Kubernetes,实现容器和集群的管理功能。

kubectl 是一个与 Kubernetes、minikube 彼此独立的项目,所以不包含在 minikube 里,但 minikube 提供了安装它的简化方式,你只需执行下面的这条命令:

# minikube kubectl

它就会把与当前 Kubernetes 版本匹配的 kubectl 下载下来,存放在内部目录(例如 .minikube/cache/linux/amd64/v1.23.3),然后我们就可以使用它来对 Kubernetes“发号施令”了。

所以,在 minikube 环境里,我们会用到两个客户端:minikube 管理 Kubernetes 集群环境,kubectl 操作实际的 Kubernetes 功能,和 Docker 比起来有点复杂。

我画了一个简单的 minikube 环境示意图,方便理解它们的关系。
在这里插入图片描述

4.实际验证 minikube 环境

前面的工作都做完之后,我们就可以在本机上运行 minikube,创建 Kubernetes 实验环境了。

注意:使用命令 minikube start 会从 Docker Hub 上拉取镜像,以当前最新版本的 Kubernetes 启动集群。不过为了保证实验环境的一致性,我们可以在后面再加上一个参数 --kubernetes-version,明确指定要使用 Kubernetes 版本。

这里我使用“1.23.3”,启动命令就是:
解释:--force 默认不允许用root安装,这个参数的意思是强制用root安装
--image-mirror-country='cn' 切换国内源,默认是拉取国外官方镜像可能会下载不下来,所以切换到国内

[root@k8s-minkube ~]# minikube start  --image-mirror-country='cn'  --kubernetes-version=v1.23.3 --force

如果想安装最新版本,新版本的k8s使用的是containerd作为容器,需要执行以下操作
minikube start --driver=docker --container-runtime=containerd --image-mirror-country='cn' --force
注意的是:新版本依赖的容器版本肯能会很高,版本参考建议,也可以去官网:
docker:23.0.1
minikube:1.29.0
kubectl:1.26.1

我这里已经提前下载过了
在这里插入图片描述

4.1 查看集群状态

# 查看当前节点,因为单机所以只要一个节点
[root@k8s-minkube ~]# minikube node list
minikube	192.168.49.2

# 查看集群组件状态
[root@k8s-minkube ~]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

可以看到 Kubernetes 集群里现在只有一个节点,名字就叫“minikube”,类型是“Control Plane”,里面有 host、kubelet、apiserver 三个服务,IP 地址是 192.168.49.2。

你还可以用命令 minikube ssh 登录到这个节点上,虽然它是虚拟的,但用起来和实机也没什么区别:

[root@k8s-minkube ~]# minikube ssh
Last login: Sun Mar 19 12:21:24 2023 from 192.168.49.1
docker@minikube:~$ 

5.操作k8s集群

有了集群,接下来就可以使用 kubectl 来操作一下,初步体会 Kubernetes 这个容器编排系统,最简单的命令当然就是查看版本:

kubectl version

注意: 不过这条命令还不能直接用,因为使用 minikube 自带的 kubectl 有一点形式上的限制,要在前面加上 minikube 的前缀,后面再有个 --,像这样:

minikube kubectl -- version

为了避免这个不大不小的麻烦,我建议你使用 Linux 的“alias”功能,为它创建一个别名,写到当前用户目录下的 .bashrc 里,也就是这样:

echo "alias kubectl='minikube kubectl --'" >> $HOME/.bashrc

加载k8s命令自动补全功能

source <(kubectl completion bash)

操作完后就可以直接使用kubectl 操作了

[root@k8s-minkube ~]# kubectl version --short
Client Version: v1.23.3
Server Version: v1.23.3
[root@k8s-minkube ~]# kubectl version --client
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:25:17Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}

在这里插入图片描述

6.在k8s运行nginx应用

注意:需要用 --image 指定镜像,然后 Kubernetes 会自动拉取并运行

kubectl run ngx --image=nginx:alpine

这里涉及 Kubernetes 里的一个非常重要的概念:Pod,你可以暂时把它理解成是“穿了马甲”的容器,查看 Pod 列表需要使用命令 kubectl get pod,它的效果类似 docker ps:

[root@k8s-minkube ~]# kubectl get pod
NAME                     READY   STATUS      RESTARTS         AGE
ngx                      1/1     Running     0                8s

命令执行之后可以看到,在 Kubernetes 集群里就有了一个名字叫 ngx 的 Pod 正在运行,表示我们的这个单节点 minikube 环境已经搭建成功。

扩展知识:
1.1、如何理解容器编排?
先拆成两个部分,什么是容器?什么是编排?以前,程序运行在物理机或虚拟机中。容器,是现代程序的运行方式。编排就是部署、管理应用程序的系统,能动态地响应变化,例如以下部分功能。

  • 回滚
  • 滚动升级
  • 故障自愈
  • 自动扩缩容
    自动完成以上所有任务。需要人工最初进行一些配置,就可以一劳永逸。回顾一下,什么是容器编排,运行容器形式的应用程序,这些应用程序的构建方式,使它们能够实现回滚、滚动升级、故障自愈、自动扩缩容等。

1.2、如何理解 Kubernetes?
举一个例子,寄、收快递的过程。发件人将货物按照快递公司的标准打包,提供基本信息(收货地址等),然后交给快递小哥。其他事情,无需发件人操心了,例如快递用什么交通工具运输、司机走哪条高速等等。快递公司同时提供物流查询、截断快递等服务。重点在于,快递公司仅需要发件人提供基本信息。Kubernetes 也是类似的,将应用程序打包成容器,声明运行方式,交给 Kubernetes 即可,同时它提供了丰富的工具和 API 来控制、观测运行在平台之上的应用程序。

1.3 容器编排应该能够解决什么问题?
屏蔽底层的复杂性。

2、Kubernetes 和 Docker 之间有什么区别?
Docker 应用打包、测试、交付。Kubernetes 基于 Docker 的产物,进行编排、运行。例如现在有 1 个集群,3 个节点。这些节点,都以 Docker 作为容器运行时,Docker 是更偏向底层的技术。Kubernetes 更偏向上层的技术 ,它实现了对容器运行时的抽象,抽象的目的是兼容底层容器运行时(容器进行时技术不仅有 Docker,还有 containerd、kata 等,无论哪种容器运行时,Kubernetes 层面的操作都是一样的)以及解耦,同时还提供了一套容器运行时的标准。抽象的产物是容器运行时接口 CRI。

总结

  1. 容器技术只解决了应用的打包、安装问题,面对复杂的生产环境就束手无策了,解决之道就是容器编排,它能够组织管理各个应用容器之间的关系,让它们顺利地协同运行。
  2. Kubernetes 源自 Google 内部的 Borg 系统,也是当前容器编排领域的事实标准。minikube 可以在本机搭建 Kubernetes 环境,功能很完善,适合学习研究。
  3. 操作 Kubernetes 需要使用命令行工具 kubectl,只有通过它才能与 Kubernetes 集群交互。
  4. kubectl 的用法与 docker 类似,也可以拉取镜像运行,但操作的不是简单的容器,而是 Pod。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐