基本概念
Node
节点可以是物理机或虚拟机,每个节点上都运行着容器运行时环境;
Pod
Pod是k8s中的最小调度单元,一个Pod可以包含一个或多个容器,同一Pod内的容器共享存储卷和网络空间。容器则是轻量级、可移植的执行单元,包含了应用及其依赖的文件系统;
Namespace
default:默认创建的命名空间;
kube-node-lease:保存有关心跳信息的节点数,每个节点都有自己的租约对象,决定其可用性;
kube-public:包含对外可公开的数据,里边包含可访问的集群信息、验证信息等;
kube-system:k8s组件自身使用的命名空间;
Clusterip
ClusterIP类型的service创建时,k8s通过etcd从可分配的ip池中分配一个全局唯一、不可修改的虚拟ip地址,只能在集群内部访问。所有访问该ip的请求,都会被iptables转发到后端的endpoints中;
Nodeport类型service
通过service可以为一组具有相同功能的容器应用提供一个统一的、不变的入口地址,并且将请求进行负载分发到后端的各个容器应用上。客户端不需要知道每个单独的提供服务的Pod的地址,这样,这些Pod就可以在集群中随时被创建、调度和移除。service从设计上看是一个虚拟概念,逻辑上代理后端的Pod;
通过每个node上暴露的ip和port路由到ClusterIP服务,所以可从外部访问。在具有ClusterIP服务的前提下,同一个服务在每个worker 节点的同一个端口上公开,用户可以在任何:NodePort 地址上访问服务。
Ingress
LoadBalancer类型service只为提供三四层负载均衡,而Ingress只需要一个公网IP就能为许多服务提供访问(七层)。当客户端向Ingress发送Http请求时,Ingress会根据请求的主机名和路径决定请求转发到哪个服务上;
ingress controller:将新加入的ingress转化成nginx的配置文件并使之生效;
ingress服务:nginx配置文件的抽象,每添加一个新的服务只需写一个新的yaml文件即可;
域名
得益于kube-dns插件,通过修改容器的/etc/resolv.conf配置,可以通过域名的方式访问service;
k8s将service的名称当做域名注册到kube-dns中,pod查询DNS是通过ServiceName.Namespace子域名来查询的。当service的默认namespace为default时,域名可以通过ServiceName成功查询。
常用资源类型
Deployment
Deployment用来声明式地更新应用的实例,支持滚动更新和回滚,一个 Deployment 可以控制一个ReplicaSet;
Service
Service 定义了一种抽象方法来访问一组Pod,供了一个稳定的入口地址;
ReplicaSet
ReplicaSet确保任何时候都有指定数量的Pod副本在运行,用于横向扩展,一个 ReplicaSet 可以控制多个Pod;
Persistent volume
存储卷为Pod提供持久化的数据存储;
ConfigMap和Secret
ConfigMap用于存储非机密的数据、Secret 用于存储敏感信息,如密码和证书;
StatefulSet
StatefulSet为有状态的应用提供了管理机制,保证每个 Pod 都有一个唯一的网络标识和持久化存储;
DaemonSet
DaemonSet 确保所有或部分节点上都运行着一个 Pod 的副本,常用于运行监控或日志代理等应用;
组件及作用
master节点
API Server
提供了集群管理的Rest API接口,包括认证授权、数据校验以及集群状态变更,是资源配额控制的入口,是整个系统的数据总线;
Controller Manager
作为集群内部的管理控制中心,负责集群内的Node、Pod副本、endpoint、namespace、service account、资源配额的管理;
Scheduler
根据特定的调度算法把Pod调度到指定的worker上,该过程叫做绑定Bind;
Etcd
key-value分布式存储数据库,主要用途是保存集群状态数据、共享配置、服务发现;
worker节点
kubelet
Master节点在worke节点上的代理,向master汇报node的状态信息,pod全生命周期管理:在pod中创建容器、创建pv、返回pod的运行状态、执行容器健康检查等;
kube-proxy
在worker节点上实现 Pod网络代理,实现Service通信,维护网络规则、四层负载均衡工作;
通信过程
k8s通过watch的机制进行每个组件的协作。
1、用户使用kubectl create或apply yaml文件创建pod,请求发送到apiseerver,apiserver将yaml中的属性信息(metadata)写入etcd;
2、apiserver触发watch机制准备创建pod,转发给scheduler,使用调度算法选择worker节点,返回绑定的node信息给apiserver写入etcd;
3、apiserver又通过watch机制调用kubelet,按照pod信息触发docker run命令创建容器;
4、pod创建完成之后经由kubelet将pod的信息发送给apiserver,最后写入etcd(kubectl get pods命令调用etcd的信息);
特性
自动伸缩Auto Scaling
水平自动伸缩 (HPA): 根据CPU使用率、内存使用情况或其他自定义度量指标自动调整Pod的数量;
垂直自动伸缩 (VPA): 自动调整Pod的资源请求和限制,以优化资源使用;
滚动更新Rolling Updates
通过控制更新的速度来最小化对用户的影响,并确保在任何时刻都有足够的应用实例可用;
服务网格Service Mesh
Istio提供服务间的通信管理和监控,包括负载均衡、服务发现、加密、故障注入等;
网络策略Network Policies
控制Pod之间的四层网络流量,提高安全性;
资源配额Resource Quotas
限制命名空间内的资源使用,比如Pod数量、CPU和内存用量等,帮助组织管理集群资源分配;
亲和性和反亲和性Affinity and Anti-Affinity)
控制Pod在节点上的调度,确保Pod按照特定规则运行在同一节点上或者不在同一节点上;
Job 和 CronJob
Job确保一个或多个Pod成功完成至少一次其指定的任务、CronJob创建基于时间周期的Job;