0
点赞
收藏
分享

微信扫一扫

kubernetes介绍,什么是k8s

K8S-kubernetes:

简称k8s

全称kubernetes

因为k和s 中间有8个字母 所以叫k8s

中文官网:https://kubernetes.io/zh/

docker网络模型三种

第一种 我们使用比较多的叫 bridge 桥接

第二种 host

第三种 none

发现一个问题 无法做到跨主体通信 不同主机上的容器想要通讯 只有一种方式

映射 通过 小p 和大P 的方式映射出来 通过物理机的方式 来去让他通讯

这是基于前面的知识来说 就这一种方式

这肯定是个问题 所有的访问 都是通过映射的方式进来 首先这个网络就不符合 作为一个大规模集群的 要求 这是第一点

第二点 启动docker 是通过命令行 一个一个的启动的 如果要启动100个docker 那就得到100个机器上 启动100次 很复杂 繁琐 无法做到服务的自动停启 服务自动扩容 和自动缩容 这是docker 所完成不了的第二个点

kubernets 是个 第一 容器的自动编排

kubernetes能做什么?

第一能做服务的发现和负载均衡

服务发现 之前讲微服务的时候 讲了服务发现的概念  什么叫服务发现 就是一个服务启动了 怎么能让别的服务知道我启动了  这个服务要添加进来 这个就叫服务发现

kubernetes 他使用的DNS服务  通过主机名和IP的映射关系 来去发现服务的  

 

如果进入容器的流量很大 kubernetes 可以通过负载均衡的方式启动多个  前面做负载均衡是通过 nginx 或者haproxy 这种方式 后台 启动一堆的服务 以前通过这种方式 

不管是 nginx  还是haproxy  还是lvs  都是后台启动多个服务来完成 通过前面反向代理 或者lvs 的方式  来去做负载均衡  这个也很繁琐 因为很多事情都需要我们人为来干 我们要启动lvs  要启动nginx  要启动 haproxy  我们要去加后端的服务  两个不够加四个  四个不够加六个  而kubernetes 自己就能完成  他就能它里面的组件  来实现负载均衡的服务发现  负载均衡和服务发现 两个概念是一个 相辅相成的概念  在kubernetes 里面 服务一旦被发现了 在 kubernetes 启动服务 一旦被dns发现了 就能够通过另外一种技术实现负载均衡 这是kubernetes的第一个作用

第二个作用 他能做到自动部署和回滚

在生产级别 你公司的应用 各种各样 不同的应用  就是他的更新的速度很快 频率很高  

怎么把开发人员写出的新代码  新功能 给他发到线上去呢 这叫部署  就是新的功能

人家已经开出好了  测试也完成了  **已经没有问题了 可以上生产了 这时候需要运维部署到生产上去  这个词叫部署 生产级别叫部署 或者叫发版 或者叫上线**

这个词一定要记住  

回滚  :  就是你发完的东西有问题  测试没测试出来 结果在生产上 被用户用出来了  给你反馈一个bug 出来 影响到你生产上的服务了怎么办?  如果很着急很着急的情况下 没有办法  只能回滚回退

软件都有版本  比如我们的app  现在是1.0版本 下一个版本 可能是1.1

比如我通过部署 已经部署到1.2 版本到线上了  结果1.2 版本发现有问题 

某些功能有问题 或者有严重的bug  紧急解决不了怎办?  只能回退  

把这个1.2 版本 退到1.1 版本上来  把你生产上 目前从1.2 跑的  退到 1.1 上来 

部署是开发人员把新写的代码 打完包以后  部署到线上去 给用户访问  

生产级别 服务发版的频率非常非常高  不是下载个app 几个月 或者几周才更新一次  频率非常非常高 可能一天就要发几次  发版的时候 首先 有一个版本 比如 1.1 已经在线上运行了一段时间 没有问题  现在上了 1.2 版本 现在版本更新了 

更新到 1.2 了  发现有问题  需要回退  功能有问题  都不行了 用不了  

现在唯一的办法就是回退 因为我们一般不允许你在线上 解决 现有的bug  

不光是bug 问题 一般回退 是重大故障的时候才会回退  不允许你在线上解决这个问题 因为 你无法保证解决的时间  就是1.2 有问题  技术人员很牛 说10分钟就能搞定他  那行  但是通常这话都是扯  不可能 不可能 10分钟就解决重大bug  因为要查很多的原因  可能通过 几个小时候才找到原因 才能修复他 那这个过程  服务用不了 是个大问题 如果一个服务 几个小时用不了 是个大问题  

所以我们唯一的办法 是在这个时候回退  从1.2 版本回退到1.1 版本来 这个叫回滚或者叫回退  未来做自动化的时候 自动化 上线的时候 这个动作 部署和回滚 未来做自动化的时候 一定要考虑这两个问题  不是说 你把这个东西发到生产上就没问题了  还要考虑一旦有问题 如何快速回滚 

这个东西以后怎么办 一键就通过一个web界面 一个按钮点一下就OK 了  这样的效率和速度才是运维干的事  才是 作为一个后天的管理人员干的事 这个部署和回滚一定是运维内最核心 的一个工作内容

而kubernetes 内部就集合了一个方式 它能够通过 命令行 或者api接口的方式 把你的服务自动部署上去 如果你想回滚 也有回滚的方式 通过它内部的方式给你回滚  

虽然说 他有这个命令行 未来不可能让你直接在生产商 操作命令行 你未来在生产上 直接操控  命令行的可能性不大 我们要通过  不是所有的人员都有kubernetes 的这种技术的 多数情况下 在生产级别上 能使用kubernetes 的人很少  现在 这种技术人员 比较少

所以作为一个运维管理人员 把kubernetes 提供的这些功能  用其他方式封装出来 

就和刚刚说的 不管是上线 部署 还是回滚 就点一个按钮  就完事 上线点一个按钮 等他走完 加载完 就OK  有问题  点下回滚按钮 走完 加载完就OK  这是运维要干的活 

会干这个 首先 你得知道 kubernetes 有这个功能 其次怎么来调用这个功能  这个是kubernetes 的第二个功能  部署和回滚

kubernetes介绍,什么是k8s_负载均衡

第三 自动完成装箱计算

自动完成装箱计算就是 最终 通过 前面讲的容器 把 cpu 内存 呐 磁盘呐 这一堆堆的东西  给他做成一个系统  应用跑起来 这是个装箱计算的一个概念 其实就是容器 kubernetes 本事 最终还是容器  

kubernetes 最基本的说法就是**一个容器调度和编排的工具**

就是前面讲的纯docker 解决不了的问题 他能给你解决了 一定还是围绕着容器来完成的

第四 自我修复

比如kubernetes里面跑了两个服务 那跑的这俩服务 这俩服务如果有问题  怎么办呢 结果 比如有两个容器 先理解成容器  kubernetes管理的容器 事实上不是直接管理容器的 就是前面讲的docker启动的容器  kubernetes 直接通过这种工具 来管理容器的  比如这个kubernetes  我想 把一个容器 启动五份  或者启动十份  几十个  就是我们这个里 一个命令行  就能解决的问题  一个参数  就能解决  如果像以前容器 我们得 跑10个机器上去 执行 10次 docker run  或者docker-compose 但是kubernetes不用 只需要在某一个文件 加一个参数 默认从1 给成10  他就给你启动十份 

什么叫自我修复呢? 就比如有个服务不小心down了 这10个 可能突然有个服务 内存不够了  或者cpu不够了 或者程序自己 出问题了  down 了 这时候kubernetes 要保证 符合你的要求  要保证容器运行的数量符合你的要求  比如 我就10个 多一个不行 少一个不干 我就这么轴  怎么办呢?  他会自动给你启动一个 挂一个 启一个 挂一个启一个  

就这么个意思  会自动修复 多了也不行  除了极特殊的情况

第五 秘钥与配置管理

秘钥与配置管理 它支持的方式 比如令牌 ssh秘钥 密码 通常叫秘钥  配置就是我们之前讲nginx  讲各种配置的时候 都有配置文件 这里面 可以通过 比如我们正要启动一个服务 

下次想让他修改  需要修改配置文件后 reload  或者restart 重启让这个服务生效  但是Kubernetes 里面呢 提供了另外一种方式 我们可以直接修改 配置 叫 ***\*configmap\**** 的一个配置  修改他后 加载给你的容器  然后就容器就会生成配置项

第六 弹性扩展

hpa 问题  比如业务高峰期的时候 比如现在有个后台服务 有两个节点 业务高峰的时候 可能两个节点不够  怎么办呢? 需要把它扩容到六个  十个  或者更多  他会自动扩容 

这需要一定技术  他肯定需要一个监控 的方式  比如说我现在有两个程序 他的cpu使用率  和内存使用率 都已经超过百分之八十了 这个需要自己定义  

比如这两个服务内存都超过百分之八十了  怎么办呢?  你可能觉得两个不够用了  这两个服务已经达不到我的要求了  他会自动给你扩容 扩容几个 你自己想定义几个 就定义几个 这个都不需要你管  需要另外一种方式 

PA 他有两个PA  一个叫HPA一个叫VPA 一个叫横向扩容 一个叫纵向扩容   横向扩容 就是两个机器不够  四个 四个不够八个  

纵向扩容 就是  2G 内存不够 给你加4G  你就一个电脑  内存不够 再加8G  16G 不够再加  这个叫纵向扩容 

kubernetes 也有这个概念 横向扩容 和纵向扩容 HPA VPA

HAP 就是加节点 VPA就是加配置

第七存储编排

存储编排就是我们如何 把我们的容器里面跑的服务放到指定的存储里面去

之前讲的容器 一旦容器被销毁了 它里面的都没了 之前讲的一种方式 -v 的方式挂载出来

但是 kubernetes 有个问题 kubernetes 跑得服务 比如他第一次服务启动 运行在机器1 上面的 (有可能 这个是随机的)  下次启动有可能运行在机器2 上面呢  就是他两次启动不一定在同一台机器上  那你能保证两台机器上 -v 挂载的目录都有吗?  保证不了 所以 这里面给我们 提供了个存储编排的方式  他用网络文件系统的方式  就是说你专门有几台机器 来提供存储 功能的 这些机器别的不干  就提供存储功能  这几台机器 属于集群外的了  跟kubernetes 集群本身没有关系  前面学的nfs 网络文件系统  nfs 就是可以把其他机器通过网络挂载的方式 把你 的目录 挂载到其他几台机器上去  

nfs 网络文件系统 network file system  

kubernetes 所使用的存储编排技术 依赖这种网络文件系统的技术 但是我们肯定不会用nfs  因为nfs 的性能太弱了 弱爆了  咱们会用分布式的存储  分布式文件系统 

 

一直在讲kubernetes 是管理容器的  事实上这个说法是不准确的 kubernetes 里面一个最小的控制单元叫pod 这个pod 里面运行的是容器 

kubernetes 调度的是pod  但是pod里面运行的是容器

k8s 控制的单元是pod  

pod 豌豆荚 豌豆荚是pod  里面的豌豆就是容器  事实上pod里面才是运行的容器  !!!!

kubernetes 不直接控制容器的 !! 他控制的最小单元是pod  

一切一切一切都是kubernetes 都是围绕着pod 的产生 和运行  来围绕他来实现的

整个kubernetes生态链

kubernetes介绍,什么是k8s_回滚_02

最下层  是物理机的硬件  就是你的电脑  

kubernetes介绍,什么是k8s_kubernetes_03

kubernetes介绍,什么是k8s_回滚_04

电脑上面 运行的是你的操作系统 ubuntu Redhat centOS  coreOS

coreOS现在挺牛的 

 kubernetes 很多技术 都是靠coreOS 贡献出来的 

kubernetes 为什么难学?  

第一kubernetes 这个服务本身就很难学  

除了这个服务以外  kubernetes 有大量的组件 上千个  你不可能全学会 

咱们学一些通用的 未来生产上 都在使用的组件

这是第二层 他和 其他云服务 类似的 他底层还是依赖于操作系统  而且还是依赖Linux操作系统的 kubernetes 不支持 windows  windows 是运行不了的  

除了这个操作系统外 他还要依赖于容器

kubernetes介绍,什么是k8s_docker_05


第三层  不一定是 docker  他是容器运行时  就是container  

lxd 现在不怎么用了  rkt 现在挺火的  

现在挺火的是 containerd podman docker  这三个 主流的 

就是kubernetes  所依赖的三层东西 没有kubernetes 是运行不了的

kubernetes介绍,什么是k8s_docker_06



在往上就是kubernetes 自己了 编排工具  目前存在的编排工具  第一个叫 kubernetes  还一个叫 mesos (Apache软件基金会管理的) docker 公司推出的 docker swarm 之前讲容器的时候 传说中的docker 三剑客之一   现在几乎没人用了  现在市场上百分之99的都是kubernetes  MESOS 和 Docker Swarm  几乎无法生存了 

在往上就是容器的 管理平台了


现在比较主流的 就是Rancher


kubernetes介绍,什么是k8s_kubernetes_07

上图是kubernetes 和其工具的对比

Rancher 老板还是中国人呢  华人  在美国开源的

Rancher 不光能做kubernetes 还能管理Mesos Swarm  都能管理

目前主流的还是kubernetes  

Rancher 使用还是比较高的 

它里面有个k8s  还有个k3s  

他可以通过这些工具 直接装集群  也可以把已经存在的集群  给你加载到他的 Rancher里面来  

Rancher 就是个容器 官方下载个docker 镜像  用docker run 起来就行  

他会生成一个web界面 很简单 一步一步来就行

kubernetes 版本进化他更新特别特别快 一年 能更新 4到5个大版本

kubernetes介绍,什么是k8s_docker_08

Kubernets资源

中文社区

https://www.kubernetes.org.cn/

官方网址

https://kubernetes.io/

kubernetes基本概念

组件

kubernetes 由两个大部分 包含

第一部分 master

安装的时候 首先要安装一个master  对应的 work node  工作节点
除了这俩外 还有一个 
存储系统 etcd这个存储系统 是存储 你kubernetes 所有的 资源变更  资源状态都要存储在这里面  所以在生产级别 这是个集群
使用raft 协议  rocketMQ集群  也是使用这个协议  服务发现 高可用  raft
ETCD也是使用 raft协议 实现高可用
ETCD 本身可以理解成zookeeper  和zookeeper 作用是一样的 
kafka集群  是把它的东西写在 zookeeper 里面的  分布式服务协调框架
事实上 在这个ETCD没有起来之前 大家都用zookeeper  
所以ETCD 的功能几乎是和 zookeeper 类似的  所以我们后面master  
kubernetes 集群里面  他要产生 所有所有的数据  集群的数据 都要存储在  ETCD上面的
所以生产级别 这肯定是个集群 一般 都是 5 到7个 节点
ETCD 是个很重要的  未来还要给他做备份

kubernetes介绍,什么是k8s_docker_09

以上是最主要的三个大组件  除了这三个大组件外 master 如何和node 通信
kubernetes 控制的最小单元是pod  
上图 master  node  
master  是个地主婆  work node 是个长工
nginx 也是一个master进程  多个work进程
nginx上  master 负载创建work 进程  
work 进程负责 响应客户端的请求
master 负载发号施令 
kubernetes 也是这样的  master 负责管理node 节点 就最终围绕后面讲的各种各样的 kubernetes 上的资源对象来实现的  那他俩最主要的作用是  后面运行的所有的pod 生产级别 我们自己启动的各种各样的 服务 都是运行在node 节点上的 
生产级别是存在大量的node 节点的 
后面运行的pod 都是运行在node节点上的  所以生产级别node配置都比较高  
今天装的node节点配置设置高点 master 低点 
最终真正需要干活的是node节点  master 节点只是负责指挥他干活的
这是两个大的组件


master和node上分别又工作了各种各样的 小的组件 各种各样的工作进程 

master 如何管理node 

在master 上第一个技术叫API Server  

API Server

API是接口 就是个接口服务 

整个kubernetes能够和ETCD 通信的 就是API Server  只有他有这个权限 有这个能力

API 负责和etcd 交互  其他所有的组件都是通过 API server 和 ETCD 交互的

API server 通过restful api

 (就是http接口 http的请求方法有[HTTP的8种请求方法](#HTTP8_5)

[1、OPTIONS](#1OPTIONS_21) [2、HEAD](#2HEAD_23) [3、GET](#3GET_25) [4、POST](#4POST_27) [5、PUT](#5PUT_29) [6、DELETE](#6DELETE_31) [7、TRACE](#7TRACE_33) [8、CONNECT](#8CONNECT_35))

接口风格叫  restful api  这个里面是 api server  负责 ETCD 通信

这里面 唯一能够 和ETCD通信的就 api server  没有任何其他的组件 

 

我们讲安装的时候  这个ETCD 事实上是装在master 上面的  就是我们这个ETCD服务是装在master 这个主机上的 你可以分开  我们使用的这种方式装 的 默认就装在master 上的

所以通常情况下 我们把ETCD 作为一个master 组件 来介绍的  

ETCD 就是集群的状态存储  就是我们后面所有的 状态都要存储在etcd里面 

这是讲了两个组件了 :ETCD  API Server

WORK Node

node 上要运行docker  运行容器  叫容器运行时  

第一  容器运行时要运行

container-runtime 容器运行时

container-runtime 容器运行时

理解成dokcer  就行 

然后  container-runtime 上要启动pod 

事实上里面 pod 在里面启动着呢

master 针对container-runtime有个pod管理器 不一定叫pod 管理器 叫各种各样的管理器 控制器管理器 

第二个组件  master上的 叫控制器管理器 

controller-manager 控制器管理器

controller-manager 控制器管理器

最主要的控制器 是pod控制器 最常用的 叫pod控制器 管理这个pod的 

就是你这个pod如何 运行在node 节点上的  如何运行的 就是靠 controller-manager 控制器管理器   来管理的 不管是他 不管是pod 管理  很多很多控制管理器

调度器 kube-scheduler

除了这个以外 master 还有个

叫调度器   node节点有很多个 几十上百个都有可能  那我要起一个 pod  是靠控制器  
启动在那台机器上 靠调度器  kube-scheduler  他负责 把你通过各种控制器  指定好要启动的容器  或者叫pod  通过 调度器  kube-scheduler  给他启动 到 你的node 节点上 在那台node机器上启动 是由调度器 kube-scheduler  节点来控制的  

咱们是确定不了 pod 启动在哪的  (也可以强制确定 这属于高级调度)  

比如咱们现在有10个node 节点 其中有 9台node 节点cpu  或者内存 只剩下    10个G 内存了  现在要启动个服务  有98台只剩下10个G了 另外一台  有20G 内存  

现在要启动个服务需要16G 内存  前面9台都不符合条件  想用那9台 也启动不来  

所以kubernetes 调度器 最基本的要求  必须符合 启动的条件  我要16G 内存 你却只有10个G了 给你  你也启动不了  就不会给你  

首先 他得找到 符合条件的运行节点来运行他  这个就是调度器kube-scheduler的功能

但是调度器  调度完成了  如何调度到 node 节点上运行呢  怎么让他在node 节点上运行呢  这个就得看node 节点上的组件了

客户端工具 kubelet

node 上面有个客户端工具  就类似于 kubernetes 客户端工具 叫 kubelet  

首先  kube-scheduler 调度器 先去找 kubelet  

就是调度上来后 已经确定运行在某个节点上了 比如node1  已经确定好调度到node1节点上运行了  后面  controller-manager 控制器管理器 就得来 找  node1 节点上的 kubelet上的程序  这个进程 或者这个组件  控制器告诉你这个机器 kubelet 这个服务 

让kubelet 服务 启动一个 符合 咱们自己定义的一个要求的pod 出来  

kubelet 最终负责调用 你这个node 节点上的  容器  服务的 

 

就是 master 上的 controller-manager 控制器管理器  告诉node 节点上的 kubelet 你抓紧给我启动一个容器出来  这个容器是我们定义好 的  

就理解成咱们写了个文件  比如 我要10个G内存 2核cpu 要下载 什么镜像 给容器起个啥名字  docker run 干的活 

 

就controller-manager 控制器管理器 通过API Server  传给 kubelet

kublet 拿到这个信息后 要在节点上 启动容器    

kubelet 调用你当前主机的 docker 服务 把你的pod 创建起来 

这个是kublet 的作用 

他就是个客户端工具  

他最终调用 容器运行时 来启动一个服务 

除了这个外 还有另外一个组件 

叫 kube-proxy

kube-proxy

kube-proxy  类似个代理的工具

kube-proxy 本身调用你当前 主机上的两个  目前咱们这个版本  有可能是两种方式  但是他最终只能调一个  你让他  调什么 它能够使用的第一iptables  它能够调用你当前iptables  来实现 Snat  和Dnat 的一个规则 就是原地址转换 和目标地址转换的一个规则 

或者是另外一个ipvs  就是lvs   

kube-proxy  生成一堆的规则  来干负载均衡 代理  

刚才讲kubernetes 是可以做服务发现和负载均衡的功能的

负载均衡的功能就是靠kube-proxy来完成的

就是每个node 节点上都会运行一个kube-proxy 的一个组件 

他用kube-proxy 来实现后面服务的 负载均衡和服务发现的 

反向代理和负载均衡都是靠  kube-proxy来完成的  

因为kube-proxy就是一堆堆规则 要不然是ipvs  要不然就是 iptalbes  

ipvs 是在kubernetes 1.11 开始加入这个新的功能的

1.11 和1.11以前都 用的iptables  

 

kube-proxy 主流的框架 就是这俩 ipvs 和iptables

现在生产上 二进制安装的话 默认使用的是 ipvs

用kubeadmin安装 默认使用iptables

生产者一定使用的ipvs 因为 一个主机上 iptables 规则超过1万条的时候 他会影响你的性能了  别看1万条很多 其实没有多少  我们启动一个pod  会用一堆规则 

光查 net表 就一大堆 规则 

以上是node 节点上的 kube-proxy 组件

kubernetes介绍,什么是k8s_docker_10


这个就是kubernetes  必须依赖的组件  官方给我们要求的组件 都得有 

除了这些组件 还有一些附件 

一开始讲的服务发现 DNS  附件里面有DNS 

附件是master 和node 都要运行的 DNS服务

第一个叫 以前叫kube-dns  

现在叫 coredns

coredns

第一个核心附件  coredns  附件

除了这个以外 还需要网络组件  如果我有多个node 节点  不同 node 上的  pod 是怎么通信的呢  靠另外一个组件 网络组件 

network flannel 还有calico 还有比较流行的 canal 

还有比较出名的叫 Cilium

以上的组件 附件 必须安装

UI

还有个组件 可选装

UI

给你提供一个web界面

以上就是组件和附件

kubernetes介绍,什么是k8s_kubernetes_11

介绍一种安装集群的方式

kubernetes集群的安装方式

主流的:

1 官方推出的命令行方式,kubeadmin

2 二进制 略复杂


举报

相关推荐

0 条评论