一、Kubernets
1.作用:用于自动部署扩展以及管理容器化部署的应用程序,半开源,k8s的底层是基于谷歌go语言开发的,负责自动化运维管理多个容器化的应用的集群,容器编排框架的工具。现在使用的版本1.18-1.24,最主流的版本为1.20。
2.k8s的使用场景,为什么要有k8s:可以满足多节点部署,不再是单机部署;可以自动完成更新和部署;跨节点容器之间的通信问题;有自我修复机制,使得整个容器集群可以在用户的期望状态下运行。
3.k8s特点:
自我修复:在节点故障时或者容器启动失败,节点故障时会自动把该节点上的容器重新部署到其它节点;容器启动失败时:k8s会自动的启动容器,一般会启动3次,如果3次启动失败就会认为服务不可用;在容器启动时,也会有检测机制,检测容器启动是否正常,确保集群内部的服务能够正常工作。
弹性伸缩:在一个容器占用机器的资源比较高时,k8s会自动的增加容器数量,在资源占用下降的时候会自动释放容器的数量;以最小的成本运行服务。
自动发布:也叫滚动发布模式、默认模式;k8s在更新时不是一次性更新所有,而是更新一部分,然后再更新剩余的部分,如果有问题可以随时回滚。
服务发现和负载均衡:多个容器有一个统一的访问入口,内部地址和统一的对外地址,自动负载均衡所有管理的容器,无需考虑容器的IP地址。
存储编排:支持外挂存储,内部挂载就是内部存储卷;外部挂载,本地存储,也是可以公有云,NFS、ceph都可以支持。
集中化配置和密钥管理:k8s的所有配置可以加密的形式保存在集群信息中,提高集群的安全性。
任务的批量处理
二、k8s架构和核心组件:
1.架构:主从架构,mater-slave模式就是我们所有的操作、管理、运维都是在主节点完成;从节点在k8s架构中叫node节点,也叫工作节点也就是负载工作的节点
2.组件:主节点
1》kube-apiserver:这是整个集群的大脑,每个组件之间的资源请求和调用操作都是通过apiserver完成的,通过api接口发送到各个组件。所有的资源对象的增删改查和监听也都是由apiserver来完成的,处理之后交给etcd进行存储。
api接口和端口的区别:
api接口:内部的组件和组件之间通信的接口,也就是程序和程序之间,内部调用方法的接口
端口:应用和应用之间,客户端和客户端之间的通信。
2》etcd:k8s内部的存储服务,也是分布式的键值存储系统,存储了k8s集群的配置和用户配置,以及集群内部服务的信息;只有apiserver可以和etcd通信,只有它有读写权限,其它组件要想往etcd存储信息或者读取信息必须通过APIserver;etcd分布式必须是奇数台,要么是一台,要么是三台;etcd说白了就是k8s的数据库。
3》kube-controller-manager:运行管理控制器;k8s集群当中常规任务的后台的线程,是k8s集群当中所有资源对象自动化控制的中心;在k8s集群当中,一个资源对应一个控制器,controller-manager就是管理这些控制器的。
node controller节点控制器,节点出现故障时发现和响应
replication controller副本控制器,我们创建资源对象时可以选择创建的个数(容器数量),保证资源对象声明的副本个创建的数量保持一致;
endpoints controller:端点控制器,指的就是service对应的容器,service来匹配对应的容器,监听容器的变化,端点就是暴露出来对外访问的。
resourcequota controller:资源配额控制器,确保创建的资源对象不会超过设定系统资源量。
namespace controller:项目上进行区分,每一个命名空间都是独立的,namespace是用来管理命名空间的生命周期。
4》kube-scheduler:根据调度算法,为容器选择一个合适的node节点。node节点的资源越富裕,负载越小的node节点部署容器的排名就越高。
3.node节点组件:
1》kubelet:主节点在node节点的监控器与master节点通信,定时向apiserver报告服务在node节点上的运行情况,接受来自master的调整措施。kubelet负载节点上容器的生命周期。也就是master指令传给kubelet,kubelet完成之后传给apiserver,apiserver把node节点更新的信息保存到etcd当中。
2》kube-proxy:在每个node节点上实现容器的网络代理,是service的具体载体,负责网络规划和四层负载均衡工作原理ip+端口,通过iptables和ipvs实现服务的映射访问;apiserver通过监控kube-proxy来完成对容器的更新和端点的维护,把变化的结果保存到etcd。内部服务的负载均衡是四层代理,实现内部容器的负载均衡,k8s的每个节点都有kube-proxy。内部的IP地址:由flanner及calico这两个插件提供内部容器的IP地址。
3》docker:整个集群的最底层。
三、k8s的核心概念:
pod:k8s里面的最小单位,一个pod就是一个正在运行的进程,pod的里面包含着容器,可以是一个容器,也可以是多个容器,探针、调度算法、标签也在pod内;部署在同一pod当中的容器,共享网络、存储和计算资源。不同pod之间只能通过集群分配的IP地址进行通信。
Lable:标签,是k8s的特色管理方式,对资源对象进行分类,通过标签把pod--service---资源对象-控制器组件进行管理。
service:在集群当中每个pod都会设定一个IP地址,pod的消失会导致IP地址也消失,service就是来解决这个问题的核心概念,service----网关。service用于集群的内部访问,service是四层负载均衡,只能是IP+端口
ingress:是整个k8s集群的外部通信,ingress是七层转发,IP+域名
namespace:是一种资源隔离上的方式,逻辑上的隔离,项目越来越多,集群越来越大,通过命名空间把资源分配到各个命名空间,每个命名空间之间资源不共享,使用的是分配的资源,命名空间在集群当中是唯一的,名字不能重复;default默认命名空间,不做任何特殊声明,所有的资源都在默认空间;kube-system系统应用的命名空间;查询特定的资源,一定要加上命名空间。
四、k8s部署:三台
master:192.168.127.44 etcd
node 1:192.168.127.55 docker kubeadm kubelet flannel
node 2: 192.168.127.66
1.关闭防火墙及安全机制
清空iptables策略
关闭swap交换分区
加载ipvs模块
查看时间是否同步:不一致必须做时间同步
三台主机改名
同步操作 su刷新主机名
打开/etc/hosts进行ip和主机名进行映射
调整内核参数:
安装docker
导入阿里云yum源地址
安装docker
安装docker节点
拉镜像
安装kubelet
设置开机自启
kubelet初始化当中需要的镜像
pause镜像:特殊容器,整个容器的作用就是保持pod当中其它的容器的运行;我们pod首先是拉取镜像,pod当中会有一个pause,pause会在每个pod中创建一个网络命名空间;pod的生命周期结束,pause容器也会退出,释放该pod的网络命名空间。
取消同步:master对adim初始化
在node1、2节点上添加密钥token验证 加入集群
设置节点的kubelet
编辑yum文件、查看node节点状态
更改yaml文件的IP地址,检查集群的状态(kubectl get cs)
五、pod
1.pod内部的网络通信:
pod内部容器通信:pod创建完之后集群会分配pod一个全局的唯一ip地址,所有pod内的容器共享这个IP地址;pod内部容器可以用本地通信+端口形式互相通信。
2.同一个node节点上的pod通信:
同一个节点上的pod和docker的通信是一样的,都是由doker0的网桥进行通信。
3.不同节点上pod之间通信
想办法通过主机的物理网卡IP地址进行通信,前提podIP地址是不能重复的,pod的IP和node节点的IP进行关联,所以有了CNI网络插件。pod的IP地址进行封装,通过node节点做为路由,转发到其它的node节点,其它的node节点收到数据包之后解包,把数据包转发到指定的pod
六、k8s的网络类型:
1.CNI网络插件: 分为Flannel 和calico
CNI:是一个标准接口,用于容器在运行时调用网络插件,配置容器的网络;负责设置容器的网络命名空间,IP地址,路由等网络参数
2.Flannel插件:让集群内不同节点创建的pod都有一个集群内部唯一的IP地址
flannel:是一种overlay网络,overlay是一种网络虚拟化技术,在底层的物理网络基础之上在创建一个逻辑虚拟的网络层,通过虚拟的网络层实现跨节点的pod之间的通信。
flannel数据转发的方式:udp、host-gw、vxlan
udp:基于应用层转发,配置简单,性能最差,
host-gw:性能最好,但是配置繁琐,一般不用
vxlan:主流模式,基于内核转发
(vlan:通过标识来实现广播域的划分,不同的vlan之间可以通信2--4095)
vxlan:通过vni标识数据中进行广域网的划分,通过flannel虚拟的三层网络层再搭建一个虚拟的二层的数据链路层网络,类似于三层交换机。
vxlan工作模式:flannel.1是ens33虚拟出来的虚拟网卡
mac地址是由arp广播进行确认
3.calico网络:路由维护,路由转发
flanner和calico的区别:
flanner插件:默认的地址是10.244.0.0/16
flanner三种模式:UDP\VXLAN\HOST-GW
flanner的功能简单,不具备复杂的网络策略的配置能力,小集群或者简单的网络首选
calico:BGP直接路由、路由维护、路由转发
默认网段:192.168.0.0/16
calico是一个可以对网络进行管理的插件,具备配置复杂网络配置的能力,本身的配置比较复杂,对开发人员,运维人员要求比较高。需要复杂配置的需要calico。
基于Flannel 插件创建虚拟网卡主节点
从节点:先拉包再解包
主节点:
附加自动补全命令:source <(kubectl completion bash)
附加k8s证书签发10年方法:利用update-kubeadm-cert.sh脚本编辑
七、面试题:
flanner网络你们用的是啥:vxlan,其中flanner.1是由ens33虚拟出来的虚拟网卡,虚拟网卡解决了两个问题,首先是给集群中的pod分配一个全局唯一的IP地址,使其与不同节点上的pod进行通信及与宿主机也可以通信。