kubernetes简介
k8s概念
Kubernetes 是一个可移植、可扩展的开源平台,由于k和s中间有8个字母,所以简称k8s,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。K8s可以称作为云原生时代的操作系统。一个典型的k8s集群架构图如下所示,此图来自官方文档
可以看到一个k8s集群由master节点和node节点组成,其中master节点上包含api server、controller manager、scheduler、etcd组件,node节点上包含kubelet、kube-proxy组件,其中node节点上还会存在一些其它的组件,比如网络插件、ingress等组件。
k8s组件介绍
下面简单介绍下master和node节点各组件的作用
master组件
- API server
API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver` 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。
- Controller manager
kube-controller-manager是控制平面的组件, 负责运行控制器进程。从逻辑上讲, 每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在同一个进程中运行。
这些控制器包括:
- 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
- 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
- 端点分片控制器(EndpointSlice controller):填充端点分片(EndpointSlice)对象(以提供 Service 和 Pod 之间的链接)。
- 服务账号控制器(ServiceAccount controller):为新的命名空间创建默认的服务账号(ServiceAccount)。
- Scheduler
kube-scheduler是控制平面的组件, 负责监视新创建的、未指定运行节点的 Pods, 并选择节点来让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 及 Pods 集合的资源需求、软硬件及策略约束、 亲和性及反亲和性规范、数据位置、工作负载间的干扰及最后时限。
- Etcd
一致且高可用的键值存储,用作 Kubernetes 所有集群数据的后台数据库,负责存储集群中各种资源对象的信息,保存了集群的状态。
node组件
- Kubelet
kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。kubelet 接收一组通过各类机制提供给它的 PodSpecs, 确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。
- Kube-proxy
kube-proxy 是集群中每个节点(node)上所运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发
以上就是k8s节点上固定组件的简单介绍,当然除了这些组件外,还有一些其它会用到的插件,比如说CNI、CSI、CRI等这些,后续再详细介绍。
工作负载(pod)介绍
Pod是k8s中的一个很重要的概念,真正理解了pod才算是对k8s 有一些使用上的了解。工作负载是在 Kubernetes 上运行的应用程序。在 Kubernetes 中,无论你的负载是由单个组件还是由多个一同工作的组件构成, 你都可以在一组 Pod 中运行它。 在 Kubernetes 中,Pod 代表的是集群上处于运行状态的一组容器的集合。
Pod是k8s的最小编排单位,一个Pod里面可以包含多个容器,至于容器的概念,熟悉docker的应该都了解。简单来理解这句话的意思就是pod中的所有容器共享该Pod的资源,比如说IP地址、端口号、存储等。
不过,通常不需要用户直接管理每个Pod。 而是使用负载控制器来替用户管理一组 Pod。这些负载资源通过配置控制器来确保正确类型的、处于运行状态的 Pod 个数是正确的,与用户所指定的状态相一致。k8s提供了几种内置的Pod控制器,下面简单介绍一下
- Deployment
Deployment很适合用来管理你的集群上的无状态应用,Deployment中的所有Pod都是相互等价的,并且在需要的时候被替换。工作在ReplicaSet之上,是使用最频繁的控制器。支持滚动更新和回滚功能,还提供声明式配置。
- ReplicaSet
帮助用户管理无状态的pod资源,精确反应用户定义的目标数量,但是RelicaSet不是直接使用的控制器,而是使用Deployment。
- StatefulSet
运行一个或者多个以某种方式跟踪应用状态的 Pod。 例如,如果你的负载会将数据作持久存储,你可以运行一个StatefulSet,将每个 Pod 与某个PersistentVolume对应起来。你在 StatefulSet中各个Pod内运行的代码可以将数据复制到同一 StatefulSet中的其它 Pod 中以提高整体的服务可靠性。简单来说StatefulSet原来管理有状态的服务。
- DaemonSet
用于确保集群中的每一个节点只运行特定的pod副本,简单来说,Daemonset保证集群里面每个node节点运行一个Pod副本。
- Job Cronjob
定义一些一直运行到结束并停止的任务。Job 用来执行一次性任务,而CronJob用来执行的根据时间规划反复运行的任务。
以上就是k8s的简单介绍,可以对k8s有一些基本的了解,下一篇将详细讲解如何使用kubeadm安装一个生产可用的高可用K8s集群。