Kubernets 希腊语,舵手 飞行员
作用:
用于自动部署,扩展,管理容器化部署的应用程序。开源(半开源)
k8s的底层是由go语言。
k8s理解成负责自动化管理多个容器化应用的集群。
容器编排框架的工具。
谷歌基于go语言开发的。
版本号1.18-1.24
1.20------dcoker
1.24------container
k8s的使用场景:
1、docker部署了一个nginx--cpu -m 一旦访问量增大,nginx有可能占满系统资源。
内存告警,cpu告警
运维人员入场,要么对服务器扩容,要么就重新部署服务。对cpu和内存做限制,防止再一次占满整个服务器。
自动化运维管理:k8s
1、多节点部署,不再是单机部署
2、自动完成更新和部署
3、跨节点容器之间的通信问题
4、k8s有自我修复机制,使得整个容器集群可以在用户的期望状态下运行
k8s的特点:
1、自我修复,在节点故障时或者容器启动失败,节点故障时,会自动把节点上的容器重新部署到其他节点。容器启动失败时,他会自动的重新启动容器,3次失败后,就认为该服务不可用。
在容器启动时,也会有检测制(探针),探测容器启动是否正常
确保集群内部的服务能够正常工作。
2、弹性伸缩,在一个容器占用机器的资源比较高时,k8s会自动的增加pod的数量,在资源占用下降的时候,会自动释放pod的数量。已最小的成本运行服务。
3、自动发布(滚动发布模式,默认模式)和回滚
k8s在更新的不是一次性的更新所有,而是更新一部分,然后再更新剩余的部分,如果有问题,可以随时回滚。
4、服务发现和负载均衡
多个容器有一个统一的访问入口,内部地址和统一的对外地址。自动负载均衡所有管理的容器。无需考虑容器的ip地址
5、存储编排,支持外挂存储,内部挂载,外部挂载,本地存储,也可以支持公有云,NFS,ceph都可以支持。
6、集中化配置和密钥管理:
k8s的所有配置可以以加密的形式保存在集群信息中,提高集群的安全性。
7、任务的批量处理
核心组件:
架构:主从架构,master-slave模式,我们所有的操作,管理,运维都是在主节点完成。
从节点:node,工作节点,负载工作的节点。
组件:
1、kube-apiserver:这是整个集群的大脑。每个组件之间的资源请求和调用操作都是通过apiserver完成的,通过api接口发送到各个组件。
api接口:内部的组件和组件之间通信的接口,内部调用方法(代码)的接口。程序和程序之间
端口:应用和应用之间,客户端和服务端之间的通信。
所有的资源对象的增删改查和监听都是由apiserver来完成的,处理之后交给etcd进行存储。
2、ETCD k8s内部的存储服务,分布式的键值存储系统。存储了k8s集群的配置和用户配置,以及集群内部服务的信息。只有apiserver可以和etcd通信,读写权限。其他组件要想往etcd存储信息或者读取信息必须通过APIserver。
etcd分布式必须是奇数,1台,3台
3、kube-controller-manager 运行管理控制器
k8s集群当中处理常规任务的后台的线程,是k8s集群当中所有资源对象自动化控制的中心,
在k8s集群当中,一个资源对应一个控制器。controller-manager就是来管理这些控制器的。
节点控制器
node comtroller 节点控制器,节点出现故障时,发现和响应
replication controller;副本控制器,我们创建资源对象时,可以选择创建的个数(POD数量),保证资源对象声名的副本数和创建的数量保持一致。
endpoint controller 端点控制器 service对应的pod。service来匹配对应的pod,监听pod的变化,端点就是暴露出来用于对外访问的
resourcequota controller 资源配额控制器
确保创建的资源对象不会超过设定的系统资源量。
namespace controller:项目上进行区分,每个命名空间都是独立的。管理命名空间的生命周期
4、kube-scheduler:根据调度算法,为pod选择一个合适的node节点。
node节点的资源越富裕,负载越小的node节点部署pod的排名就越高。
node节点组件:
1、
kubelet:主节点在node节点的监控器,于master节点通信。定时向apiserver报告服务在node节点上的运行情况,
接受来自master的调整措施。
kubelet负责节点上pod的生命周期。
master的指令传给kubelet,kubelet完成之后,传给apiserver,apiserver把node节点的更新信息保存到etcd。
2、kube-proxy:在每个node节点上实现pod的网络管理,是service的具体载体。负责网络规划和四层负载均衡工作。
iptables和ipvs实现服务的映射访问。
apisever通过监控kube-proxy来完成对pod的更新和端点的维护。把变化的结果保存在etcd
内部服务的负载均衡是四层代理,实现内部pod的负载均衡。
k8s的每个节点上都是kube-proxy
内部的ip地址:fianner calico 这两个插件提供内部pod的ip地址。
3、docker
整个集群的最底层,分布式。
k8s的核心概念:
pod:k8s里面的最小单位,一个pod就是一个正在运行的进程。
pod的里面抱着这容器,可以是一个容器,可以是多个容器。
部署在同一pod当中的容器,共享网络,存储和计算资源。
不同的pod之间只能通过集群分配的ip地址进行通信
Label:标签,是k8s的特管理方式,对资源对象进行分类
通过标签把pod------service-------资源对象--------控制器,进行关联
service:在集群当中,每个pod都会设置一个ip地址,可能会因为pod的消失,导致ip地址随着消失,service就是来解决这个问题的核心概念,service不是一个服务,更像一个网关
ingress:service 用于集群内部访问,ingress是整个k8s的集群的接入层,整个集群的外部通信。
service是四层负载均衡,只能是ip+端口。
ingress是7层转发:
www.xy102.com port----->ingress------->service------->pod
namespanamespac:资源隔离的方式,逻辑上的隔离,项目越来越多,集群越来越大。通过命名空间把资源分配到各个命名空间, 每个命名空间之间资源不共享,使用的是分配的资源。命令空间在集群当中时唯一的。名字不能重复的。 default 默认命名空间,不做特殊声明,所有的资源都在默认空间 kube-system 系统应用的命名空间。 查询特定的资源,一定要加上命名空间。
pause:镜像,特殊容器,这个容器的作用就是保持pod当中其他容器的运行
创建pod,首先是拉去镜像,pod当中的会有一个pause,pause会在每个pod中创建一个网络命名空间。
pod的生命周期结束,pause容器也会退出,释放该pod的网络命名空间。
coredns:域名解析
kubeadm init \ --apiserver-advertise-address=192.168.233.10 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version=v1.20.15 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=10.244.0.0/16 \ --token-ttl=0
--apiserver-advertise-address=192.168.233.10 \内部通信的ip地址,指向的主,也可以用0.0.0.0表示任务主机
--image-repository registry.aliyuncs.com/google_containers \ 指定镜像的仓库------>k8s组件的仓库地址
--kubernetes-version=v1.20.15 \ k8s的版本 1.20
--service-cidr=10.96.0.0/16 \ service网段
--pod-network-cidr=10.244.0.0/16 \ pod分配的网段,10.244.0.0 flannelde的默认网段 calico:192.168.233.0.0/16
--token-ttl=0 token永不过期,默认有效期是24小时