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的容器很可能拉取不下来, 建议换一个