最近打算开始学习k8s,关于k8s自己所知甚少,只把它当docker的同位替代,在学之前有必要先了解k8s和docker的异同之处,知道了这些才能够明白他们适合的使用场景。
一句话总结:Docker是容器,而K8s可以管理容器,Docker可以被K8s管理。
首先一个概念,什么是容器?
容器是一种虚拟化技术,用于将应用程序及其所有依赖项打包在一起,以便在不同的环境中进行移植和运行。容器提供了一种隔离的运行环境,使不同应用程序能够在独立的文件系统、网络和进程空间等独立运行环境中运行,提升了安全性和稳定性。
容器有几个核心概念:
- 容器运行规范OCI(Open Container Initiative)
- 容器运行时CR(Container Runtime)
- Runc(Run Container)
- Containerd(Container daemon)
- 容器运行时接口CRI(Container Runtime Interface)
了解了容器是什么后,我们再来看看什么是Docker,什么是K8s
什么是Docker?
简单的来说,Docker就是一个开源的应用容器引擎,它基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
什么是K8s?
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 支持多种容器运行时技术,其中最为广泛使用的就是Docker。通过Kubernetes,我们可以对容器进行分布式管理,实现容器的高可用、负载均衡和故障恢复等功能。
为什么需要K8s?
当Docker开始普及时,越来越多的容器化应用程序出现,人们发现大量的容器化程序变得越来越难以管理,于是便有了K8s。
现在我们能知道,K8s的诞生就是为了更加高效的管理容器,而Docker正是其中一种。这里借用一张图来展示两者的关系(来源自公众号【奇妙的Linux世界】)。
可以看到,K8s通过CRI实现管理Docker的Containerd
最后来看一下K8s能够提供哪些功能来高效的管理容器
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
-
自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
-
批处理执行
除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
-
水平扩缩
使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
-
IPv4/IPv6 双栈
为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
-
为可扩展性设计
在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。