0 K8s部署之概述入门

Kubernetes集群 是由多个计算机(可以是物理机、云主机或虚拟机)组成的一个独立系统,通过 Kubernetes 容器管理系统,实现调度、伸缩、服务发现、健康检查、密文管理和配置管理等功能。,它允许您的组织对应用进行自动化运维。
数据中心:
etcd:存储集群状态数据,整个k8s集群的备份一般就需要备份etcd数据和各组件之间的证书即可。
etcd更新集群状态前,需要集群中的所有节点通过quorum投票机制完成投票。假设集群中有 n 个节点,至少需要 n/2 + 1(向下取整)个节点同意,才被视为多数集群同意更新集群状态。例如一个集群中有 3 个 etcd 节点,quorum 投票机制要求至少两个节点同意,才会更新集群状态。集群应该含有足够多健康的etcd节点,这样才可以形成一个quorum。一般情况下,集群中只要配置三个etcd节点就能满足小型集群的需求,五个etcd节点能满足大型集群的需求。
Master组件(控制平面):
Controlplane节点上运行的工作负载包括:Kubernetes API server、scheduler 和 controller mananger。这些节点负载执行日常任务,从而确保您的集群状态和您的集群配置相匹配。因为etcd节点保存了集群的全部数据,所以 Controlplane 节点是无状态的。虽然您可以在单个节点上运行 Controlplane,但是我们建议在两个或以上的节点上运行 Controlplane,以保证冗余性。
- apiserver:“大脑”,负责接收并处理请求,只有apiserver才能与数据库etcd进行数据交流
- scheduler:调度器,调度容器创建请求
- controller-manager:确保各种控制器健康,各种控制器来确保各种pod(简单理解成容器)的健康状态
Nodes组件(Worker):
- kubelet:用于与Master通信、接受master调度过来的各种任务并执行任务。监控节点状态的 Agent,确保您的容器处于健康状态。可以理解为是一个集群代理,来调用dokcer等容器工具。
- kube-porxy:service的具体实现:它随时与apiserver进行通信获取Service的变更信息,然后将变更的Service信息设置为k8s集群内的每一个Node节点上的iptables/ipvs规则上
- docker:容器运行时环境,容器引擎
内容来自华为 CCE 文档
集群指容器运行所需要的云资源组合,关联了若干云服务器节点、负载均衡等云资源。您可以理解为集群是“同一个子网中一个或多个弹性云服务器(又称:节点)”通过相关技术组合而成的计算机群体,为容器运行提供了计算资源池。
也叫“主机”,每一个节点对应一台服务器(可以是虚拟机实例或者物理服务器),容器应用运行在节点上。节点上运行着 Agent 代理程序(kubelet),用于管理节点上运行的容器实例。集群中的节点数量可以伸缩。
实例(Pod)是 Kubernetes 部署应用或服务的最小的基本单位。一个 Pod 封装多个应用容器(也可以只有一个容器)、存储资源、一个独立的网络 IP 以及管理控制容器运行方式的策略选项。
Pod是一个或多个容器的集合,是一个逻辑概念。虽然一个Pod内可以有多个容器,但是一般建议只有一个容器。Pod内的多个容器共享底层的net、uts、ipc三种名称空间,而另外的user、mnt、pid名称空间是相互隔离的。虽然pod内的多个容器的mnt名称空间(文件系统)是相互隔离的,但是pod内的多个容器可以共享存储卷。
- 静态Pod(Static Pod,自助式Pod):
- 控制器管理的Pod:
一个通过Docker镜像创建的运行实例,一个节点可运行多个容器。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。
工作负载即 Kubernetes 对一组 Pod 的抽象模型,用于描述业务的运行载体,包括 Deployment、Statefulset、Daemonset、Job、CronJob 等多种类型。
即 Kubernetes 中的“Deployments”,无状态工作负载支持弹性伸缩与滚动升级,适用于实例完全独立、功能相同的场景,如:nginx、wordpress 等。
即 Kubernetes 中的“StatefulSets”,有状态工作负载支持实例有序部署和删除,支持持久化存储,适用于实例间存在互访的场景,如 ETCD、mysql-HA 等
即 Kubernetes 中的“DaemonSet”,守护进程集确保全部(或者某些)节点都运行一个 Pod 实例,支持实例动态添加到新节点,适用于实例在每个节点上都需要运行的场景,如 ceph、fluentd、Prometheus Node Exporter 等。
即 Kubernetes 中的“Job”,普通任务是一次性运行的短任务,部署完成后即可执行。使用场景为在创建工作负载前,执行普通任务,将镜像上传至镜像仓库。
即 kubernetes 中的“CronJob”,定时任务是按照指定时间周期运行的短任务。使用场景为在某个固定时间点,为所有运行中的节点做时间同步。
Lable是一种key=value的数据。
LabelSelector 是通过标签来选择对象的一种机制。
命名空间是对一组资源和对象的抽象整合。在同一个集群内可创建不同的命名空间,不同命名空间中的数据彼此隔离。使得它们既可以共享同一个集群的服务,也能够互不干扰。
例如:可以将开发环境、测试环境的业务分别放在不同的命名空间。
名称空间并不隔离Pod间的访问,只是隔离用户的权限,比如某个用户只能管理某个名称空间中的资源;但是这个名称空间中的Pod却可以访问另一个名称空间中的Pod。这种网络间的隔离需要网络插件的网络策略来实现,比如calico的网络策略。
服务定义了实例及访问实例的途径,如单个稳定的 IP 地址和相应的 DNS 名称。
Service通过标签选择器关联后端,并且自动维护后端的变化信息。本质是iptables的DNAT规则
IP地址是虚拟的,只存在与iptables或ipvs的规则中,所以是无法ping通的。
编排模板包含了一组容器服务的定义和其相互关联,可以用于多容器应用和虚机应用的部署和管理。
Role、Rolebinding、ClusterRole、ClusterRolebinding
Docker 镜像是一个模板,是容器应用打包的标准格式,用于创建 Docker 容器。或者说,Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。在部署容器化应用时可以指定镜像,镜像可以来自于 Docker Hub、华为云容器镜像服务或者用户的私有 Registry。例如一个 Docker 镜像可以包含一个完整的 Ubuntu 操作系统环境,里面仅安装了用户需要的应用程序及其依赖文件。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的“类” 和“实例” 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
镜像仓库用于存放 Docker 镜像,包括公共镜像仓库(如 DockerHub)和私有镜像仓库(如 Harbor)。
在应用没有容器化之前,原先一个虚机上会装多个组件,进程间会有通信。但在做容器化拆分的时候,往往直接按进程拆分容器,比如业务进程一个容器,监控日志处理或者本地数据放在另一个容器,并且有独立的生命周期。这时如果他们分布在网络中两个较远的点,请求经过多次转发,性能会很差。
亲和性:可以实现就近部署,增强网络能力实现通信上的就近路由,减少网络的损耗。如:应用 A 与应用 B 两个应用频繁交互,所以有必要利用亲和性让两个应用的尽可能的靠近,甚至在一个节点上,以减少因网络通信而带来的性能损耗。
反亲和性:主要是出于高可靠性考虑,尽量分散实例,某个节点故障的时候,对应用的影响只是N分之一或者只是一个实例。如:当应用采用多副本部署时,有必要采用反亲和性让各个应用实例打散分布在各个节点上,以提高 HA。
Istio 是一个提供连接、保护、控制以及观测功能的开放平台。
应用服务网格,可提供非侵入的智能流量治理解决方案,其功能包括负载均衡、熔断、限流等多种治理能力。应用服务网格内置金丝雀、蓝绿等多种灰度发布流程,提供一站式自动化的发布管理。
集群节点数可以伸缩。轻易实现集群的横向扩展。
云环境无缝迁移,Kubernetes 完全兼容各种云服务提供商,例如 Google Cloud、Amazon、Microsoft Azure,还可以工作在 CloudStack, OpenStack, OVirt, Photon, VSphere。
自动调度pod:高效的利用内存、处理器等资源。
应用副本自动伸缩能力。管理容器组(pod)的扩展、复制、健康,并解决 pod 的启动、负载均衡
故障迁移:当某一个node节点关机或挂掉后,node节点上的服务会自动转移到另一个node节点上,这个过程所有服务不中断。
健康检查:如果某个pod健康检查不通过,会自动重启应用。
使 CI/CD 更加简单