注: 文章中的部分图片及部分内容借鉴了《Kubernetes 从上手到实践》和《云原生技术公开课》,若有侵权,请告知删除,谢谢!
简单介绍
kubernetes简称k8s(后续大多以k8s代替说明),是一个用于对容器化应用进行编排、管理的工具。由Google于2014年开源。经过几年沉淀,k8s已成为容器编排领域事实上的标准。
从定义看出k8s是对容器进行编排(编排在这里可理解为部署、扩容、监控、负载均衡、日志记录等)的。因其操作对象为容器,故这里对容器进行简要说明。
容器
在实际工作环境中,经常会由于在搭建服务应用时因为应用的依赖、部署的环境以及应用的迁移遇到各种各样的问题,可见对这些服务的环境进行隔离打包显得非常重要,故容器应运而生。因此我们可以将容器定义为 视图受限、资源隔离的一组进程集合 。而组成这些容器的文件集合则称为该容器的镜像。目前来看,在标准化、容器化做的最好的就是Docker。故接下来我们只说k8s对Docker下的容器编排管理。
初步了解
Node
我们知道k8s是对容器进行管理的,而许许多多不同的容器常常是在多个机器(或称为服务器)上运行的。若k8s只能在一台机器上进行管理,则它的效用显然违背它的目标。故k8s经常是在一个集群下工作的。即k8s是对多台机器进行管理。这里的每台机器我们称为每个Node(即节点),这些Node里面肯定有一个Node是作为主节点来对其他工作节点(work node)进行管理的。其管理结构类似于 master-slave 模式。
Pod
k8s规定其最小的调度单元是Pod,k8s并不是直接操纵容器的。容器都被放入到了Pod当中,而k8s通过管理Pod来管理容器,关于为什么要用Pod并作为原子调度单位可参考这里。故我们可以简单理解Pod是一个或一组容器的集合。
Deployment
k8s中并不是直接对Pod进行管理的,而是依靠Deployment来解决。这是为了保证集群内一组Pod能维持指定的数量,并使得该组Pod能一起更新镜像版本、快速回滚。故我们知道Deployment是用来对Pod进行管理的。Deployment虽然能创建Pod,但创建Pod的副本数是由Deployment下的ReplicaSet管理的。ReplicaSet用来使Pod的副本数达到用户期望的状态。创建Pod的语法(通常以yaml文件进行创建)基本信息如下:
整体结构
从更高层来看K8S整体上遵循C/S架构,结构如下图:
![cs架构]](https://img-blog.csdnimg.cn/20191230191401978.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3hpYW9iYWlfb2w=,size_16,color_FFFFFF,t_70)
可以看到其很像master-slave结构
master
mater内部由以下几部分组成:
master是k8s集群的“大脑”(通常称为control plane),其负责对集群进行调度、管理与存储等。
API Server
接收外部的信号与请求,并将一些信息写入到etcd中。对外部的请求做一些权限管理与认证。其以REST方式实现。
Controller
是k8s集群中最繁忙的部分,在后台控制各种进程,对集群进行调节管理等。
Scheduler
是集群的调度器,持续关注集群中未被调度的Pod,并根据条件来将Pod调度到对应的Node上。
etcd
存储集群的状态日志等信息,供API Server调用。
Node
Node节点的内部组成如下:
Kubelet
Kubelet实现了集群中Node节点的Pod的控制功能。当一个未被创建的Pod被Scheduler调度到符合条件的工作节点上后,将由kubelet来决定该Pod是否能运行在该Node上。
Container runtime
Container runtime 主要用来下载镜像并创建对应的容器。它的实现最常见的就是Docker。
Kube Proxy
我们都知道,想要访问某个服务,要么通过域名,要么通过 IP。而每个 Pod 在创建后都会有一个虚拟 IP,K8S 中有一个抽象的概念,叫做 Service ,kube-proxy 便是提供一种代理的服务,让你可以通过 Service 访问到 Pod。
安装
因k8s是对Docker下的容器进行管理的,故需要机器先安装Docker环境,因Docker在这里不是讲解的重点,故Docker的安装步骤在这里省略(离线安装方法可参考这篇文章)。接下来就是安装k8s环境,若是只想对k8s做一个了解,可只搭建实验环境进行体验。
实验环境
Kind
kind内部集成了k8s,并将k8s的相关命令进行了封装。关于kind的安装与使用可直接参考该项目主页下的说明文档。
Minikube
minikube是k8s官方为开发者提供的一套k8s体验工具。该工具安装前一般需要安装虚拟化管理程序如VirtualBox(若是不安装则minikube运行时将–vm-driver参数设置为none)。为了在创建k8s集群后我们能观察集群节点、pod的状态以及对集群进行管理,这里还需要安装 kubectl 工具。前面已经了解到k8s是典型的C/S架构,而kubectl就是CLI工具,kubectl的安装参考 这里。minikube的安装与使用可直接参考项目文档。minikube的好处在于不用关注太多安装方面的过程,直接在终端下输入 minikube dashboard
就能在浏览器中通过系统界面查看集群状态。如下图:
生产环境
通常情况下,我们不只是搭建一个测试环境,而是需要一个生产可用、功能完备的集群环境。k8s生产环境的搭建方案有多种,这里我们选择官方的一个推荐方案使用 kubeadm 进行搭建。
前期准备
安装之前需要做一些准备,如下:
- 禁用swap
自k8s 1.8之后,启动kubelet时,需要禁用swap,禁用的方法如下:
使用 sudo cat /proc/swaps 验证 swap 配置的设备和文件。
通过 swapoff -a 关闭 swap 。
使用 sudo blkid 或者 sudo lsblk 可查看到我们的设备属性,请注意输出结果中带有 swap 字样的信息。
将 /etc/fstab 中和上一条命令中输出的,和 swap 相关的挂载点都删掉,以免在机器重启或重挂载时,再挂载 swap 分区。
- 解除端口占用
k8s是C/S架构,在启动后会固定监听一些端口用于提供服务,可以通过sudo netstat -ntlp |grep -E '6443|23[79,80]|1025[0,1,2]'
命令来查看这些端口是否被占用,若占用,则手动释放。 - Docker安装
前面说到,容器运行时,需要Docker,因此需要安装Docker。一般直接选择最新稳定版安装即可。
安装kubeadm和kubelet
安装