K8S基础
# K8S的基础知识
## 什么是K8S
> Kubernetes 简称 k8s。是用于**自动部署,扩展和管理容器化应用**程序的开源系统。
>[中文官网](https://kubernetes.io/zh/) [中文社区](https://www.kubernetes.org.cn/) [**官方文档**](https://kubernetes.io/zh/docs/home/) [社区文档](http://docs.kubernetes.org.cn/)
# K8S的概述
[**官方概述**](https://kubernetes.io/zh-cn/docs/concepts/overview/)
## 对文档知识的补充
### 为什么虚拟部署时代不好?
> 因为在虚拟部署时代, 每一个虚拟机都需要将计算机所有的东西都虚拟化出来, 但是, 应用不一定需要这些资源, 这会导致虚拟机虚拟化出来的资源没用了, 这就会导致资源的浪费
> 而且虚拟机因为虚拟化太多的资源了, 开机速度很慢, 对于部署大量应用和部署集群的场景非常的不友好, 因此虚拟化部署还是不够好
### 容器化部署有什么缺点?
> **容器化部署最大的缺点是不好管理, 当我们创建了数百个容器的时候, 如果我们手动维护docker中的容器, 那么会及其的不方便, 一方面的没有可视化界面, 不直观知道哪些容器有问题, 另一个方面用指令维护容器很困难**
## Swarm Mode原生管理的优缺
![image.png](https://cos.easydoc.net/13568421/files/lmwrbync.png)
> 缺点: 这个容器管理化技术仅支持docker容器, 不支持其他容器, 可扩展性很差
> 容器的功能也比较简单有限
> 能够对docker容器进行容灾快速恢复和容器的批量管理
## K8S特性
![image.png](https://cos.easydoc.net/13568421/files/lmwrcmk4)
## K8S的架构
[**其他需要参考的官方文档**](https://kubernetes.io/zh-cn/docs/concepts/overview/components/)
### 基于主从模式的架构
![image.png](https://cos.easydoc.net/13568421/files/lmwrf7nc.png)
![image.png](https://cos.easydoc.net/13568421/files/lmwrggp4)
### 主节点
![image.png](https://cos.easydoc.net/13568421/files/lmwrly0m)
- **kube-apiserve**
- 对外暴露 K8S 的 api 接口,是外界进行资源操作的唯一入口
- 提供认证、授权、访问控制、API 注册和发现等机制
- **etcd**
- etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes所有集群数据的后台数据库。
- Kubernetes 集群的 etcd 数据库通常需要有个备份计划
- **kube-scheduler**
- 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。
- 所有对 k8s 的集群操作,都必须经过主节点进行调度
- **kube-controller-manager**
- 在主节点上运行控制器的组件
- 这些控制器包括:
- **节点控制器**(Node Controller): 负责在节点出现故障时进行通知和响应。
- **副本控制器**(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。
- **端点控制器**(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service与 Pod)。
- **服务帐户和令牌控制器**(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
### Node节点
![image.png](https://cos.easydoc.net/13568421/files/lmws032r)
- **kubelet**
- 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。
- 负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理;
- **kube-proxy**
- 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
- **容器运行环境(Container Runtime)**
- 容器运行环境是负责运行容器的软件。
- Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。
- **fluentd**
- 是一个守护进程,它有助于提供集群层面日志 集群层面的日志
## 相关概念
![image.png](https://cos.easydoc.net/13568421/files/lmws8h3k)
- **Container**:容器,可以是 docker 启动的一个容器
- **Pod**:
- k8s 使用 Pod 来组织一组容器
- 一个 Pod 中的所有容器共享同一网络。
- Pod 是 k8s 中的最小部署单元
- **Volume**
- 声明在 Pod 容器中可访问的文件目录
- 可以被挂载在 Pod 中一个或多个容器指定路径下
- 支持多种后端存储抽象(本地存储,分布式存储,云存储…)
![image.png](https://cos.easydoc.net/13568421/files/lmwsym47.png)
- **Controllers**:更高层次对象,部署和管理 Pod;
- ReplicaSet:确保预期的 Pod 副本数量
- Deplotment:无状态应用部署
- StatefulSet:有状态应用部署
- DaemonSet:确保所有 Node 都运行一个指定 Pod
- Job:一次性任务
- Cronjob:定时任务
- **Deployment**:
- 定义一组 Pod 的副本数目、版本等
- 通过控制器(Controller)维持 Pod 数目(自动回复失败的 Pod)
- 通过控制器以指定的策略控制版本(滚动升级,回滚等)
![image.png](https://cos.easydoc.net/13568421/files/lmwt647x.png)
- **Service**
- 定义一组 Pod 的访问策略
- Pod 的负载均衡,提供一个或者多个 Pod 的稳定访问地址
- 支持多种方式(ClusterIP、NodePort、LoadBalance)
- **Label**:标签,用于对象资源的查询,筛选
![image.png](https://cos.easydoc.net/13568421/files/lmwt8nf7.png)
- **Namespace**:命名空间,逻辑隔离
- 一个集群内部的逻辑隔离机制(鉴权,资源)
- 每个资源都属于一个 namespace
- 同一个 namespace 所有资源名不能重复
- 不同 namespace 可以资源名重复
- API:我们通过 kubernetes 的 API 来操作整个集群。
- 可以通过 kubectl、ui、curl 最终发送 http+json/yaml 方式的请求给API Server,然后控制 k8s集群。k8s 里的所有的资源对象都可以采用 yaml 或 JSON 格式的文件定义或描述
![image.png](https://cos.easydoc.net/13568421/files/lmwtkqt3.png)
# 入门理念
## 什么是POd
![image.png](https://cos.easydoc.net/13568421/files/lmymnsl5.png)
> **总结: Pod是Kubernetes的最小逻辑单元, 不可再分, Pod里面的容器可以共享网络, 而且Pod的目的是为了逻辑隔离容器**
## 什么是Controller
> 控制器可以为您创建和管理多个 Pod,管理副本和上线,并在集群范围内提供自修复能力。例如,如果一个节点失败,控制器可以在不同的节点上调度一样的替身来自动替换 Pod。包含一个或多个 Pod 的控制器一些示例包括:Deployment StatefulSet DaemonSet 控制器通常使用您提供的 Pod 模板来创建它所负责的 Pod
### 什么是Deployment控制器
![image.png](https://cos.easydoc.net/13568421/files/lmymvai1.png)
> 该控制器主要是管理Pods副本的
### 什么是StatefulSet控制器
![image.png](https://cos.easydoc.net/13568421/files/lmymw9ol.png)
> 该控制器主要是管理有状态的Pods副本的(这些Pods需要将数据挂载到存储卷)
### 什么是DaemonSet控制器
![image.png](https://cos.easydoc.net/13568421/files/lmymxhad.png)
> 该控制器主要是管理Pods副本确保到每一个节点
![image.png](https://cos.easydoc.net/13568421/files/lmyn0apn.png)
## 什么是Deployment
> 如果我们想要部署, 肯定是部署Pods的, 但是, 主节点需要知道部署的状态信息, 因此, 主节点会有一个Deployment来记录部署信息
![image.png](https://cos.easydoc.net/13568421/files/lmyn7a27.png)
## 什么是Service
> pod只能在内部网络相互访问, 为了让Pods能让外部访问, 因此需要service, service的作用主要是暴露Pods的
## 什么是Label和selectors
![image.png](https://cos.easydoc.net/13568421/files/lmyn9d0c.png)
> Label就像HTML里面的Class, 结合selectors, 就像是一个对于标签的数据选择器, 在一个Service中可能存在多个Pods, 为了更好的管理和选择性获取这些Pods, 因此引入了标签和选择器
## 什么是ingress
> **ingress为不同的service提供了服务发现和负载均衡的功能**
> **通过 Service 发现 Pod 进行关联。基于域名访问。**
> **通过 Ingress Controller 实现 Pod 负载均衡**
> **支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡**
![image.png](https://cos.easydoc.net/13568421/files/lmynmyf8.png)
# 状态说明
1. 如果pod的状态处于Completed状态, 说明这个pod的生命周期结束了, 因此, 他可有可无, 不需要管
2. 如果pod的状态处于pending状态, 这个pod的容器很可能拉取不下来, 建议换一个