diff --git a/docs/deploy/k8s/controller.md b/docs/deploy/k8s/controller.md new file mode 100644 index 0000000..58722ef --- /dev/null +++ b/docs/deploy/k8s/controller.md @@ -0,0 +1,118 @@ +--- +title: Controller of k8s +authors: + - lkzwc + - name: lkzwc + title: lkzwc + url: https://github.com/JoelMarcey + image_url: https://github.com/JoelMarcey.png +tags: [hello, docusaurus-v2] +description: k8s中的Controller +image: https://i.imgur.com/mErPwqL.png +hide_table_of_contents: false +--- + +## 概述 + +声明式处理,不断使系统的Status无限趋近Spec + +![image](https://user-images.githubusercontent.com/84896877/221155504-3118e0b6-8d01-45b8-9f26-16519ac7cc65.png) + +- ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能 + +- Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC(ReplicationController)的作用。 + +- DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现统级后台任务。比如日志采集(loki)服务、监控服务(promethues)特性:服务是无状态的,服务必须是守护进程 + +- StatefulSet:管理有状态应用 + +- Job:只要完成就立即退出,不需要重启或重建 + +- Cronjob:周期性任务控制,不需要持续后台运行 + + + +## 有状态无状态 + +> 具有先后关系顺序或者主从关系 + +## 负载资源(Workload) + +- 何为工作负载 ?k8s上运行的应用程序 + +- 负载资源?管理PODS资源确保处于运行的Pod正确 + +### Deployment + +> 最常用的控制器,用来管理部署无状态应用 + +* 无状态应用 + +* 升级,滚动,更新 + +* 扩缩容 + + +* **_具体负责管理的是 ReplicaSet,核心【Replicas】期望的终态数量来管理具体的 Pod_** + +* 更新策略: + rollingupdate:滚动更新 + recreate: 开始更新时,先进行删除再创建 + +### ReplicaSet + +* 确保pod数量 +* 确保pod健康 +* 弹性伸缩,滚动升级 + +### StateFulSets + + +* 管理有状态应用的部署和扩缩,有***顺序启停*** + +* 并提供***持久存储***,删除POD不会删除数据 + +* 与Deployment区别之处是提供了一个***固定的ID***(挂掉后拉起ID不变) + +特性: + +- POD启动带顺序,第一个无法启动后续也无法启动 + +- 数据安全,删除POD不会删库 + +- 使用headless services + + + +### DaemonSet + +> 确保节点上运行一个POD + +* 保证集群每个节点已运行一组相同的Pod + +* 跟踪集群节点状态,保证移除节点删除对应的POD、保证Pod处于运行状态 + +* 不同之处主要在于对节点信息也进行监控 + +### Jobs + +* 创建一个或者多个pods + +* 跟踪Pod状态,重试失败Pod + +* 依赖关系 + +* 运行成功之后就退出,非持续性服务 + + +### CornJob + +* 创建可重复调度的Jobs(schedule\startinDeadingSeconds\concurrencyPolicy是否并行successFulJobsHistoryListmit留存历史格式) + +### ReplicationController + +* 确保一个Pod或者一组同类的Pod是可用的 + + + + diff --git a/docs/deploy/k8s/deployment.md b/docs/deploy/k8s/deployment.md deleted file mode 100644 index c6bee6f..0000000 --- a/docs/deploy/k8s/deployment.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -slug: /deployment -title: Deployment ---- - -> 最常用的控制器,用来管理部署无状态应用 - -1. 无状态应用 - -2. 升级,滚动,更新 - -3. 扩缩容 - -4. Pod 之上的抽象层 - 定义一组 Pod 的副本 - 通过 controller 维持 Pod 的数目 - 通过控制器控制版本 - -5. **_具体负责管理的是 ReplicaSet,而 ReplicaSet 去管理具体的 Pod_** - -6. 更新策略: - rollingupdate:滚动更新 - recreate: 开始更新时,先进行删除再创建 - -核心【Replicas】期望的终态数量 - -## replicaset - -* 确保pod数量 -* 确保pod健康 -* 弹性伸缩,滚动升级 - diff --git a/docs/deploy/k8s/k8s.md b/docs/deploy/k8s/k8s.md index 6189502..b8f51b3 100644 --- a/docs/deploy/k8s/k8s.md +++ b/docs/deploy/k8s/k8s.md @@ -150,24 +150,6 @@ MetaData annotations、 扩展存储非标识性信息、OwnerReference、集合类资源 -### 控制器 - -声明式处理,不断使系统的Status无限趋近Spec - -![image](https://user-images.githubusercontent.com/84896877/221155504-3118e0b6-8d01-45b8-9f26-16519ac7cc65.png) - -- ReplicaSet: 代用户创建指定数量的pod副本,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能 - -- Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。ReplicaSet 与Deployment 这两个资源对象逐步替换之前RC的作用。 - -- DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现统级后台任务。比如日志采集(loki)服务、监控服务(promethues)特性:服务是无状态的,服务必须是守护进程 - -- StatefulSet:管理有状态应用 - -- Job:只要完成就立即退出,不需要重启或重建 - -- Cronjob:周期性任务控制,不需要持续后台运行 - ### 调度 - 如 果更具POD需求找到满足的Node,称之为可调度节点,如果没有找到,则状态一直停留为未调度状态 @@ -200,94 +182,8 @@ annotations、 扩展存储非标识性信息、OwnerReference、集合类资源 - 达到消耗水平的临界值,kubelet使节点失效,包括软硬驱逐 -### 有状态无状态 - -> 具有先后关系顺序或者主从关系 - -### 负载资源(Workload) - -- 何为工作负载 ?k8s上运行的应用程序 - -- 负载资源?管理PODS资源确保处于运行的Pod正确 - -#### Deployment - -管理部署发布的控制器<持续服务> - -4. 无状态应用 - -5. 升级,滚动,更新 - -6. 扩缩容 - -7. Pod之上的抽象层 -定义一组Pod的副本 -通过controller维持Pod的数目 -通过控制器控制版本 - -8. ***具体负责管理ReplicaSet,而ReplicaSet去管理具体的Pod*** - - 核心【Replicas】期望的终态数量 - -#### ReplicaSet - -9. 维护一组稳定运行状态的Pod副本集合,通过Deployment参数revisionHistoryLimit设置副本数量 具体执行Deployment的操作 - -- POD 健康 - -- POD数量 - -#### StateFulSets - -<持续服务> 热备冗灾主从关系应用 - -10. 管理pod的部署和扩缩,有***顺序启停*** - -11. 并提供***持久存储***,删除POD不会删除数据 - -12. 与Deployment区别之处是提供了一个***固定的ID***(挂掉后拉起ID不变) - -特性: - -- POD启动带顺序,第一个无法启动后续也无法启动 - -- 数据安全,删除POD不会删库 - -- 使用headless services - -#### DaemonSet - -<持续服务> - -13. 保证集群每个节点已运行一组相同的Pod - -14. 跟踪集群节点状态,保证移除节点删除对应的POD、保证Pod处于运行状态 - -15. 不同之处主要在于对节点信息也进行监控 - -#### Jobs - -16. 创建一个或者多个pods - -17. 跟踪Pod状态,重试失败Pod - -18. 依赖关系 - -19. 运行成功之后就退出,非持续性服务 - -#### 垃圾收集 - -20. 删除不在拥有属主的对象 - -#### CornJob - -21. 创建可重复调度的Jobs(schedule\startinDeadingSeconds\concurrencyPolicy是否并行successFulJobsHistoryListmit留存历史格式) - -#### ReplicationController - -22. 确保一个Pod或者一组同类的Pod是可用的 ### 弹性伸缩 @@ -299,16 +195,19 @@ k8s默认提供的弹性伸缩组件,主要VPA、HPA伸缩分类: - 垂直伸缩 (VPA)【根据容器资源使用率自动设置CPU以及内存】 - > VPA定期查看pod资源使用情况, 主要从metric server中采集数据,需要重启pod,如果计算超过node可用资源,将导致pod一直pedding + >AddonResizer + + ```Plain Text + AddonResizer是一种VPA即垂直POD自动扩缩容,根据集群规格、画像策略自动设置CPU、内存的Request,从而允许在节点上进行适当的调度 + ``` -```Plain Text -AddonResizer是一种VPA即垂直POD自动扩缩容,根据集群规格、画像策略自动设置CPU、内存的Request -``` + > VPA定期查看pod资源使用情况, 主要从metric server中采集数据,需要重启pod,如果计算超过node可用资源,将导致pod一直pedding - 水平伸缩(HPA) + > Cron HPA、 MetricHPA - > 根据cpu的使用率自动缩放 replication 控制器,deployment,副本集或状态集中的 pod 数量 + > 根据cpu和memory的使用率自动缩放 replication 控制器,deployment,副本集或状态集中的 pod 数量 #### 节点伸缩 @@ -321,15 +220,7 @@ AddonResizer是一种VPA即垂直POD自动扩缩容,根据集群规格、画像 > 具体有厂商提供,主机是否支持升降配,考虑过程中主机是否需要进行重启(节点驱逐) -### 监控(Metrics-server) - -> 资源 -性能 - -安全 - -事件 ### TIPS单位 @@ -339,337 +230,3 @@ cpu:“30”表示30个core,100m表示0.1个core云原生架构 -<<<<<<< HEAD -## 云原生 - -软件系统生在云上,长在云上,利用云的资源敏捷,可扩展 - -- 不可变基础设施 - - 1. 自包含、可定制镜像 - - 2. 快速部署和隔离 - - 3. 自动化管理创建销毁 - - 4. 可复制的管控系统与支撑组件 - -- 云编排(Docker) - - - -## 容器 - -视图隔离、资源可限制、独立文件系统的进程集合。是一个单进程模型。原子调度单位。 - -> 单进程模型 - -比如有一个进程组 hello,在这个进程组里边还有 4 个进程,由于容器是单进程模型,所以 k8s 会启动 4 个容器,每个容器里 边运行一个进程,而整个进程组是有 Pod 由管理,启动 hello,会启动 4 个容器,共享一定的资源,定义在一个 Pod 中 - -> 隔离 -提供独立的运行环境 - -- Linux 提供 chroot 使文件系统隔离 - -- 资源视图 namespace(网络资源...) - -- 资源使用率 cgroup[systemd、cgroupfs 两种驱动方式 ] - -> 镜像 运行容器所需要的文件集合 - -- dockerFile - -- 分层可复用 changeset - -- build once run anywhere - -> 生命周期 - -- init 进程=容器生命周期 - -- 数据卷 docker volume - - `docker run -v demo to` - - `docker create volume demo` - -> 容器 VM - -- 是否具有单独的内核 - -- 是否进程级别的隔离 - -![image](https://user-images.githubusercontent.com/84896877/221467124-3259047b-c8ba-40f6-ac0a-3bc3af499383.png) - -## kubernetes - -支持自动化部署、大规模可伸缩、应用容器化管理。在 k8s 中,我们可以创建多个容器,每个容器运行一个实例,然后通过内置的负载均衡策略,实现对者一组应用实例的管理、发现、访问、扩展、自愈等等 - -- 服务发现负载均衡 - -- 存储编排 - -- 自动部署修复 迁移 - -- 水平伸缩 负载均衡 - -### 架构 - -![image](https://user-images.githubusercontent.com/84896877/221155119-33a24dbf-d00e-48db-8133-2a96d55da973.png) - -- Master 负责管理整个容器,通过暴露出来的 API Server 和 Node 通信 - -- 每个业务负载以 Pod 形式运行,一个 pod 中运行一个或者多个容器,真正运行的是 Node 上的 kubelet 通过 APIServer 将状态提交到 container runtime 上,将容器运行 - -- Node 上的组件(Container Runtime\Storage plugin\Network plugin\kube-proxy[跨集群访问]) - -![image](https://user-images.githubusercontent.com/84896877/221154809-78671316-a63f-4f29-bd9a-8279f84c4bf9.png) - -POD 创建工作流 - -![image](https://user-images.githubusercontent.com/84896877/221155215-9f0150d9-4f05-46f2-b14f-8417759c3c25.png) - -### Node - -K8S 通过将容器放入节点上运行 POD 来执行具体的工作负载,节点可以是一个虚拟或者物理机 - -向 API 服务器添加节点的方式:1.节点上的 kublet 向控制面自注册 2.手动添加 Node 对象 - -![image](https://user-images.githubusercontent.com/84896877/221155288-8cd1aca2-910d-4880-acfe-c670284131f2.png) - -### Pod - -最小的调度以及资源单元,包括一个或者多个容器。 - -由于不能将多个进程聚集在一个单独容器,需要另外一种高级结构将容器绑定在一起,作为一个单元管理,这就是 Pod 背后根本原理 - -一个 pod 的共享上下文包括一组 linux 名字空间、控制组和 kennel 一些其他的隔离的技术,共享相同 ip 和端口空间 - -![image](https://user-images.githubusercontent.com/84896877/221155339-f4adbac1-c128-4d31-b168-77db6bd5f0a0.png) - -定义容器运行的方式 -提供给容器共享的运行环境 - -1. 共享网络:Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行,具有一个 IP 地址,通过 Infra Container 方式共享一个 NetWork Namespace. - -2. 共享存储:申明同一个 volumes - -3. InitContainer:容器启动之前启动 => sideCar 抽离出来一个单独的容器,执行业务的辅助工作(代理、Adapt) - -### volume - -申明 pod 可访问的文件目录 -挂载在一个或者多个容器指定路径下 -支持分布式远程云盘 - -### Service - -提供访问一个或者多个 Pod 的访问地址 - -### Namespace - -一个集群内部的逻辑隔离 -同一个 NameSpace 资源命名唯一 - -### Headless Service 和普通 Service - -类似负载均衡的中间件,而 headless 是干掉中间转发件之后的,其 Cluster IP 为 None - -### 资源对象 - -> Spec 期望的状态 - -Status 观测到的状态 - -MetaData - -> labels、 - -annotations、 扩展存储非标识性信息、OwnerReference、集合类资源 - -### 控制器 - -声明式处理,不断使系统的 Status 无限趋近 Spec - -![image](https://user-images.githubusercontent.com/84896877/221155504-3118e0b6-8d01-45b8-9f26-16519ac7cc65.png) - -- ReplicaSet: 代用户创建指定数量的 pod 副本,确保 pod 副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能 - -- Deployment:工作在 ReplicaSet 之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。ReplicaSet 与 Deployment 这两个资源对象逐步替换之前 RC 的作用。 - -- DaemonSet:用于确保集群中的每一个节点只运行特定的 pod 副本,通常用于实现统级后台任务。比如日志采集(loki)服务、监控服务(promethues)特性:服务是无状态的,服务必须是守护进程 - -- StatefulSet:管理有状态应用 - -- Job:只要完成就立即退出,不需要重启或重建 - -- Cronjob:周期性任务控制,不需要持续后台运行 - -### 调度 - -- 如 果更具 POD 需求找到满足的 Node,称之为可调度节点,如果没有找到,则状态一直停留为未调度状态 - -- 调度器负责寻找可调度节点,通过 watch 手段发现集群中存在且尚未调度的节点上的 POD,更具一系列的函数规则打分,先择最高的,并将调度决定通知 kube-apiserver - -> NodeSelector - -- 首先需要在 nodes 里边添加 label - -- 在 Pod 的中的 Spec 部分添加 NodeSelector 部分 - -> 亲和性和非亲和性(包括 Node 和 Pod) - -- 包括软硬需求,在 Pod 中通过 PodSpec 的 affinity 下的 nodeAffinity 指定【matchExpression】 - -> Taints 污点-排斥某类型的 POD - -- 应用在 Pod 上允许单是并不要求(如果设置 Effect 为 NoExecue)则不能容忍 - -> nodeName - -- 应用在 Pod 上,需要在 Pod 的 Spec 下边配置 nodeName - -> Pod 优先级-PriorityClass - -- 如果没有找到满足 pod 指定的所有要求的的节点,则触发抢占 - -> 压力驱逐 - -- 达到消耗水平的临界值,kubelet 使节点失效,包括软硬驱逐 - -### 有状态无状态 - -> 具有先后关系顺序或者主从关系 - -### 负载资源(Workload) - -- 何为工作负载 ?k8s 上运行的应用程序 - -- 负载资源?管理 PODS 资源确保处于运行的 Pod 正确 - -#### Deployment - -管理部署发布的控制器<持续服务> - -4. 无状态应用 - -5. 升级,滚动,更新 - -6. 扩缩容 - -7. Pod 之上的抽象层 - 定义一组 Pod 的副本 - 通过 controller 维持 Pod 的数目 - 通过控制器控制版本 - -8. **_具体负责管理 ReplicaSet,而 ReplicaSet 去管理具体的 Pod_** - -核心【Replicas】期望的终态数量 - -#### ReplicaSet - -9. 维护一组稳定运行状态的 Pod 副本集合,通过 Deployment 参数 revisionHistoryLimit 设置副本数量 具体执行 Deployment 的操作 - -- POD 健康 - -- POD 数量 - -#### StateFulSets - -<持续服务> 热备冗灾主从关系应用 - -10. 管理 pod 的部署和扩缩,有**_顺序启停_** - -11. 并提供**_持久存储_**,删除 POD 不会删除数据 - -12. 与 Deployment 区别之处是提供了一个**_固定的 ID_**(挂掉后拉起 ID 不变) - -特性: - -- POD 启动带顺序,第一个无法启动后续也无法启动 - -- 数据安全,删除 POD 不会删库 - -- 使用 headless services - -#### DaemonSet - -<持续服务> - -13. 保证集群每个节点已运行一组相同的 Pod - -14. 跟踪集群节点状态,保证移除节点删除对应的 POD、保证 Pod 处于运行状态 - -15. 不同之处主要在于对节点信息也进行监控 - -#### Jobs - -16. 创建一个或者多个 pods - -17. 跟踪 Pod 状态,重试失败 Pod - -18. 依赖关系 - -19. 运行成功之后就退出,非持续性服务 - -#### 垃圾收集 - -20. 删除不在拥有属主的对象 - -#### CornJob - -21. 创建可重复调度的 Jobs(schedule\startinDeadingSeconds\concurrencyPolicy 是否并行 successFulJobsHistoryListmit 留存历史格式) - -#### ReplicationController - -22. 确保一个 Pod 或者一组同类的 Pod 是可用的 - -### 弹性伸缩 - -k8s 默认提供的弹性伸缩组件,主要 VPA、HPA 伸缩分类: - -#### 服务伸缩 - -(立即执行、定时伸缩、预测性伸缩(后两种暂无成熟方案)) - -- 垂直伸缩 (VPA)【根据容器资源使用率自动设置 CPU 以及内存】 - - > VPA 定期查看 pod 资源使用情况, 主要从 metric server 中采集数据,需要重启 pod,如果计算超过 node 可用资源,将导致 pod 一直 pedding - -```Plain Text -AddonResizer是一种VPA即垂直POD自动扩缩容,根据集群规格、画像策略自动设置CPU、内存的Request -``` - -- 水平伸缩(HPA) - - > 根据 cpu 的使用率自动缩放 replication 控制器,deployment,副本集或状态集中的 pod 数量 - -AddonResizer 周期性查看集群系欸但数量,计算 pod 需要的内存 CPU,如果低于或者高于阈值,则会修改 deployment 触发生成新的 pod - -#### 节点伸缩 - -- 水平伸缩 - - > CA 节点水平伸缩能否成功实施,与调度策略密切相关。kubernetes 在为 pod 选择可分配节点时, - > 是采用 LeastRequestedPriority 策略,简单来说就是就是尽可能把资源打散,把 pod 分配到资源利用率低的节点。这样会倒是有一批利用率较低,但未到缩容阈值的节点,因此会导致无法成功缩容,资源利用率低 - -- 垂直伸缩 - - > 具体有厂商提供,主机是否支持升降配,考虑过程中主机是否需要进行重启(节点驱逐) - -### 监控(Metrics-server) - -> 资源 - -性能 - -安全 - -事件 - -### TIPS 单位 - -cpu:“30”表示 30 个 core,100m 表示 0.1 个 core 云原生架构 - -![https://i.loli.net/2021/08/02/L54aswkJr7epBIy.png](https://i.loli.net/2021/08/02/L54aswkJr7epBIy.png) -======= ->>>>>>> 600e1978ff019d85432ac2fdfa6a89ae0c9504ad diff --git a/docs/deploy/k8s/service.md b/docs/deploy/k8s/service.md index 261c07c..f1a156f 100644 --- a/docs/deploy/k8s/service.md +++ b/docs/deploy/k8s/service.md @@ -15,6 +15,53 @@ hide_table_of_contents: false ## Service > 将一组POD通过一个IP暴露出来 + ![image](https://github.com/lkzwc/fe-ddu/assets/84896877/d048d706-3c46-4fb3-b2d5-00c3fe327b21) + + + + ### ClusterIP ``` - kubectl expose deploy my-dep --port=8000 --target-port=80. //暴露mydep 创建的pod - ``` \ No newline at end of file + kubectl expose deploy my-dep --port=8000 --target-port=80 //暴露mydep 创建的pod + +// 两种方式 +serviceIP:8000 +service域名:8000 服务名.所在名称空间.svc + ``` + + ### NodePort + +``` + kubectl expose deploy my-dep --port=8000 --target-port=80 --type=NodePort +``` +![image](https://github.com/lkzwc/fe-ddu/assets/84896877/9940e9f0-0dbe-40ee-b5d9-02688ec0d741) + + > 节点端口 ,集群外部访问 + + ## Ingress + +![image](https://github.com/lkzwc/fe-ddu/assets/84896877/fa745381-5475-4c0b-849e-f76a8fb25eba) +### Ingress 路由配置文件 + +主要是进行路由的配置 +``` +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: nginx-app-ingress + namespace: test + annotations: +spec: + ingressClassName: nginx + rules: + - host: test.k8s.com + http: + paths: + - path: / + backend: + serviceName: nginx-app-svc + servicePort: 80 +``` + +### Ingress Controller + +如图中的Ingress-nginx. 主要是对流量进行分发