1、定义:是一种开源的容器集群管理系统,在docker 容器技术的基础之上,为容器化的集群提供部署、运行、资源调度、服务发现、动态伸缩等一系列完整的功能的大规模容器管理

2、功能

(1)对docker的容器技术应用的包,部署、运行、停止、销毁,全生命周期管理

(2)集群方式运行,跨机器的容器管理

(3)解决docker的跨机器运行的网络问题

(4)k8s可以自动修复,使得整个容器集群可以在用户期待的状态下运行

3、作用:自动部署、自动扩展和管理容器化部署的应用程序

负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。以分布式和容器化的方式进行容器管理

4常用版本:K8s 1.20(支持容器,1.23版本后不再支持容器)

5、k8s以google的borg系统作为原型,后期经由go语言编写的开源软件

官网:Kubernetes

源码包:https://github.com/kubernetes/kubernetes

6、传统部署、容器部署、k8s部署的区别

1传统部署方式:一般意义上的二进制部署,安装、运行、运行维护需要专业人员,若出现故障,需要人工重新拉起来,若业务量增大,只能水平拓展,再部署一台

2容器化部署:用dockerfile方式,编写好自定义容器,基于镜像,随时都可以运行。数量少,还可以管理,数量一旦增多,管理复杂,而且docker一般是单机运行,没有高可用

3k8s部署:简单、高效的部署容器化的应用

①可以解决docker单机部署和无法集群化的问题

②可以解决随着容器数量的增加,对应增加的管理成本的问题

③可以解决容器的高可用问题,提供一种容器的自愈机制

④可以解决容器没有预设模板,以及无法快速、大规模部署,以及大规模容器调度的问题

⑤提供集中化配置管理的中心

⑥可以解决容器生命周期的管理工具的问题

⑦提供图形化工具对容器进行管理

7、k8s特性

(1)弹性伸缩:基于命令或图形化界面基于CPU的使用情况,自动对部署的程序进行扩容和缩容,以最小成本运行服务

(2)自我修复:出现节点故障时,自动重新启动失败的容器,也可以手动替换和重新部署

(3)服务发现和负载均衡:k8s为多个容器提供一个统一的访问入口(内部地址,需要暴露才能访问。和内部的DNS名称),自动负载均衡关联的所有容器

nginx-1

10.244.0.10:3000

DNS服务名称:nginx

nginx-2

nginx-3

(4)自动发布和回滚:k8s采用滚动的策略更新应用,若更新过程中出现问题,可以根据回滚点进行回滚到上一个老版本

nginx-1

先更新1

最新版本

nginx-2

再更新2

1和2若有问题,自动回滚到上一个版本

nginx-3

老版本

5集中化的配置管理和密钥管理:k8s集群内的各个组件都需要进行密钥对验证,但k8s的安全性不高,核心组件不建议部署在k8s上,适合部署一些自定义应用

(6)存储编排

①可以自动化的把容器部署在节点上

②可以通过命令行或者yml文件(自定义pod)实现指定节点部署

③可以通过网络存储、NFS、GFS实现指定节点部署

(7)批次处理任务:提供一次性任务、定时任务,满足需要批量处理和分析的场景

8、master组件(核心组件)【重要】

(1)kube-apiserver—所有请求的入口服务:k8s集群中每个组件都靠密钥对进行验证,组件之间通信靠kube-apiserver

API是应用接口服务,在k8s的所有资源请求和调用操作都是通过kube-apiserver来完成。所有对象资源的增删改查和监听操作,都是kube-apiserver处理完后交给etcd来存储。apiserver接收k8s的所有请求(命令行和图形化界面的操作),然后根据用户的具体请求通知对应的组件,展示或运行命令。apiserver相当于整个集群的大脑

2kube-controller-manger:运行管理控制器,k8s集群中处理常规任务的后台线程,是集群中所有资源对象的自动化控制中心,一个资源对应一个控制器,kube-controller-manger负责管理所有控制器

控制器

node controller节点控制器

负责节点的发现,以及节点故障的发现和响应

replication controller副本控制器

控制关联pod的副本数,可以随时扩、缩容(手动、自动)

endpoints controller端点控制器

监听service和对应pod的副本变化端点就是服务暴露出的访问点,要访问这个服务必须要知道endpoint,就是内部每个服务的IP地址+端口

service account和

roken controllers服务账户和令牌控制

为命名空间创建默认账户和API访问令牌。访问不同的命名空间

resourcequota controller资源控制器

可以对命名空间的资源使用进行控制,也可以对pod的资源进行控制

namespace controller命名空间控制器

管理命名空间的生命周期

service controller服务节点控制器

k8s集群和外部的主机之间的接口控制器。控制集群的IP

3kube-scheduler:资源调度组件,根据调度算法为新创建的pod选择一个合适的node节点。可理解为k8s所有node节点的调度器,部署和调度node

策略

预先策略

人工定制,指定node节点部署

优先策略

限制条件,根据调度算法先择合适node

怎么选择合适node呢?根据node节点的资源情况、选择一个资源最富裕、负载最小的节点来部署

(4)etcd:k8s的存储服务,etcd分布键值存储系统,存储k8s的关键配置和用户配置。先通过apiserver调用etcd中的存储信息,然后再实施(在整个集群中,能对etcd存储进行读写权限的只有apiserver)

9node组件

(1)kubelet:node节点的监视器与master节点的通信器。可理解为master在node节点上的眼线

作用:

①kubelet会定时向apiserver汇报自己的node上的运行服务的状态,apiserver会把节点状态保存在etcd存储中

②接受来自master节点的调度命令。若发现自己的状态和master节点的状态不一致,会调用docker的接口同步数据

③对节点上容器的生命周期进行管理,保证节点上的镜像不会占满磁盘空间,对退出的容器资源进行回收

(2)kube-proxy:实现每个node节点上pod的网络代理,负责节点上的网络规划和四层的负载均衡工作,负责写入iptables(快淘汰)和ipvs实现服务映射。kube-proxy本身不直接给pod提供网络代理,proxy只是service资源的载体,proxy实际上代理的是pod的集群网络(虚拟网络)(proxy代理的是service地址,service地址是所有pod对外提供的一个统一的IP地址)

注:pod不是容器

在k8s中不直接和容器打交道,真正和容器打交道的是pod

http-dn1是基于deployment创建的资源对象,既不是pod名称,也不是容器名称

80:30394是容器和主机之间的映射

3docker:容器引擎,运行容器,负责本机的容器创建和管理

k8s创建pod上,kube-scheduler调度到node节点上,节点上的kubelet指示docker启动特定的容器,kubelet把容器的信息收集、发送到主节点。在主节点发布指令,节点上的kubelet就会指示docker对容器进行拉取、启动、停止容器

pod:运行在节点上的,k8s中创建、部署最小、最简单的基本单位,一个pod代表正在集群上运行的一个进程。同一个pod内的每个容器就是一颗豌豆

pod由一个或多个容器组成,pod中的容器共享网络、存储和计算资源,可以部署在不同的docker主机上

一个pod里面可以运行多个容器,也可以是一个容器,在生产环境中,一般都是单个容器或者有关联关系的多个容器组成一个pod

deployment

无状态应用部署,管理和控制pod以及replicaset(运行几个容器),管控其运行状态

replicaset

保证pod的副本数量,受控于deployment

在k8s中,部署服务实际上就是pod,deployment部署的服务就是pod,replicaset就是定义pod的容器数量,可以保证pod在当前命名空间中不可重复,不同命名空间可以重复,官方推荐使用deployment进行服务部署

daemonset

确保所有节点运行同一类的pod

statefulset

有状态应用部署(很少用)

job

可以在pod中设置一次性任务,运行完即退出

cronjob

一直在运行的周期性任务

10、service★★★

(1)作用:在k8s整个集群中,每创建一个pod都会为其中运行的容器分配一个集群内的IP地址,由于业务变更,容器数量可能会发生变化,容器的IP地址也会随之变化,不便于管理,service提供整个pod对外统一的IP地址。可理解为service是一个网关(路由器),通过访问service可以访问pod内部的容器集群

service能实现负载均衡和代理,核心载体是kube-proxy来实现负载均衡,service是k8s微服务的核心,屏蔽服务的细节,统一的对外暴露端口,真正实现“微服务”

(2)service的流量调度

①userspace(用户空间。淘汰)

②iptables(即将废弃)

③ipvs(目前1.20版本使用的)

11、label标签

k8s的特色管理方式,用于分类管理资源对象,可自定义node、pod、service、namespace

label选择器:等于、不等于,使用定义的标签名

12、ingress(非常重要)

k8s集群对外暴露提供访问的接口,属于应用层,七层代理,转发http/https请求

service是四层转发,转发的是流量

ingress和service的区别【重要】

ingress是七层代理,转发http请求

service是四层代理,转发的是流量

转发过程:

http://www.yyy.com:80→ingress→service→pod→容器

13namespace命名空间

在k8s上可以通过namespace来实现资源隔离、项目隔离,通过namespace可以把集群划分为多个资源不可共享的虚拟集群组,不同命名空间里面的资源名称可以重复

14数据架构图(重要)