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 的第二个功能 部署和回滚
第三 自动完成装箱计算
自动完成装箱计算就是 最终 通过 前面讲的容器 把 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生态链
最下层 是物理机的硬件 就是你的电脑
电脑上面 运行的是你的操作系统 ubuntu Redhat centOS coreOS
coreOS现在挺牛的
kubernetes 很多技术 都是靠coreOS 贡献出来的
kubernetes 为什么难学?
第一kubernetes 这个服务本身就很难学
除了这个服务以外 kubernetes 有大量的组件 上千个 你不可能全学会
咱们学一些通用的 未来生产上 都在使用的组件
这是第二层 他和 其他云服务 类似的 他底层还是依赖于操作系统 而且还是依赖Linux操作系统的 kubernetes 不支持 windows windows 是运行不了的
除了这个操作系统外 他还要依赖于容器
第三层 不一定是 docker 他是容器运行时 就是container
lxd 现在不怎么用了 rkt 现在挺火的
现在挺火的是 containerd podman docker 这三个 主流的
就是kubernetes 所依赖的三层东西 没有kubernetes 是运行不了的
在往上就是kubernetes 自己了 编排工具 目前存在的编排工具 第一个叫 kubernetes 还一个叫 mesos (Apache软件基金会管理的) docker 公司推出的 docker swarm 之前讲容器的时候 传说中的docker 三剑客之一 现在几乎没人用了 现在市场上百分之99的都是kubernetes MESOS 和 Docker Swarm 几乎无法生存了
在往上就是容器的 管理平台了
现在比较主流的 就是Rancher
上图是kubernetes 和其工具的对比
Rancher 老板还是中国人呢 华人 在美国开源的
Rancher 不光能做kubernetes 还能管理Mesos Swarm 都能管理
目前主流的还是kubernetes
Rancher 使用还是比较高的
它里面有个k8s 还有个k3s
他可以通过这些工具 直接装集群 也可以把已经存在的集群 给你加载到他的 Rancher里面来
Rancher 就是个容器 官方下载个docker 镜像 用docker run 起来就行
他会生成一个web界面 很简单 一步一步来就行
kubernetes 版本进化他更新特别特别快 一年 能更新 4到5个大版本
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 是个很重要的 未来还要给他做备份
以上是最主要的三个大组件 除了这三个大组件外 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 必须依赖的组件 官方给我们要求的组件 都得有
除了这些组件 还有一些附件
一开始讲的服务发现 DNS 附件里面有DNS
附件是master 和node 都要运行的 DNS服务
第一个叫 以前叫kube-dns
现在叫 coredns
coredns
第一个核心附件 coredns 附件
除了这个以外 还需要网络组件 如果我有多个node 节点 不同 node 上的 pod 是怎么通信的呢 靠另外一个组件 网络组件
network flannel 还有calico 还有比较流行的 canal
还有比较出名的叫 Cilium
以上的组件 附件 必须安装
UI
还有个组件 可选装
UI
给你提供一个web界面
以上就是组件和附件
介绍一种安装集群的方式
kubernetes集群的安装方式
主流的:
1 官方推出的命令行方式,kubeadmin
2 二进制 略复杂