控制器

This commit is contained in:
huanqing.shao
2019-10-07 11:14:15 +08:00
parent 4a734e308a
commit a39eff128c
5 changed files with 76 additions and 8 deletions

View File

@ -242,7 +242,7 @@ module.exports = {
{
title: '节点',
collapsable: true,
path: '/learning/k8s-bg/architecture/nodes',
// path: '/learning/k8s-bg/architecture/nodes',
children: [
'k8s-bg/architecture/nodes',
'k8s-bg/architecture/nodes-mgmt',
@ -251,13 +251,14 @@ module.exports = {
{
title: '集群内的通信',
collapsable: true,
path: '/learning/k8s-bg/architecture/com',
// path: '/learning/k8s-bg/architecture/com',
children: [
'k8s-bg/architecture/com',
'k8s-bg/architecture/com-n-m',
'k8s-bg/architecture/com-m-n',
]
},
'k8s-bg/architecture/controller',
]
},
{

View File

@ -61,6 +61,7 @@ Kubernetes教程的主要依据是Kubernetes 官网文档,以及使用 Kubo
* 架构
* <a href="https://kuboard.cn/learning/k8s-bg/architecture/nodes.html">节点</a>
* <a href="https://kuboard.cn/learning/k8s-bg/architecture/com.html">集群内通信</a>
* <a href="https://kuboard.cn/learning/k8s-bg/architecture/controller.html">控制器</a>
* 工作负载
* <a href="https://kuboard.cn/learning/k8s-intermediate/workload/pod.html">容器组 - 概述</a>
* <a href="https://kuboard.cn/learning/k8s-intermediate/workload/pod-lifecycle.html">容器组 - 生命周期</a>

View File

@ -48,6 +48,7 @@ meta:
* 架构
* [节点](/learning/k8s-bg/architecture/nodes.html)
* [集群内通信](/learning/k8s-bg/architecture/com.html)
* [控制器](/learning/k8s-bg/architecture/controller.html)
* 工作负载
* [容器组 - 概述](/learning/k8s-intermediate/workload/pod.html)
* [容器组 - 生命周期](/learning/k8s-intermediate/workload/pod-lifecycle.html)

View File

@ -0,0 +1,64 @@
---
vssueId: 121
layout: LearningLayout
description: Kubernete教程_Kubernetes控制器_在机器人技术和自动化技术中控制循环是一个控制系统状态的无限循环。控制循环的例子有房间里的恒温器。在恒温器上设定好目标温度就是告诉该控制循环你想要的目标状态。房间里的实际温度是当前状态恒温器通过打卡或关闭加热装置不断地使当前状态接近于目标状态
meta:
- name: keywords
content: Kubernetes 教程,Kubernetes Master-Node通信
---
# 控制器
在机器人技术和自动化技术中,**控制循环** 是一个控制系统状态的无限循环。房间里的恒温器就是**控制循环**的一个例子
* 在恒温器上设定好目标温度,就是在告诉该 **控制循环** 你想要的 ***目标状态***。
* 房间里的实际温度,是 ***当前状态***
* 恒温器通过打卡或关闭加热装置,不断地使 ***当前状态*** 接近于 ***目标状态***
在 Kubernetes 中,**控制器** 就是上面所说的 **控制循环**,它不断监控着集群的状态,并对集群做出对应的变更调整。每一个控制器都不断地尝试着将 ***当前状态*** 调整到 ***目标状态***。
## 控制器模式
在 Kubernetes 中,每个控制器至少追踪一种类型的资源。这些资源对象中有一个 `spec` 字段代表了目标状态。资源对象对应的控制器负责不断地将当前状态调整到目标状态。
理论上控制器可以自己直接执行调整动作然而在Kubernetes 中,更普遍的做法是,控制器发送消息到 API Server而不是直接自己执行调整动作。
### 通过APIServer进行控制
以 Kubernetes 中自带的一个控制器 Job Controller 为例。KUbernetes 自带的控制器都是通过与集群中 API Server 交互来达到调整状态的目的。
Job 是一种 Kubernetes API 对象,一个 Job 将运行一个或多个Pod执行一项任务然后停止。当新的 Job 对象被创建时Job Controller 将确保集群中有合适数量的节点上的 kubelet 启动了指定个数的 Pod以完成 Job 的执行任务。Job Controller 自己并不执行任何 Pod 或容器,而是发消息给 API Server由其他的控制组件配合 API Server以执行创建或删除 Pod 的实际动作。
当新的 Job 对象被创建时目标状态是指定的任务被执行完成。Job Controller 调整集群的当前状态以达到目标状态:创建 Pod 以执行 Job 中指定的任务
控制器同样也会更新其关注的 API 对象。例如:一旦 Job 的任务执行结束Job Controller 将更新 Job 的 API 对象,将其标注为 `Finished`。(这有点儿像是恒温器将指示灯关闭,以表示房间里的温度已经到达指定温度。)
### 直接控制
某些特殊的控制器需要对集群外部的东西做调整。例如,您想用一个控制器确保集群中有足够的节点,此时控制器需要调用云供应商的接口以创建新的节点或移除旧的节点。这类控制器将从 API Server 中读取关于目标状态的信息,并直接调用外部接口以实现调整目标。
Kubernetes中真的提供了一个控制器可以水平伸缩集群中的节点。请参考 [Cluster autoscaling](https://kubernetes.io/docs/tasks/administer-cluster/cluster-management/#cluster-autoscaling)
## 目标状态 vs 当前状态
Kubernetes 使用了 `云原生`cloud-native的视角来看待系统并且可以持续应对变化。您的集群在运行的过程中任何时候都有可能发生突发事件而控制器则自动地修正这些问题。这就意味着本质上您的集群永远不会达到一个稳定不变的状态。
这种通过控制器监控集群状态并利用负反馈原理不断接近目标状态的系统,相较于那种完成安装后就不再改变的系统,是一种更高级的系统形态,尤其是在您将运行一个大规模的复杂集群的情况下。
## 设计
作为一个底层设计原则Kubernetes使用了大量的控制器每个控制器都用来管理集群状态的某一个方面。普遍来说任何一个特定的控制器都使用一种 API 对象作为其目标状态,并使用和管理多种类型的资源,以达到目标状态。
使用许多个简单的控制器比使用一个全能的控制器要更加有优势。控制器可能会出故障,而这也是在设计 Kubernetes 时要考虑到的事情。
::: tip
可能存在多种控制器可以创建或更新相同类型的 API 对象。为了避免混淆Kubernetes 控制器在创建新的 API 对象时,会将该对象与对应的控制 API 对象关联,并且只关注与控制对象关联的那些对象。
* 例如Deployment 和 Job这两类控制器都创建 Pod。Job Controller 不会删除 Deployment Controller 创建的 Pod因为控制器可以通过标签信息区分哪些 Pod 是它创建的。
:::
<!--FIXME 标签 的链接-->
## 运行控制器的方式
Kubernetes 在 kube-controller-manager 中运行了大量的内建控制器例如Deployment Controller、Job Controller、StatefulSet Controller、DaemonSet Controller 等)。这些内建控制器提供了 Kubernetes 非常重要的核心功能。Kubernetes 可以运行一个 master 集群,以实现内建控制器的高可用。
您也可以安装一些运行在 kube-controller-manager 之外的控制器,这些控制器通常是对 Kubernetes 已有功能的一些扩展。或者,在必要的情况下,您也可以自己编写自己需要的控制器,将其部署为一组 Pod或者在 Kubernetes 集群之外部署。如何选择,取决于您想要用这个控制器做什么。参考 [Extending your Kubernetes Cluster](https://kubernetes.io/docs/concepts/extend-kubernetes/extend-cluster/)

View File

@ -27,8 +27,9 @@ Kuboard 官网地址:[https://kuboard.cn](https://kuboard.cn/#from_coder_touti
Kuboard 发布不到两个月时间github star 已经迅速增长到 422获得了许多用户的喜爱。
![./image-20191003230417140](share-coder.assets/image-20191003230417140.png)
<p style="max-width: 720px;">
<img src="./share-coder.assets/image-20191003230417140.png" alt="Kubernetes 教程" style="max-width: 100%"></img>
</p>
## 安装Kuboard
@ -51,7 +52,7 @@ Kuboard 通过三层界面来管理 Kubernetes 以及部署在其上的微服务
Kuboard 中查看集群概览的界面如下图所示,下层由 Kubernetes 的计算资源和存储资源组成,上层则是应用的名称空间。
![image-20191002073039330](./share-coder.assets/image-20191002073039330.png)
![Kubernetes 教程](./share-coder.assets/image-20191002073039330.png)
2. 名称空间层
@ -59,7 +60,7 @@ Kuboard 通过三层界面来管理 Kubernetes 以及部署在其上的微服务
这里比较特殊的一点是Kuboard 以分层的方式展现微服务架构的经典分层包括展现层、API网关层、微服务层、持久层、中间件层和监控层。
![image-20191002073210761](./share-coder.assets/image-20191002073210761.png)
![Kubernetes 教程](./share-coder.assets/image-20191002073210761.png)
3. 工作负载层
@ -67,7 +68,7 @@ Kuboard 通过三层界面来管理 Kubernetes 以及部署在其上的微服务
在 Kuboard 工作负载编辑器里,可以通过图形界面完成应用的部署和管理、伸缩、卸载等操作,而无需编写复杂的 yaml 文件。
![image-20191002073245932](./share-coder.assets/image-20191002073245932.png)
![Kubernetes 教程](./share-coder.assets/image-20191002073245932.png)
@ -164,4 +165,4 @@ Kuboard 通过三层界面来管理 Kubernetes 以及部署在其上的微服务
* 多环境
* 导出部署配置
* 导入部署配置
* 导入部署配置