02 本机搭建kubernetes学习环境kubemini

1. 什么是容器编排?

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

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

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

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

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

2. 什么是 Kubernetes?

现在大家谈到容器都会说是 Docker,但其实早在 Docker 之前,Google 在公司内部就使用了类似的技术(cgroup 就是 Google 开发再提交给 Linux 内核的),只不过不叫容器。

作为世界上最大的搜索引擎,Google 拥有数量庞大的服务器集群,为了提高资源利用率和部署运维效率,它专门开发了一个集群应用管理系统,代号 Borg,在底层支持整个公司的运转。

2014 年,Google 内部系统要“升级换代”,从原来的 Borg 切换到 Omega,于是按照惯例,Google 会发表公开论文。

因为之前在发表 MapReduce、BigTable、GFS 时吃过亏(被 Yahoo 开发的 Hadoop 占领了市场),所以 Google 决定借着 Docker 的“东风”,在发论文的同时,把 C++ 开发的 Borg 系统用 Go 语言重写并开源,于是 Kubernetes 就这样诞生了。
在这里插入图片描述

2.1 Kubernetes 到底能够为我们做什么呢?

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

3. 什么是 minikube

Kubernetes 一般都运行在大规模的计算集群上,管理很严格,这就对我们个人来说造成了一定的障碍,没有实际操作环境怎么能够学好用好呢?

好在 Kubernetes 充分考虑到了这方面的需求,提供了一些快速搭建 Kubernetes 环境的工具,在官网(https://kubernetes.io/zh/docs/tasks/tools/)上推荐的有两个:kind 和 minikube,它们都可以在本机上运行完整的 Kubernetes 环境。

  • kind
    基于 Docker,意思是“Kubernetes in Docker”。它功能少,用法简单,也因此运行速度快,容易上手。不过它缺少很多 Kubernetes 的标准功能,例如仪表盘、网络插件,也很难定制化,所以我认为它比较适合有经验的 Kubernetes 用户做快速开发测试,不太适合学习研究

  • minikube,
    从名字就能够看出来,它是一个“迷你”版本的 Kubernetes,自从 2016 年发布以来一直在积极地开发维护,紧跟 Kubernetes 的版本更新,同时也兼容较旧的版本(最多只到之前的 6 个小版本)。

    minikube 最大特点就是“小而美”,可执行文件仅有不到 100MB,运行镜像也不过 1GB,但就在这么小的空间里却集成了 Kubernetes 的绝大多数功能特性,不仅有核心的容器编排功能,还有丰富的插件,例如 Dashboard、GPU、Ingress、Istio、Kong、Registry 等等,综合来看非常完善。

这里选择 minikube 来学习 Kubernetes。

4. 如何搭建 minikube 环境

minikube 的最新版本是 1.25.2,支持的 Kubernetes 版本是 1.23.3,所以我们就选定它作为我们初级篇的学习工具。

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

minikube 的官网提供了各种系统的安装命令,通常就是下载、拷贝这两步,不过你需要注意一下本机电脑的硬件架构,Intel 芯片要选择带“amd64”后缀,Apple M1 芯片要选择“arm64”后缀,选错了就会因为 CPU 指令集不同而无法运行:

4.1 minikube 安装

# Intel x86_64
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

# Apple arm64
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64
chmod +x minikube
minikube version
#minikube version: v1.28.0
#commit: 986b1ebd987211ed16f8cc10aed7d2c42fc8392f
sudo install minikube /usr/local/bin/

4.2 kubectl 安装

不过 minikube 只能够搭建 Kubernetes 环境,要操作 Kubernetes,还需要另一个专门的客户端工具“kubectl”。kubectl 的作用有点类似之前我们学习容器技术时候的工具“docker”,它也是一个命令行工具,作用也比较类似,同样是与 Kubernetes 后台服务通信,把我们的命令转发给 Kubernetes,实现容器和集群的管理功能。kubectl 是一个与 Kubernetes、minikube 彼此独立的项目,所以不包含在 minikube 里,但 minikube 提供了安装它的简化方式,你只需执行下面的这条命令:

minikube kubectl

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

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

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

5. 验证实验节点

前面的工作都做完之后,我们就可以在本机上运行 minikube,创建 Kubernetes 实验环境了。使用命令 minikube start 会从 Docker Hub 上拉取镜像,以当前最新版本的 Kubernetes 启动集群。不过为了保证实验环境的一致性,我们可以在后面再加上一个参数 --kubernetes-version,明确指定要使用 Kubernetes 版本。这里我使用“1.23.3”,启动命令就是:

启动服务
ps:minikube 是用来学习的,不是生产,如果机器关机导致服务停止,需要手动再次启动

minikube start --kubernetes-version=v1.23.3

在这里插入图片描述

#查看集群状态
minikube status 
minikube node list

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

5.1 kubectl 使用

kubectl version 在这里不能直接使用,因为使用 minikube 自带的 kubectl 有一点形式上的限制,要在前面加上 minikube 的前缀,后面再有个 --,像这样

  • 使用方法

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

    alias kubectl="minikube kubectl --"
    
  • 自动补全功能
    另外,kubectl 还提供了命令自动补全的功能,你还应该再加上“kubectl completion”:source <(kubectl completion bash)

    source <(kubectl completion bash)
    

在这里插入图片描述

5.2 在kubernetes 运行第一个应用

在 Kubernetes 里运行一个 Nginx 应用,命令与 Docker 一样,也是 run,不过形式上有点区别,需要用 --image 指定镜像,然后 Kubernetes 会自动拉取并运行

kubectl run nginx --image=nginx:alpine
kubectl get pod

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

5.3 安装minikube 遇到的问题

X Exiting due to DRV_AS_ROOT: The “docker” driver should not be used with root privileges.

①创建用户:
useradd test
passwd test  #设置密码
su test 切换用户

②将test添加到docker组
sudo usermod -aG docker $USER && newgrp docker

③修改test用户权限
#在 sudoers 文件加上这一行
minghai            ALL=(ALL)             ALL  

6. 思考的问题

6.1 怎么理解容器编排和 Kubernetes 的?它们应该能够解决什么问题?

6.1.1 容器编排理解

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

  • 回滚
  • 滚动升级
  • 故障自愈
  • 自动扩缩容

容器编排:运行容器(程序)的应用程序,这些应用程序的构建方式,使他们能够实现回滚,滚动升级,故障自愈,自动扩缩容等

6.1.2 Kubernetes理解

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

6.1.3

容器编排应该解决的问题:能够一次启动多了容器,适合生产使用
k8s 应该解决的问题:提供各类组件,插件更好的为容器(应用程序)实现功能

Kubernetes 就是一个生产级别的容器编排平台和集群管理系统,不仅能够创建、调度容器,还能够监控、管理服务器

6.2 Kubernetes 和 Docker 之间有什么区别?

docker和k8s之间的区别,一个是容器技术,一个是容器编排技术,两者思考的维度是不一样的,就容器而言,容器解决的问题是隔离,是一次打包到处运行的问题,最大的价值就在于镜像的迁移。编排技术则是关注的是整个系统的问题,如果你只关注一个服务,迁移一个服务,那docker就够,但要迁移整个系统以及运维,那就需要编排,包括网络关系,负载均衡,回滚,监控,扩缩容问题则需要容器编排技术。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值