### Kubernetes 容器编排工具的优势

- 灵活部署
  - kubernetes 支持在多种平台部署，可在私有云，公有云，混合云，openstack、VMware
  - VSphere, VMware Workstation，虛拟机，物理机等环境部署
- 安全高效，拥有完善的认证授权机制，自带审计功能
  - 可以对多用户做细化的授权管理（如rac 授权），达到相互之问的操作完全隔离，互不影响，而且自身带有审计功能，可以对操作过程进行实时的日志记录，出现问题可以方便排查
- 负载均衡
  - 支持四层、七层负载均衡，可用于多种场景
- 可扩展性强
  - 拥有强大的集群扩展能力，可以根据业务规模自动增加和缩减主机节点的数量，确保服务可以承受大量并发带来的压力，保证业务稳定运行
- 根据节点资源的使用情况对 pod 进行合理的调度
  - 可以按照用户需要调度 pod，例如保证Pod 只在资源足够的节点上运行，会尝试把同一功能的 pod分
    散在不同的节点上，还会尝试平衡不同节点的资源使用率等
- 拥有完善的灾备预警方案
  - 拥有多种灾备解决方案，支持备份和容灾，出现故障可以达到秒级切换，保证线上业务不受影响



### kubernetes功能详解

- 多租户网络隔离
  - ubernetes 支持多种网络插件，如flannel， calico, canel等，每个插件都有独特的性能，可以
    分别适用手多种场景，我们可以利用calico 的network policy(网络策路）解决 k8s中的网络隔
    离，对于多租户场景，可以每一个用户一个名称空间 (namespace），然后对这个名称空间设置
    网络隔离
- 高可用，高可扩展性 
  - kubernetes 中支持多种高可用解决方案，如 keepalive+nginx，keepalived+haproxy 等，可以 使访问流量分发到不同的主机节点，减轻节点压力，如果某个节点出现故障，可以实现秒级切换，达到高可用，保证业务不中断。
- 用户数据的持久化存储 
  - kubernetes 支持多种持久化存储解决方案，保证数据可以得到很好的备份，降低用户数据丢失的风险，kubernetes 中可使用的存储方案如下： 
    -  本地存储：emptyDir，hostPath 
    -  网络连接类存储： 
      -  SAN（存储局域网络）：iSCSI 
      -  NAS（网络附加存储）：nfs，cifs 
      -  分布式存储：glusterfs，ceph-块级别的存储，cephfs-文件系统级别的存储 
      -  云存储：Azure Disk 等 
- 拥有多种更新回滚策略 
  - 通过管理 kubernetes 的控制器和 service 等，可以实现灰度发布，蓝绿部署，金丝雀发布等，达到业务的快速部署和回滚等操作，用以满足不同客户的不同升级需求。 
- 弹性伸缩 
  - 根据访问的流量压力，可以实现 pod 的水平扩容和缩减，达到秒级扩容，让 pod 始终处于满足业务正常运行时所需的数量即可，避免了资源的浪费。 
- 节省资源，优化硬件资源的使用 
  - 根据流量进行业务组件的扩缩容，可节省机器资源。



### K8S架构图

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244687.png)

K8S也是一个C/S结构

1. Apiserver 所有服务的统一入口
2. ControllerManager 维护副本的期望数目
3. scheduler 负责接受任务，选择合适的节点分配任务
4. ETCD 键值对数据库，存储K8S集群的所有重要信息(持久化)
5. Kubelet: 直接和容器引擎(Docker)交互，实现容器的生命周期管理
6. Kube-proxy 负责写入规则至IPTABLES、 IPVS实现服务映射访问



其他插件说明:

1. CoreDNS 可以为集群中的SVC创建一个A记录(域名IP的对应关系解析)
2. Dashboard 给K8S集群提供一个B/S结构访问体系
3. Ingress Controller 官方只能实现四层代理，Ingress可以实现七层代理
4. FEDETATION 提供一个可以跨集群中心多K8S统一管理功能 
5. Prometheus 提供K8S集群的监控能力
6. ELK 提供K8S集群日志统一接入平台



## Apiserver

`Apiserver`为API对象验证和配置数据，这些对象包含`Pod`，`Service`，`ReplicationController`等等。API Server提供REST操作以及前端到集群的共享状态，所有其它组件可以通过这些共享状态交互。

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244652.png)

## Controller

`Controller `保证了在所有时间内，都有特定数量的Pod副本正在运行，如果太多了，`Controller`就杀死几个，如果太少了，`Controller`会新建几个，和直接创建的pod不同的是，`Controller`会替换掉那些删除的或者被终止的pod，不管删除的原因是什么。

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244589.png)

## Scheduler

kubernetes scheduler 作为一个单独的进程部署在 master 节点上，它会监控 kube-apiserver 进程去发现 PodSpec.NodeName 为空的 Pod，然后根据指定的算法将 Pod 调度到合适的 Node 上,这一过程也叫绑定(Bind)。scheduler 的输入是需要被调度的 Pod 和 Node 的信息，输出是经过调度算法筛选出条件最优的 Node，并将该 Pod 绑定到这个 Node 上。

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244708.png)

## Etcd

etcd 是兼具一致性和高可用性的键值数据库，可以作为保存 Kubernetes 所有集群数据的后台数据库。

etcd使用Go语言实现，天生支持集群化，实现分布式键值存储

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244759.png)

etcd 也是采用HTTP Server的 C/S架构的服务,其中:

- Raft  **强一致性算法Raft的具体实现**,保证了Etcd的分布式一致性
- WAL **Write Ahead Log（预写式日志），是etcd的数据存储方式**。除了在内存中存有所有数据的状态以及节点的索引以外，etcd就通过WAL进行持久化存储。WAL中，所有的数据提交前都会事先记录日志。Snapshot是为了防止数据过多而进行的状态快照；Entry表示存储的具体日志内容。
- Store **用于处理etcd支持的各类功能的事务**，包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等，是etcd对用户提供的大多数API功能的具体实现
- HTTP Server **用于处理用户发送的API请求以及其它etcd节点的同步与心跳信息请求。**

## Kubelet

kubelet 的主要功能就是定时从`apiserver`获取节点上 pod/container 的期望状态（运行什么容器、运行的副本数量、网络或者存储如何配置等等），并调用对应的容器平台接口达到这个状态。

主要功能:

1. Pod管理
2. 容器健康检测 kubelet 还要查看容器是否正常运行，如果容器运行出错，就要根据设置的重启策略进行处理
3. 容器监控 向master报告所在节点的资源使用情况

## Kube-proxy

kube-proxy是Kubernetes的核心组件，部署在每个Node节点上，它是实现Kubernetes Service的通信与负载均衡机制的重要组件

### Endpoint, Port和Service的关系

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244655.png)

### 外部请求通过kube-proxy转发

![img](https://figure-bed-1304788733.cos.ap-guangzhou.myqcloud.com/typora/202207042244621.png)





# 简单而言

## 控制平面组件

控制平面的最近对集群做出全局策略以及检测和响应集群事件。控制平面可以在集群中的任何节点上运行，通常为了简化操作会把所有控制平面组件运行在主节点（非工作节点）



### kube-apiserver

API 服务。主节点负责提供 k8s PAI 服务组件，是 k8s 控制平面的前段。可以通过部署多个实例可以实现扩展缩容



### etcd

etcd 是具有一致性和高可用行的键值对数据库，保存 k8s 所有集群数据的后台数据库



### kube-scheduler

调度器。主节点上的组件，该组件监视新创建未指定运行节点的 Pod，并选择运行 Pod 节点

调度器调度决策考虑因素包括：

- 单个 Pod 和 Pod 集合的资源需求
- 硬件/软件/策略约束
- 亲和性和反亲和性
- 数据位置
- 工作负载的干扰和最后时限



### kube-controller-manager

控制管理器。在节点上运行的控制器组件，每个控制器都是一个单独的进程，但为了降低复杂性都被编译到同一个可执行文件，并在一个进程中运行

这控制性包括：

- 节点控制器（Node Controller）：复制在节点出现故障时进行通知和响应
- 副本控制器（Replication Controller）：复制系统中的每个副本控制器对象维护指定数量的 Pod
- 端点控制器（Endpoints Controller）：填充端点（ `Endpoins` 对象）即 Service 和 Pod
- 服务帐户和令牌控制器（Service Account 和 Token Controoler）：为新的名称空间创建默认的服务帐户和 API 访问令牌



### Cloud-controller-manager

云控制管理器。运行基于云供应商提供的商业交互控制器，它是一个二进制文件，是从 k8s:1.6-alpha 引入的：

- 进运行云供应商特定的控制器循环。必须在控制管理器（kube-controller-manager） 中禁用这些控制器循环（ `kube-controller-manager ----cloud-provider=external` ）
- 可以和 k8s 代码独立发展，在之前的版本中，核心的 k8s 代码依赖于特定的云提供商，将来是由云提供商自行维护自己的云控制管理器，并与 k8s 的云控制管理器相关联

以下控制器有对云提供商依赖：

- 节点控制器（Node Controller）：检查云提供商以确定阶段是否在运行中，停止响应后被删除
- 路由控制器（Route Controller）：底层云基础构建中设置路由
- 服务控制器（Service Controller）：创建、更新、删除云提供商负载均衡器
- 存储卷控制器（volume Controller）：创建、附加、挂载存储卷并与提供商进行交互



## 节点组件

节点组件在每个节点上运行，维护运行的 Pod 并提供 k8s 运行环境



### Kubelet

一个集群中每个节点运行的代理，它保证 k8s 创建的容器都运行在 Pod 中（不是 k8s 创建的容器不会管理）

kubelet 接收一组通过各类机制提供给他的 PodSpec，确保这些 PodSpecs 中描述的容器处于运行状态且健康



### kube-proxy

网络代理。kube-proxy 是集群中每个节点上运行的网络代理，实现 k8s Service 概念的一部分。它维护节点上的网络规则，这些规则允许从集群内部或外部的网络会话和 Pod 进行通信

如果操作系统提供了数据包过滤层并可用的话，kube-proxy 会通过它来实现网络规则，否则仅仅转发流量本身



### 容器运行环境

复制运行容器的环境，通常是 docker。k8s 支持多个容器运行环境：

- docker
- containerd
- cri-o
- rktlet
- k8s CRI (容器运行环境接口)



## 插件

插件使用 k8s 资源实现集群功能，由于这些功能是集群级别的，因此这些插件通常都属于 `kube-system` 名称空间



### DNS

这里指的是集群 DNS ，为 k8s 提供 DNS 记录。可以和部署环境中的 DNS 服务一起运行。k8s 启动的容器会自动将集群 DNS 服务器包含在 DNS 搜索中



### Dashboard

Dashboard 是 k8s 集群的用户界面（基于 web 的 UI 界面）。可以管理集群中运行的应用程序以及集群本身运行并进行故障排除



### 容器资源监控

容器资源监控将关于容器一些常见的时间序列度量值保存到一个集群的数据库中，并提供用于查看这些数据的界面



### 集群层面日志

集群层面日志机制负责将容器的日志数据保存到一个集中的日志存储中，该存储能够提供用于搜索和浏览的接口





**<font color='red'>这个为刚接触的k8s笔记，搭建或者注意事项在第二份k8s笔记中，包含搭建过程</font>**