k8s入门教程
1. k8s概述
Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,方便我们在服务器集群中管理我们容器化应用。
教程主要介绍怎么使用阿里云容器服务(kubernetes版本)。
2. k8s常用概念介绍
- 节点 (Master node and Worker node)
节点通常指的就是服务器,在k8s中有两种节点:管理节点(Master Node)和工作节点(Worker Node)
管理节点(Master Node):负责管理整个k8s集群,一般由3个管理节点组成HA的架构。
工作节点(Worker Node):主要负责运行容器。
- 命名空间 (Namespace)
k8s命名空间主要用于隔离集群资源、隔离容器等,为集群提供了一种虚拟隔离的策略;默认存在3个名字空间,分别是默认命名空间 default、系统命名空间 kube-system 和 kube-public。
- Object
k8s 对象(Object)是一种持久化存储并且用于表示集群状态的实体。k8s 对象其实就是k8s自己的配置协议,总之我们可以通过定义一个object让k8s根据object定义执行一些部署任务、监控任务等等。
- POD
Pod是 Kubernetes 部署应用或服务的最小的基本单位。一个Pod 封装多个应用容器(也可以只有一个容器)、存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项。
- 副本集 (Replica Set,RS)
是一种控制器,负责监控和维护集群中pod的副本(replicas)数,确保pod的副本数是我们期望的样子。
- 部署 (Deployment)
表示对k8s集群的一次更新操作,是k8s集群中最常用的Object,主要用于部署应用。支持滚动升级。
- 服务 (service)
是对应用的抽象,也是k8s中的基本操作单元,一个服务背后由多个pod支持,服务通过负载均衡策略将请求转发到容器中。
- Ingress
是一种网关服务,可以将k8s服务通过http协议暴露到外部。
- 无状态应用 & 有状态应用
- 无状态应用指的是应用在容器中运行时候不会在容器中持久化存储数据,应用容器可以随意创建、销毁;如果一个应用有多个容器实例,对于无状态应用,请求转发给任何一个容器实例都可以正确运行。例如:web应用
- 有状态应用指的是应用在容器中运行时候需要稳定的持久化存储、稳定的网络标识、固定的pod启动和停止次序。例如:mysql数据库
3. k8s架构
通过上图可以看出k8s整体架构主要由左边的master节点和右边的worker组成,master节点负责对整个集群进行管理,右边的电脑表示worker节点负责运行我们部署的容器。
4. 基于k8s的常见web应用部署架构
5. 部署应用
下面是通过阿里云容器服务后台以可视化的方式部署应用。
阿里云部署应用连接。
https://help.aliyun.com/document_detail/87784.html?spm=a2c4g.11186623.6.631.6ca67d26RVHzA4
6. 容器之间共享文件存储
在集群环境中,默认情况如果应用在容器A创建了一个文件,容器B无法读取这个文件。
在k8s中提供了持久卷(Persistent Volumes)解决持久化存储问题,持久卷将存储细节和存储数据访问分离,对于用户而言使用同统一的接口访问不同存储系统上的数据。
根据存储方式不同,k8s支持多种持久卷(Persistent Volumes)类型,阿里云也对k8s进行一些扩展支持,目前支持NAS、OSS、云盘三种持久卷类型。
下面是关于阿里云支持的持久卷类型的介绍:
- NAS - 阿里云高性能分布式文件系统,支持共享存储。
- OSS - 阿里云对象存储, 也是一个分布式文件系统,支持共享存储。
- 云盘 - 阿里云云盘,不支持共享存储。
根据上面的介绍我们可以选择NAS或者OSS实现共享文件数据,OSS主要用于图片,视频存储场景可以支持文件直接对外提供访问服务,在容器共享文件数据,我们一般选择NAS, 下面是K8S使用NAS的教程:
https://help.aliyun.com/document_detail/88940.html?spm=a2c4g.11186623.6.680.18656b80CZtc9r
关于云盘,不能多个容器共享,每个POD独占自己的云盘实例,适合用于为部署有状态应用提供持久化存储,例如部署mysql, 将mysql数据保存到云盘中。
!!!提示:无论使用何种持久卷类型,最终都是以挂载的方式,关联到容器中。 对用户来讲,最终看到的就是一个目录。
7. k8s配置管理
如果希望一个镜像(image)更具有通用性,与环境无关,那么应该将环境相关的配置参数从镜像中分离出来。
举个例子:
我们将一个web应用的代码打包到一个镜像中,如果web应用关于数据库的连接地址、帐号、密码也一同打包到镜像中,那么如果我们希望这个镜像换一个数据库配置信息怎么办? 只能重新打包镜像。
k8s为我们提供了两种配置管理的方式:configMap和secret。
他们都是键值对的形式,区别就是secret专门用于管理铭感信息配置,例如:密码。
无论使用那种方式管理配置,最终配置信息都需要注入到容器中。
目前有两种方式将配置信息注入到容器中:环境变量和挂载(mount)数据卷
- 通过环境变量方式注入容器,容器中的程序只要通过读取环境变量值就可以获取配置信息。
- 通过挂载数据卷的方式注入,一般都是挂载到某个目录,只要读取这个目录中的数据就可以获取配置信息。
下面是阿里云使用配置的例子:
首先是创建配置项:
接下来是配置注入到容器中,先看通过环境变量注入:
在阿里云后台新建应用或者编辑应用,都会出现下面的窗口
下面是通过挂载的方式注入配置信息:
同样是在新建应用或者编辑应用窗口中,设置数据卷。