kubernetes(k8s)基础学习-kubernetes是什么?

一、认识 Docker

Docker 是什么

先来看看 Docker 的图标:

image-20230209171607579

一条鲸鱼背上驮着四方形块的物品,就像一条海运船上装满集装箱,集装箱里装载了各种各样的物品,集装箱不会管装的物品是什么。

Docker 就像这艘海运船,它要把各种应用程序和软件一起打包,然后装进 Docker 里,Docker 可以对它们进行管理。

你可以把 Docker 作为一个软件部署的单元,里面可以包含代码和各种软件依赖项。

比如,编写了一个 PHP 项目,用到的软件有 MySQL、Nginx,那么你可以把 PHP + MySQL + Nginx 一起打包,装进

Docker 里。这就是一个 PHP 项目的部署单元。可以通过 Docker,把这个部署单元部署到任意服务器或云上。

image-20230209174343762

​ 图:Docker 把 PHP、Nginx 和 MySQL 打包

Docker 是什么?

Docker 是一个开源项目,也是一个容器,它可以将程序及相关软件打包在一起,形成一个程序部署单元,我们就可以快速将程序部署单元部署到服务器或云上。

build everythin,run anywhere。Build,Ship,Run。

说明:

有很多容器工具,Docker 只是其中之一,比如 Podman,Container 等。

Docker 的优点

与传统部署有什么区别?

传统部署:应用程序安装,依赖软件包安装,修改配置文件等多个步骤才能部署一个程序项目。依赖软件的安装过程可能会出很多问题。

Docker 部署:就像集装箱把所有物品装进箱子里一样。Docker 把程序和依赖软件环境打包成镜像,形成标准化部署单元,标准化交付物。部署时只需要下载这个 Docker 镜像。大大简化了交付、部署模式。

Docker 优势:

1、交付物标准化 :像集装箱一样,Docker 可以把软件打包成镜像形成标准化部署单元。

2、一次构建,多次交付 :像集装箱一样,“一次装箱,多次运输”。Docker 镜像是“一次构建,多次交付”。当涉及到不同操作系统、部署多个副本、程序迁移时等,Docker 的作用就更明显,一次创建和配置之后,可以在任意服务器上运行。

3、可移植(任意服务器上运行):Docker 打包的镜像,可以在任意服务器或云上运行。

4、隔离应用程序:像集装箱一样,可以把不同物品分箱行隔离。Docker 也可以隔离不同的应用程序,而且它比虚拟机开销更小。Docker 可以把服务器隔离成很多“虚拟机”,每个“虚拟机”都是独立运行世界互不干扰。

5、简化配置:Docker 将代码和运行环境打包成镜像,那么同一个 Docker 配置可以在不同环境中使用。与上面 3 对应。

6、快速部署:与上面的 2 对应。

7、环境统一:开发、测试、生产环境可以做到统一,减少环境不一致带来的各种问题。

Docker 的缺点

使用 Docker 还需要考虑的缺点:

  • 虚拟机隔离性更好

因为 Docker 是基于操作系统内核实现的,它是建立在操作系统内核之上。如果操作系统受到影响,那么运行在上面的容器也会出现问题。

基于 hypervisor 的虚拟机技术,他的系统硬件资源是完全虚拟化的,当一台虚拟机出现系统级别问题,不会影响到同一宿主上的其它虚拟机。

  • 性能

不管是容器还是虚拟机都是在操作系统之上在进行了一次封装和隔离,在解耦方面做了很大贡献,比如应用和应用、应用和环境解耦方面。毕竟是进行了一次封装,在网络连接转发以及数据交互方面肯定会有一定的损耗。

  • 存储

存储方案是用的 Volume 接口形成数据映射和转移,这也会造成更多交互发生。

不过随着硬件技术和网络技术的发展,容器技术的缺点会变得不是那么明显。

二、kubernetes 是什么

概述

试想一下,如果我们要部署多个 Docker 镜像到多台服务器上,一般的想法,登录到多台服务器拉取镜像部署,或者用一些脚本语言来部署。这样的做法有什么不好地方没?回想一下,登录每台服务器或编写脚本,很麻烦。那还有其它方法解决这个问题吗?Docker 公司早就想出来了另外解决方案 docker swarm,用来编排多个 docker。

可是 google 携 kubernetes 随之而来,docker swarm 慢慢在与它的竞争中败下阵。kubernetes 逐渐成为容器编排领域的主流。

kubernetes 是什么?

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,促进声明式配置和自动化。

可移植、可扩展都是针对容器,只不过 k8s 为了 更高掌控力又包裹了一层叫 Pod。工作负载是指 k8s 里的容器可以组成服务,k8s 可以对多个服务进行负载。

程序部署方式的演化

image-20230209202750815

(From:https://kubernetes.io/zh-cn/docs/concepts/overview/#going-back-in-time 官方文档)

  • 传统部署时代

    应用程序都是部署在物理机上。这样部署的问题是,无法限制在物理机上运行的应用程序资源使用,导致资源分配不均。

  • 虚拟化部署时代

    因此,引入虚拟化技术。虚拟化技术允许你在单个物理机的 CPU 上运行多台虚拟机。虚拟化能使应用程序在不同虚拟机彼此隔离。

  • 容器化部署时代

    容器也是类似虚拟机,只不过容器之间可以共享操作系统。从上图可以看出来。而且容器比虚拟机更轻量级。并且容器也能对应用程序进行隔离,与虚拟机类似,每个容器都有自己的文件系统、CPU、内存、进程空间等。

更多内容请看官方文档:https://kubernetes.io/zh-cn/docs/concepts/overview/#going-back-in-time

三、kubernetes 能做什么?有什么功能

k8s 能做什么,其实就是它提供了什么功能。

kubernetes 主要提供的功能类似于 Linux 里的一些功能、分布式系统和自动部署的功能,它把 3 者的一些功能综合在一起。

  • Linux 的什么功能:存储,网络,限制 CPU 等

  • 分布式系统的什么功能:负载均衡,副本(集),主从复制,服务发现,配置管理等

  • 运维管理:回滚,自动部署,自动计算需要的 Pod,自动管理容器等

以下是官方文档书写的功能:

  • 服务发现和负载均衡

    kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。如果进入容器流量大,kubernetes可以用负载均衡分配网络流量

  • 存储编排

    kubernetes允许你挂载自己选择的存储系统。

  • 自动部署和回滚

    可以受用 kubernetes 描述已部署容器的所需状态,它可以将实际状态更改为期望状态。控制和自动化应用的部署和更新。

  • 自动完成装箱计算

    你为 kubernetes 提供了许多节点组成的集群,在这个集群中运行容器化的任务。你可以告诉 kubernetes 每个容器需要多少 CPU 和内存。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

  • 自我修复

    kubernetes 将会启动失败的容器、替换容器、杀死不响应用户定义的运行状况的容器。

  • 密匙和配置管理

    kubernetes 允许你存储和管理敏感信息。比如密码、OAuth 令牌。

  • 跨多个主机编排容器

  • 动态扩展容器化应用及其资源

kubernetes 还提供了很多扩展 API,供用户编写自己的扩展应用。

更多内容:https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do

四、什么时候用 kubernetes

当你的应用程序,业务访问量不大,活跃用户比较少时候,比如说每天只有几万人访问,这时候使用 Docker 就可以,软件少,架构简单,管理方便。

当你的业务扩大,访问量上来了,比如说每天有 10 W人访问量,这时候的架构服务器分离就可以,也用不上 kubernetes。

kubernetes 软件是一个复杂系统,架构、维护都需要人力,业务量少投入性价比太低。

架构如何演进,可以看我前面的文章:

微服务架构学习与思考(12):从单体架构到微服务架构的演进历程:

https://www.cnblogs.com/jiujuan/p/17066590.html

如果你的业务还在扩大,需要几十台甚至上百台服务器,用来扩展你的应用程序架构,这时就可以考虑用 kubernetes 。

这时候的投入性价比就会高。

五、参考