什么是k8s,解决什么问题

纯容器的部署问题

纯docker的运行模式,是一个docker主机,单独管理一堆容器应用,但是发现数量多了之后,配置复杂之后,难以维护管理多个容器,并且跨主机下的容器集群,更是维护复杂。

  1. 业务容器数量庞大,哪些容器部署在哪些节点,使用了哪些端口,如何记录、管理、需要登录到每台机器去管理?

  1. 跨主机通信,多个机器中的容器之间相互调用如何做,iptables规则手动维护?

  1. 跨主机容器间相互调用,配置如何写?写死固定ip+端口?

  1. 如何实现业务高可用?多个容器对外提供服务如何实现负载均衡?

  1. 容器的业务中断了,如何可以感知到,感知到以后,如何自动启动新的容器?

  1. 如何实现滚动升级保证业务的连续性?

K8S是什么

Kubernetes是用于自动部署,扩缩和管理容器化应用程序的开源系统

它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现

Kubernetes 源自Google15年生产环境的运维经验,

Google每周运行数十亿个容器,

本质上就是一个工具,一个平台,维护docker容器的

部署时代架构

v1 物理机

v2 虚拟化,vmware商业版为代表,出现开源版的openstack

v3 容器化部署,容器化大规模应用后,难以维护,出现了

K8S

为什么会出现k8s

容器是打包和运行应用程序的好方式

在生产环境下,需要管理运行着应用程序的容器,并确保服务不会下线

例如,如果一个容器发生故障,需要启动另一个容器。

如果这个过程,是自动创建容器,自动生成新容器,保证业务高可用,k8s就是实现容器自动化管理的一个框架系统。

K8S是一个平台框架

k8s提供了很多的功能,简化了对容器的部署管理

基于容器对应用的发布管理、更新、升级、降级

负载均衡、服务发现

跨机器、跨地区的网络模式

自动扩缩容功能

针对如nginx无状态服务的运行组件,如mysql等有状态服务的运行组件

支持丰富的插件

k8s并不是包括所有,它本身只有自己的一些组件,而其他功能,如消息队列,数据库,存储都需要额外安装在k8s上。

K8S是一个平台框架

本质:大而全的平台,组件很多,提供了很多功能组件,目的是为了让你更好的去管理容器。

k8s核心概念组件

提供了很多组件,方便从各个角度,更好的去维护,管理容器。

  1. 容器运行高可用,数量保障,版本升级、扩容、缩容

  1. 容器之间的网络关系

  1. 容器之间的数据共享关系

  1. 容器内的配置文件加密

  1. 以上都是k8s提供的各个组件的作用

如何设计一个容器管理平台

1、集群架构,至少2台机器,master主节点,node工作节点

master根据维护者,写的yaml,对容器的运行描述,创建具体的容器,到node工作节点

2、该容器管理平台,应该自动识别,目标节点的,状态,选择最合适的节点部署新容器

3、容器管理平台,能实现确保,应用的副本数是健康,正确的,后端的容器数量

4、容器内的负载均衡,反向代理,如何配置(k8s的组件就可以实现)

K8S核心组件

安装启动好之后,至少看到的几个组件以及后续,部署你的应用,再用其他的组件。

1、etcd保存了整个集群的状态,分布式高性能数据库。
2、api-server提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。

K8S作为一个高级的容器管理平台,对每一个发来的请求,都要进行校验,该请求是否被集群允许,删除集群中的一个容器组,是否被允许,k8s默认运行后,6个组件,每一个组件的请求,与相应的,都要经过这个api-server组件校验。

3、controller manager负责维护集群的状态、比如故障检测、自动扩展、滚动更新等

具体部署容器,到目标节点,使用的控制器,容器负载均衡部署,Deployment控制器就是之一。

Replication Controller

Node controller

ResourceQuota Controller

Namespace Controller

ServiceAccount Controller

Token Controller

Service Controller

Endpoints Controller

4、scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的Node机器上

scheduler 决定容器部署到哪个节点上的组件。

5、kubelet负责维护容器的生命周期,同时也负责Volume 和网络 的管理

拉去镜像,运行容器

运行在每一个node节点上的代理软件:

pod管理

容器健康检查

容器监控

Container runtime 负责镜像管理及Pod和容器的真正运行
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡,主要提供iptables、ipvs规则
6、kubecli 命令行接口,用于对Kubernetes集群运行命令

在master节点上敲打的命令,就docker命令一样,客户端命令和api-server交互

以上为六大组件

组件通信架构图

k8s里面不再直接去操作容器,而是k8s提供了一个组件,叫pod,封装了一组容器,容器都是被pod管理,根容器,创建隔绝的网络,文件系统,用户,进程空间。

k8s集群是被一组称为Node的节点机器组成,这些节点上运行k8s管理的容器进程

具体Node节点机器上运行的容器被一个叫作Pod的组件管理

在安装完毕k8s后,就得到一个集群环境

集群是指有一堆Node节点机器,并且这些节点运行Pod,也就是容器了

k8s组件工作流程图

pod是如何被创建到目标机器的,原理流程

创建一个无状态的nginx应用,部署一个pod(nginx)即可。

1、在master节点,写yaml描述你对容器的运行要求,创建pod的要求,

2、使用kubectl命令去创建,应用这个资源描述文件,才设计k8s组件交互发出请求,我要创建一个pod去运行nginx了,请求发给谁?

kubectl create -f install-nginx.yml

api-server

3、验证Kubectl命令发来的请求是否被允许利用本地https证书,直接写入Kubectl配置文件的该请求被允许后,才会执行。

4、api-server将nginx-pod创建的信息,记录到etcd数据库中(数据库记录了一些信息,nginx镜像版本,容器名,是否要端口暴漏)

5、api-server会通知下一个组件,调度器组件,scheduler准备pod调度

6、scheduler调度,会去etcd里面查询,部署的pod信息到底是如何,scheduler,调度,判定出一个合适的node节点去部署pod(选择好了具体的机器,还未执行)。

7、scheduler调度器,会告诉api-server自己决定pod要部署到哪台node节点上

8、api-server会将这个信息,再写入etcd中,数据更新了(nginx本身的容器信息+绑定关系,部署到哪个机器上)

9、此时api-server会通知远程具体机器,如k8s-node2上的工作进程kubelet,去读取etcd里面的信息,根据这些信息,创建nginx镜像,以及创建POD(nginx容器)

Node概念

ECS机器,k8s运行的一个环境

pod等资源,属于k8s安装好后的,集群内的一个资源信息。

1、k8s工作节点,node运行环境可以是::::vmware创建的一个虚拟机,k8s-node-11 k8s-node-12

2、node上具体运行啥,运行容器,k8s部署的应用,都是跑在容器里,还得装docker

3、初始化,运行工作节点,或者主节点,背后逻辑是

3.1下载k8s自身的一些组件的镜像

3.2 运行镜像,创建对应的容器,到对应的目标机器上(k8s-master、k8s-node)

以上就是部署架构逻辑。

Pod图解作用

Kubernetes使用Pod来管理容器,每个Pod可以包含一个或多个紧密关联的容器。

Pod是一组紧密关联的容器集合,他们共享进程间通信和Network namespace,是Kubernetes调度的基本单位。

Pod内的多个容器共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。

Pod是K8s集群中所有业务类型的基础,可以看作运行在k8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。

目前K8s中的业务主要可以分为长期伺服型、批处理型、节点后台支撑型和有状态应用型

分别对应的小机器人控制器为Deployment、Job、DaemonSet和StatefulSet

  • Pod是k8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。

  • Pod的IP是随机变化的,删除pod、ip变化

  • pod内部都有一个根容器

  • 一个pod内可以有一个,多个容器

  • 一个pod内的所有容器,共享根容器的网络名称空间,文件系统,进程资源

  • 一个pod内的容器网络地址,由根容器提供。

图解K8s概念作用

  1. pod运行状态概念

  1. label标签概念

node打标签,作用用于部署pod

  1. Namespace,资源组,名称空间,k8s再创建资源的时候,可以单独创建一个资源。

k8s里可以基于创建namespce,管理不同环境下的资源,也是一个重要资源,

先了解Pod

再学控制器,去维护你的pod

pod要对外提供访问服务,就得再学service等资源

k8s-Master部署

k8s-Node部署

k8s-网络插件部署与pod实践。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐