目录
一、K8S是什么?
Kubernetes(常被称为 K8s)是一个开源的平台,用于自动化部署、扩展(缩放)和管理容器化的应用程序。Kubernetes 的设计目的是为了简化在集群中的多个主机上部署容器化应用的过程,并提供了一个框架来执行分布式系统的管理。
Kubernetes 起源于 Google 的内部项目 Borg,它利用了 Google 在大规模容器化应用管理方面的经验。
二、为什么要用K8S?
K8S 的目标是让部署容器化应用简单高效。
K8S 解决了裸跑Docker 的若干痛点:
- 单机使用,无法有效集群
- 随着容器数量的上升,管理成本攀升
- 没有有效的容灾、自愈机制
- 没有预设编排模板,无法实现快速、大规模容器调度
- 没有统一的配置管理中心工具
- 没有容器生命周期的管理工具
- 没有图形化运维管理工具
K8S是Google开源的容器集群管理系统,在Docker等容器技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。 其主要功能如下:
- 使用 Docker 等容器技术对应用程序包装(package)、实例化(instantiate)、运行(run)。
- 以集群的方式运行、管理跨机器的容器。
- 解决 Docker 跨机器容器之间的通讯问题。
- K8S 的自我修复机制使得容器集群总是运行在用户期望的状态
三、K8S的特性
1、 容器编排:
- Kubernetes 自动化部署、扩展和管理容器化应用。
- 提供了应用部署、规划、更新、维护的一体化机制。
2、轻量级:
- Kubernetes 本身的设计较为轻量级,对主机资源(如 CPU 和内存)的消耗相对较少。
3、弹性伸缩:
- 根据应用的实际需求动态地增加或减少应用实例的数量。
- 支持自动扩缩容(Horizontal Pod Autoscaler),可以根据 CPU 使用率、内存使用或其他自定义指标来调整副本数量。
4、支持负载均衡:
- Kubernetes 通过内置的服务发现机制实现了负载均衡。
- 支持基于 IPVS 的负载均衡框架。
5、健康检查:
- Kubernetes 可以监控容器内的应用程序是否正常运行,并且提供健康检查功能来确保服务的健壮性。
6、声明式配置:
- 允许用户以声明的方式定义应用的状态,Kubernetes 负责将实际状态调整到期望状态。
- 支持滚动更新、蓝绿部署、金丝雀发布等多种部署模式。
7、微服务支持:
- Kubernetes 非常适合部署和管理基于微服务架构的应用程序。
- 提供了丰富的 API 和工具来管理复杂的微服务生态系统。
8、可移植性:
- 支持在公有云、私有云、混合云以及多种云平台上运行。
- 具有良好的跨平台特性,可以在不同的环境中保持一致的行为。
9、可扩展性:
- Kubernetes 设计为模块化和可插拔的架构,支持自定义组件和插件。
- 用户可以根据需要添加或修改组件来满足特定需求。
#### **10、丰富的插件生态系统**:
* 由于其开源性质,Kubernetes 拥有一个活跃的社区和大量的第三方插件。
* 这些插件涵盖了从存储编排、网络策略到安全性等多个领域。
#### **11、数据卷支持**:
* Kubernetes 支持数据卷,可以让 Pod 之间共享数据。
#### **12、开源与社区支持**:
* Kubernetes 是由谷歌发起并开源的项目,使用 Go 语言编写。
* 拥有庞大的开发者社区,不断推动 Kubernetes 的发展和完善。
四、K8S的核心组件
1、Kube-apiserver
kube-apiserver 是 Kubernetes 控制平面的关键组件之一,它是集群的大脑,负责提供 Kubernetes API 服务器的功能。API 服务器作为集群的中心通信枢纽,提供了 RESTful 接口来处理客户端请求,并且提供了认证、授权、Webhook 调用等功能
①主要职责
API 暴露:
kube-apiserver
暴露了一个 RESTful API,这是与 Kubernetes 集群交互的主要方式。- 用户可以通过这个 API 创建、读取、更新和删除集群中的资源对象。
认证和授权:
- 在处理任何请求之前,
kube-apiserver
会先验证请求者的身份,并根据配置的权限策略决定是否允许请求继续。 - 这有助于确保只有经过认证的用户才能对集群进行操作。
状态存储:
kube-apiserver
与后端存储系统 etcd 交互,存储集群的状态信息。- 所有的持久化数据,比如 Pod、Service、Deployment 等都是存储在 etcd 中。
事件记录:
kube-apiserver
记录集群中的事件,并且这些事件可以被查询和审计。
开放 API 扩展:
- 允许用户注册自定义资源,并通过自定义 API 服务器来扩展 Kubernetes API。
观察者模式:
- 提供了观察者模式的支持,允许客户端监听集群中的变化,并在状态发生变化时得到通知。
资源版本控制:
- 实现了版本控制机制,允许客户端通过版本号来了解集群中资源的状态。
Admission Control:
- 在请求被处理之前,可以运行一系列的插件来修改请求或拒绝请求,这称为准入控制。
②配置选项
kube-apiserver
可以通过命令行参数进行配置,以改变其行为。一些常见的配置选项包括:
--advertise-address
:指定 kube-apiserver 对外广播的地址。--
secure-port:指定 HTTPS 监听的端口。--
insecure-port:指定 HTTP 监听的端口,此选项通常不建议使用,因为不安全。--
etcd-servers:指定 etcd 服务器的地址列表。--
authorization-mode:指定使用的授权模式,如 RBAC 或 Node 等。--
enable-admission-plugins:启用特定的准入控制插件。
2、Kube-controller-manager
运行管理控制器,是 K8S 集群中处理常规任务的后台线程,是 K8S 集群里所有资源对象的自动化控制中心。在 K8S 集群中,一个资源对应一个控制器,而 Controller manager 就是负责管理这些控制器的。
- Node Controller(节点控制器):负责在节点出现故障时发现和响应。
- Replication Controller(副本控制器):负责保证集群中一个 RC(资源对象 Replication Controller)所关联的 Pod 副本数始终保持预设值。可以理解成确保集群中有且仅有 N 个 Pod 实例,N 是 RC 中定义的 Pod 副本数量。
- Endpoints Controller(端点控制器):填充端点对象(即连接 Services 和 Pods),负责监听 Service 和对应的 Pod 副本的变化。 可以理解端点是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道它的 endpoint。
- Service Account & Token Controllers(服务帐户和令牌控制器):为新的命名空间创建默认帐户和 API 访问令牌。
- ResourceQuota Controller(资源配额控制器):确保指定的资源对象在任何时候都不会超量占用系统物理资源。
- Namespace Controller(命名空间控制器):管理 namespace 的生命周期。
- Service Controller(服务控制器) :属于 K8S 集群与外部的云平台之间的一个接口控制器。
3、Kube-scheduler
①主要职责
-
Pod 调度:
kube-scheduler
从 API Server 获取待调度的 Pod。- 根据预定义的策略和约束条件选择合适的节点来运行 Pod。
-
调度算法:
kube-scheduler
支持多种调度算法,可以通过配置来选择使用哪种算法。- 默认情况下,它使用一个简单的调度算法,但在生产环境中,通常会配置更复杂的策略来优化调度决策。
-
调度策略:
- 用户可以定义自定义的调度策略,这些策略可以包括优先级函数和预选函数。
- 优先级函数用于计算节点的优先级,预选函数用于过滤掉不符合条件的节点。
-
亲和性和反亲和性:
- 支持 Pod 之间的亲和性和反亲和性设置,可以确保某些类型的 Pod 在一起或分开运行。
- 这对于需要共享资源的应用程序或者为了提高可用性而分散部署的应用程序非常有用。
-
资源预留:
- 在某些情况下,可以预留资源给特定的 Pod,以确保它们有足够的资源可用。
②调度流程
kube-scheduler
的调度流程大致如下:
-
预选(Preemption):
- 如果没有节点能满足 Pod 的资源请求,
kube-scheduler
可能会选择预选(抢占)较低优先级的 Pod 来为更高优先级的 Pod 让出资源。
- 如果没有节点能满足 Pod 的资源请求,
-
过滤(Filtering):
- 根据 Pod 的要求和节点的属性(如标签、容量限制等)筛选出符合条件的节点。
-
优选(Scoring):
- 对于通过过滤阶段的节点,
kube-scheduler
使用优先级函数来打分,选择分数最高的节点作为目标节点。
- 对于通过过滤阶段的节点,
-
绑定(Binding):
- 一旦选择了合适的节点,
kube-scheduler
就会将 Pod 绑定到该节点,并通过 API Server 更新 Pod 的状态。
- 一旦选择了合适的节点,
4、etcd
①主要特性
-
一致性:
- etcd 使用 Raft 一致性算法来确保数据在集群中的所有节点上保持一致。
- 即便在网络分区的情况下,Raft 也能保证数据的一致性和安全性。
-
高可用性:
- etcd 支持集群模式,可以通过选举机制选出一个领导者(Leader)来处理客户端请求。
- 在集群中,只要大多数节点存活,etcd 就可以继续运作,提供了高可用性。
-
强一致性:
- etcd 提供了强一致性保证,即所有客户端看到的数据状态是一致的。
- 这对于需要在分布式环境中保持状态一致性的应用程序非常重要。
-
易于使用:
- etcd 提供了一个简单的 gRPC API 和 HTTP API,使得应用程序可以轻松地与之交互。
- 支持多种编程语言的客户端库,方便集成。
-
安全:
- 支持客户端认证,可以使用证书(TLS/SSL)来保护通信安全。
- 提供了基于角色的访问控制(RBAC),可以精细地控制用户对键值的访问权限。
-
可扩展性:
- 可以通过添加更多的成员节点来扩展集群,提高系统的吞吐量和可用性。
- 支持动态添加和移除成员节点。
②主要组件
-
成员(Member):
- etcd 集群中的每个节点都是一个成员。
- 成员之间通过 Raft 协议选举出一个领导者(Leader)。
-
领导者(Leader):
- 领导者负责处理客户端的所有写入请求。
- 领导者也会将请求的结果同步到集群中的其他成员。
-
跟随者(Follower):
- 跟随者负责接收领导者的心跳信号和日志条目。
- 跟随者会将领导者发送的日志条目应用到本地状态机中,以保持与领导者的一致性。
-
客户端(Client):
- 客户端通过 API 与 etcd 交互,进行数据的读写操作。
- 客户端可以与任意一个成员节点通信,该成员节点会负责将请求转发给领导者。
③使用场景
-
配置管理:
- etcd 可以用来存储和管理应用程序的配置信息。
- 应用程序可以动态地从 etcd 中读取配置,实现热更新。
-
服务发现:
- 在微服务架构中,etcd 可以用来注册和发现服务实例。
- 服务提供者可以将自己注册到 etcd 中,服务消费者可以从 etcd 中查找服务的位置信息。
-
分布式锁:
- etcd 提供了锁机制,可以用于协调分布式应用程序中的互斥操作。
- 通过在 etcd 中创建临时独占锁,可以避免多个进程同时执行同一段代码。
-
状态协调:
- etcd 可以用来协调分布式系统中的状态。
- 例如,可以用来管理分布式任务的状态或用于实现分布式选举。
5、Node组件
5、1、kubelet
kubelet
是 Kubernetes 中的一个关键组件,它运行在每个节点上,负责与主控节点的 API Server 通信,并且管理和维护节点上运行的容器。kubelet
是 Kubernetes 节点上的代理,它确保容器按照预期的状态运行,并且能够处理 Pod 的生命周期
①主要职责
-
Pod 生命周期管理:
kubelet
负责创建、启动、停止和销毁 Pod 中的容器。- 它确保 Pod 按照定义的状态运行,并且在容器退出或失败时重新启动它们。
-
容器健康检查:
kubelet
定期检查容器的健康状况,并报告容器的状态给 API Server。- 可以配置 liveness probes(存活探测)、readiness probes(就绪探测)等来监控容器的健康情况。
-
资源管理:
kubelet
管理节点上的资源,如 CPU、内存等,并确保容器不会超出其资源限制。- 它还负责分配和管理容器的网络接口和存储卷。
-
状态同步:
kubelet
与 API Server 同步节点的状态,并确保节点上的实际情况与 API Server 中记录的状态相匹配。- 如果发现状态不一致,
kubelet
会采取措施来纠正这种情况。
-
日志管理:
kubelet
收集容器的日志,并且可以配置为将日志发送到不同的目的地,如 syslog 或特定的日志聚合系统。
-
事件上报:
kubelet
会记录并上报有关节点和 Pod 的事件,这些事件可以帮助诊断问题和监控集群状态。
②特点
-
去中心化:
kubelet
是去中心化设计的,即使与 API Server 的通信中断,kubelet
仍然可以继续运行和管理容器。- 这种设计提高了系统的健壮性和可靠性。
-
可插拔性:
kubelet
支持使用不同的容器运行时(如 Docker、containerd 等),通过 Container Runtime Interface (CRI) 进行交互。- 这使得 Kubernetes 能够兼容多种容器运行时。
-
安全性:
kubelet
支持多种认证方法,如 TLS 客户端证书、JWT 令牌等,以确保与 API Server 通信的安全性。- 可以配置
kubelet
来限制谁可以与之通信,增强系统的安全性。
-
可配置性:
kubelet
可以通过命令行参数或配置文件进行详细的配置,以适应不同的部署环境和需求。
5、2、Kube-Proxy
kube-proxy
是 Kubernetes 集群中的一个关键组件,它负责实现集群内部的网络通信,并为集群中的服务提供负载均衡和网络代理功能。kube-proxy
通常运行在每个节点上,并且与节点上的 kubelet
协同工作。
①主要职责
-
服务路由:
kube-proxy
负责将流量路由到正确的后端服务。- 它监听 API Server 中服务(Service)和端点(Endpoints)的变化,并相应地更新本地的网络规则。
-
负载均衡:
kube-proxy
可以为集群中的服务提供简单的负载均衡功能。- 它可以根据服务定义的负载均衡策略,将流量分发到多个后端 Pod。
-
网络规则维护:
kube-proxy
维护节点上的网络规则,确保集群内部的 Pod 之间可以互相通信。- 它使用 iptables 或者 ipvs 等技术来实现这一功能。
-
服务发现:
kube-proxy
使得 Pod 可以通过 DNS 名称或服务 IP 地址来发现服务。- 这样 Pod 可以轻松地找到并连接到它们需要的服务。
-
安全策略实施:
kube-proxy
可以实施基于网络的安全策略,如网络策略(NetworkPolicy)。- 这些策略定义了 Pod 之间或与外部网络的通信规则。
②特点
-
轻量级:
kube-proxy
是一个轻量级的代理,它在每个节点上运行,占用资源较少。
-
可配置性:
kube-proxy
支持多种配置选项,可以根据需要进行定制。- 用户可以通过命令行参数或配置文件来调整其行为。
-
多模式支持:
kube-proxy
支持多种代理模式,如 iptables 模式和 ipvs 模式。- iptables 模式使用 iptables 规则来实现服务路由和负载均衡。
- ipvs 模式使用内核中的 IP Virtual Server (IPVS) 模块来实现更高效的负载均衡。
-
无状态:
kube-proxy
是无状态的,这意味着它不需要维护任何长期状态信息。- 这使得
kube-proxy
更加简单和可靠。
-
自动同步:
kube-proxy
会自动同步服务和端点的信息,确保最新的网络规则始终生效。
5、3、docker或rocket
容器引擎,运行容器,负责本机的容器创建和管理工作。
6、Kubernetes核心概念
Kubernetes(简称 K8s)的核心概念是构建和管理集群的基础,理解这些概念对于使用 Kubernetes 来部署、管理和扩展应用程序至关重要。
1. Pod
Pod 是 Kubernetes 中最基本的可调度单元。一个 Pod 可以包含一个或多个容器,并共享存储和网络资源。Pod 内部的容器共享相同的 IP 地址和端口空间,因此容器间的通信非常快速。Pod 也是 Kubernetes 中最小的可部署单位,它代表了一个或一组紧密协作的应用程序实例。
2. Service
Service 是一种抽象,它定义了一组 Pod 的逻辑集合以及如何访问它们。Service 为一组 Pod 提供了一个稳定的 IP 地址和 DNS 名称,即使底层的 Pod 发生变化,Service 的 IP 地址和名称仍然是不变的。Service 可以定义为集群内部或外部的访问方式,如 ClusterIP、NodePort 或 LoadBalancer。
3. Deployment
Deployment 是用于描述应用的期望状态的资源对象。它允许用户定义应用的副本数量,并且会管理这些副本的生命周期。Deployment 支持滚动更新、回滚等操作,使得应用程序的部署和升级变得更加容易和可靠。
4. ReplicaSet
ReplicaSet 保证一个应用的副本数量总是保持在一个期望的值。ReplicaSet 通常通过 Deployment 来创建和管理,但它本身也是一个独立的资源对象。ReplicaSet 会监控和管理一组 Pod,确保任何时候都有指定数量的 Pod 处于运行状态。
5. StatefulSet
StatefulSet 是用于管理有状态应用程序的 Deployment 类型。它提供了持久的身份(如名称和持久存储)给 Pod,并支持有序的部署和优雅的终止。
6. DaemonSet
DaemonSet 是一种确保所有(或某些)节点上运行一个 Pod 的副本的对象。通常用于运行集群范围的服务,如日志聚合或监控代理。
7. Job
Job 是一种用来运行一次性的任务的资源对象。Job 控制器会创建一个或多个 Pod,并跟踪它们的成功或失败状态。当指定的 Pod 成功完成时,Job 被视为完成。
8. ConfigMap 和 Secret
ConfigMap 用于存储非机密配置数据,而 Secret 用于存储敏感信息,如密码、OAuth 令牌或 SSH 密钥。它们都用于将配置数据从 Pod 中分离出来,以便于管理。
9. Volume
Volume 是一个目录,它包含持久数据,并且被 Pod 中的一个或多个容器所挂载。Kubernetes 支持多种类型的 Volume,如 EmptyDir、PersistentVolume、HostPath 等。
10. PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)
PersistentVolume 是集群中的存储资源,而 PersistentVolumeClaim 是用户对存储资源的请求。PV 和 PVC 是一对概念,PV 提供存储资源,而 PVC 请求这些资源,并且一旦绑定,就形成了一个持久存储的生命周期。
11. Namespace
Namespace 是 Kubernetes 中的一种逻辑隔离手段,用于将集群中的资源组织成不同的虚拟集群。Namespace 可以用于组织不同的开发团队、环境或项目。
12. NetworkPolicy
NetworkPolicy 是一种安全策略,用于控制 Pod 之间的网络通信。它可以定义允许哪些 Pod 与其它 Pod 通信,从而增强集群的安全性。
13. Ingress
Ingress 是一种资源类型,用于管理进入集群的 HTTP(S) 流量。Ingress 可以提供负载均衡、SSL 终止和名称基于的虚拟主机路由等功能。
五、K8S部署方式
●Minikube
Minikube是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习、预览K8S的一些特性使用。
部署地址:https://kubernetes.io/docs/setup/minikube
●Kubeadmin
Kubeadmin也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相对简单。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
●二进制安装部署
生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8S集群,新手推荐。