1. Kubernetes简介
作为一个目前在生产环境已经广泛使用的开源项目 Kubernetes 被定义成一个用于自动化部署、扩容和管理容器应用的开源系统;它将一个分布式软件的一组容器打包成一个个更容易管理和发现的逻辑单元。
Kubernetes 是希腊语『舵手』的意思,它最开始由 Google 的几位软件工程师创立,深受公司内部 Borg 和 Omega 项目的影响,很多设计都是从 Borg 中借鉴的,同时也对 Borg 的缺陷进行了改进,Kubernetes 目前是 Cloud Native Computing Foundation (CNCF) 的项目并且是很多公司管理分布式系统的解决方案。
在 Kubernetes 统治了容器编排这一领域之前,其实也有很多容器编排方案,例如 compose 和 Swarm,但是在运维大规模、复杂的集群时,这些方案基本已经都被 Kubernetes 替代了。
2. Node
Node 可以是一台物理机,也可以是虚拟机。
2.1 Node状态
当我们拿到这台服务器后,首先我们登录服务器查看下服务器的基本配置和信息。其实对于一个新加入 K8S 集群的 Node 也是一样,需要先检查它的状态,并将状态上报至集群的 master 。
2.1.1 IP地址
首先,我们所关心的是我们服务器的 IP 地址,包括内网 IP 和外网 IP。对应于 K8S 集群的话这个概念是类似的,内部 IP 可在 K8S 集群内访问,外部 IP 可在集群外访问。
2.1.2 信息
我们需要看下服务器的基本信息,比如看看系统版本信息, cat /etc/issue 或者 cat /etc/os-release 等方法均可查看。对于 K8S 集群会将每个 Node 的这些基础信息都记录下来。
2.1.3 容量
我们通常也都会关注下,我们有几个核心的 CPU ,可通过 cat /proc/cpuinfo 查看,有多大的内存 通过 cat /proc/meminfo 或 free 等查看。对于 K8S 集群,会默认统计这些信息,并计算在此 Node 上可调度的 Pod 数量。
2.1.4 条件
对于我们拿到的服务器,我们根据上述的一些基本信息进行判断,这台机器是否能满足我们的需要。对 K8S 集群也同样,当判断上述信息均满足要求时候,便将集群内记录的该 Node 信息标记为 Ready (Ready = True),这样我们的服务器便正式的完成交付。
3. Deployment 和 Pod
3.1 Pod
作为 Kubernetes 集群中的基本单元,Pod 就是最小并且最简单的 Kubernetes 对象,这个简单的对象其实就能够独立启动一个后端进程并在集群的内部为调用方提供服务。
3.2 Deployment
提供了一种对 Pod 和 ReplicaSet 的管理方式,每一个 Deployment 都对应集群中的一次部署,是非常常见的 Kubernetes 对象。
3.3 例如
在使用一台服务器时,我们通常需要编写一个主页index.html以及将其部署在web服务器上,对于 K8S 而言,我们想要的,能提供对 index.html 访问的服务便可理解为 Deployment 的概念,表明一种我们预期的目标状态。
而对于 web服务器 和 index.html 这个组合可以理解为其中的 Pod 概念,作为最小的调度单元。
4. Container Runtime
Docker 已经是容器技术的事实标准了,它让开发者将自己的应用以及依赖打包到一个可移植的容器中,让应用程序的运行可以实现环境无关。
如果我们想要将当前主页部署在多台服务器上,我们可以在服务器上安装docker,此时,我们需要做的事情,也便只是将我们的服务构建成一个镜像,需要编写一个 Dockerfile,构建一个镜像并部署到每台服务器上便可。
我们能够通过 Docker 实现进程、网络以及挂载点和文件系统隔离的环境,并且能够对宿主机的资源进行分配,这能够让我们在同一个机器上运行多个不同的 Docker 容器,任意一个 Docker 的进程都不需要关心宿主机的依赖,都各自在镜像构建时完成依赖的安装和编译等工作,这也是为什么 Docker 是 Kubernetes 项目的一个重要依赖。
而 Docker 如果对应于 K8S 集群中的概念,便是 Container Runtime,这里还有其他的选择,比如 rkt,runc 和其他实现了 OCI 规范的运行时。
参考资料
《Kubernetes 从上手到实践》