Kubernetes
简介
k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s。
Kubernetes可以实现容器集群的自动化部署、自动扩缩容、维护等功能。可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
Kubernetes能做什么?
- 快速部署应用
- 快速扩展应用
- 无缝对接新的应用功能
- 节省资源,优化硬件资源的使用
Kubernetes 特点:
- 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
- 可扩展: 模块化, 插件化, 可挂载, 可组合
- 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes的功能
Kubernetes提供了一个可弹性运行分布式系统的框架。Kubernetes 会满足您的扩展要求、故障转移、部署模式等。具体如下:
- Service discovery and load balancing,服务发现和负载均衡,通过DNS实现内部解析,service实现负载均衡
- Storage orchestration,存储编排,通过plungin的形式支持多种存储,如本地,nfs,ceph,公有云快存储等
- Automated rollouts and rollbacks,自动发布与回滚,通过匹配当前状态与目标状态一致,更新失败时可回滚
- Automatic bin packing,自动资源调度,可以设置pod调度的所需(requests)资源和限制资源(limits)
- Self-healing,内置的健康检查策略,自动发现和处理集群内的异常,更换,需重启的pod节点
- Secret and configuration management,密钥和配置管理,对于敏感信息如密码,账号的那个通过secret存储,应用的配置文件通过configmap存储,避免将配置文件固定在镜像中,增加容器编排的灵活性
- Batch execution,批处理执行,通过job和cronjob提供单次批处理任务和循环计划任务功能的实现
- Horizontal scaling,横向扩展功能,包含有HPA和AS,即应用的基于CPU利用率的弹性伸缩和基于平台级的弹性伸缩,如自动增加node和删除nodes节点。
基本概念
简单地说,k8s是容器的集群管理工具。所以要了解k8s就必须要了解容器和集群的概念。那什么是容器呢?容器是一种轻量级的虚拟化技术,那什么是虚拟化技术呢?
假设一个我们想让一个程序在各种平台上测试运行,我们就必须先准备好每个平台的环境,但是我们可能没有那么多的机器去搭建每个平台的环境,所以虚拟化技术出现了。虚拟化技术可以在现有的平台上模拟出另一个平台的环境,最直白的就是虚拟机,我们可以在一台电脑上装各种操作系统的虚拟机,这样就解决我们的问题。但是,虚拟机太笨重了(你必须虚拟出它的cpu,内存等等,而我可能仅仅想跑一个“hello world”程序),这个时候,容器出现了。容器之间共享同一个操作系统内核(就好比你想吃饭,虚拟机的做法是跟你配了一个厨房和各种厨具,你不仅可以煮饭也可以煮菜,容器的做法就是只给你一个电饭锅,你只能煮饭),只包含完整运行时环境,所以它非常轻量。
集群大家都懂,这里不多说。集群编排软件像ansible、puppet,它们能管理的是像虚拟机或者实体机这样完整的环境,无法管理容器,所以当容器技术越来越成熟,数量越来越多,k8s也就应运而生了。
k8s是master/node架构,它的工作原理大概就是,一个总指挥(master)分派任务给员工(node)干活。作为总指挥,它要知道任务是什么,该分派给谁,员工有没有好好干活,所以master有3个主要的组件:
- api server:操作入口,用来接收请求等等
- scheduler:负责分派任务给node(在k8s中是以pod为单位)
- Controller Manager:监控node的状态,自动恢复业务等等
node 主要的组件是Kubelet
Kubelet:负责本Node节点上的Pod的创建、修改、监控、删除等全生命周期管理,同时Kubelet定时“上报”本Node的状态信息到API Server里。
kubernetes 架构
kubernetes包含两种角色:master节点和node节点。
Master节点介绍
Master节点主要有4个组件,API Server, Scheduler, Contoller, etcd
1.API Server
提供Kubernetes
API接口,主要处理Rest操作以及更新Etcd中的对象,是所有资源增删改查的唯一入口。
2.Scheduler
绑定Pod到Node上,主要做资源调度
3.Controller Manager
所有其他集群级别的功能,目前由控制器器Manager执行。资源对象的自动化控制中心,Kubernetes集群有很多控制器。
4.Etcd
所有持久化的状态信息存储在Etcd中,这个是Kubernetes集群的数据库
node节点介绍
Node节点是Kuerntes集群的工作节点,Node节点上主要运行了Docker,Kubelet,kub-proxy三个服务
1.Docker Engine
负责节点容器的管理工作,最终创建出来的是一个Docker容器。
2.kubelet
安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。
3.kube-proxy
安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。
核心概念
Pod
Pod是Kubernetes最基本的操作单元,包含一个或多个紧密相关的容器,一个Pod可以被一个容器化的环境看作应用层的“逻辑宿主机”;一个Pod中的多个容器应用通常是紧密耦合的,Pod在Node上被创建、启动或者销毁;每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。
同一个Pod里的容器之间仅需通过localhost就能互相通信。
一个Pod中的应用容器共享同一组资源:
- PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID;
- 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围;
- IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信;
- UTS命名空间:Pod中的多个容器共享一个主机名;
- Volumes(共享存储卷):Pod中的各个容器可以访问在Pod级别定义的Volumes;
Pod的生命周期通过Replication Controller来管理;通过模板进行定义,然后分配到一个Node上运行,在Pod所包含容器运行结束后,Pod结束。
Kubernetes为Pod设计了一套独特的网络配置,包括:为每个Pod分配一个IP地址,使用Pod名作为容器间通信的主机名等。
Controller
集群中会有很多Pod,那么就需要使用控制器来管理Pod
k8s中有很多控制器,常见的控制器如下:
- Replication Controller(新版本已经被ReplicaSet所替代)
- ReplicaSet(新版本被封装在Deployment中)
- Deployment:封装了Pod的副本管理、部署更新、回滚、扩容、缩容等功能。
- DaemonSet:保证所有的Node上有且只有一个Pod在运行。
- StatefulSet:有状态的应用,为 Pod 提供唯一的标识,它可以保证部署和 scale
的顺序。 - Job:使用Kubernetes运行单一任务。
- CronJob:使用Kubernetes运行定时任务。
Service
在Kubernetes的世界里,虽然每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,这就引出一个问题:如果有一组Pod组成一个集群来提供服务,那么如何来访问它呢?Service!
一个Service可以看作一组提供相同服务的Pod的对外访问接口,Service作用于哪些Pod是通过Label Selector来定义的。
- 拥有一个指定的名字(比如my-mysql-server);
- 拥有一个虚拟IP(Cluster IP、Service IP或VIP)和端口号,销毁之前不会改变,只能内网访问;
- 能够提供某种远程服务能力;
- 被映射到了提供这种服务能力的一组容器应用上;
如果Service要提供外网服务,需指定公共IP和NodePort,或外部负载均衡器;
NodePort
系统会在Kubernetes集群中的每个Node上打开一个主机的真实端口,这样,能够访问Node的客户端就能通过这个端口访问到内部的Service了
Volume
Volume是Pod中能够被多个容器访问的共享目录。
Label
Label以key/value的形式附加到各种对象上,如Pod、Service、RC、Node等,以识别这些对象,管理关联关系等,如Service和Pod的关联关系。
RC(Replication Controller)
- 目标Pod的定义;
- 目标Pod需要运行的副本数量;
- 要监控的目标Pod标签(Lable);
Kubernetes通过RC中定义的Lable筛选出对应的Pod实例,并实时监控其状态和数量,如果实例数量少于定义的副本数量(Replicas),则会根据RC中定义的Pod模板来创建一个新的Pod,然后将此Pod调度到合适的Node上启动运行,直到Pod实例数量达到预定目标。