这是我参与[第四届青训营]笔记创作活动的第1天
通过《深入理解 K8S 资源管理和调度》课程和资料查询主要了解docker和Kubernetes的基础知识
部署的发展轨迹
- 传统部署
- 虚拟机部署
- 容器部署
知识点解析 --容器技术和虚拟机
容器技术: 隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置
虚拟机: 在一台机器上开启几个虚拟机,每个虚拟机上部署一个应用,每个虚拟机可分配不同的内存,每个虚拟机使用的各自的操作系统,从而实现了应用程序的隔离。
Docker
Docker是什么
docker是一个用Go语言实现的开源项目,可以更方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,使得在任何环境中运行程序都会有一致的表现。 wordPress(Docker部署,Kubernetes部署)
核心概念
- dockerfile:image的源代码
- image:可执行程序
- continer:运行起来的进程
使用的相关流程
在dockerfile中指定需要的程序、依赖的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,就是docker run命令,image运行起来后就是docker container。
核心功能
- docker build
- docer run(核心功能)
- docer pull
工作流程
docker build和docer run(核心功能)如图所示,配置好dockerfile交给docker“编译”时使用docker build这个命令,client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image,有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。 docer pull
docker registry 可以用来存放各种image,公共的可以供任何人下载image的仓库就是docker Hub。从Docker Hub下载image,就是docker pull命令。实现是用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,就可以使用image了。
docker的底层实现
- NameSpace
- Control groups
Kubernetes简介
Kubernetes是什么
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
核心概念
- Pod
Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。Volume 本身是一个抽象的概念,一个 Volume 可以去支持多种的后端的存储。比如说 Kubernetes 的 Volume 就支持了很多存储插件,它可以支持本地的存储,可以支持分布式的存储,比如说像 ceph,GlusterFS ;它也可以支持云存储,比如说阿里云上的云盘、AWS 上的云盘、Google 上的云盘等等。
- Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。Kubernetes 是通过 Controller,也就是我们刚才提到的控制器去维护 Deployment 中 Pod 的数目,它也会去帮助 Deployment 自动恢复失败的 Pod。
- Volume
Volume 就是卷的概念,它是用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。 Volume 本身是一个抽象的概念,一个 Volume 可以去支持多种的后端的存储。比如说 Kubernetes 的 Volume 就支持了很多存储插件,它可以支持本地的存储,可以支持分布式的存储,比如说像 ceph,GlusterFS ;它也可以支持云存储,比如说阿里云上的云盘、AWS 上的云盘、Google 上的云盘等等。
架构
基本思路:所有 UI 的、clients、这些 user 侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,Master 会把这些命令或者状态下发给相应的节点,进行最终的执行。
master
Kubernetes 的 Master 包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd。
API Server:Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送。
Controller:是控制器,它用来完成对集群状态的一些管理。
Scheduler:是调度器,“调度器”顾名思义就是完成调度的操作,可以理解为把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置。
etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。
node
Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。一个 Pod 中运行的一个或者多个容器,真正去运行这些 Pod 的组件的是叫做 kubelet,也就是 Node 上最为关键的组件,它通过 API Server 接收到所需要 Pod 运行的状态,然后提交到我们下面画的这个 Container Runtime 组件中。
总结
目前只是对其中的概念和相关功能进行了了解,还需要通过使用进行更深入的理解。