太想进步啦!
大家好,这里是鲸鱼猫猫,最近由于公司项目在使用Kubenetes,又知道云原生是早晚都要接触的东西,又没什么事情干,因此就希望初步了解一下,看过之后,表示:有点过于繁琐,但是又要不断学习!!
接下来就是我近日学习Kubenetes的一些笔记,希望哪里有不对的地方,也能遇到好心人指点一二!
学习Kubenetes之前,我去了解了一下,目前的服务类别有哪些(因为Kubenetes主要使用在分布式应用部署与治理方面)。
- Iaas:基础设施服务类(可以理解为提供基础服务的那些云厂商,如:ali、鹅厂等等)。
- Paas:平台及服务,比较典型的就是早一点的新浪云,当用户在云厂商下单后,由云厂商运维搭建软件环境,提供应用部署等维护服务。在这期间,出现了CICD、容器化技术等众多云原生技术并加以运用。
- Saas:Saas应用也就是典型的软件及服务,用户可以通过定制软件服务来实现软件使用,提供软件的厂商会根据用户定制来实现当前软件服务扩充。
什么叫做Kubenetes
Kubenetes是由Google公司提供,基于Go语言开发的一款用于容器编排的工具,具备轻量级、开源、水平扩展性请以及支持复杂均衡IPVS实现等多种特点。 Kubernetes的前身可以看做是Google的Burg系统。
Burg调度器架构如下:

具体解释:
- BorgMaster:负责请求分发,类似集群网关负责维护整个集群状态,并将数据持久化到Paxos中。通常进行集群部署,对于集群数量,高可用节点通常为超过1的单数
- BorgLet:提供具体服务,负责监听Paxos数据库内部数据内容,发现数据匹配,取出消费。
- config file:配置文件。
- borgcfg:Borg的命令行工具,用于与Borg系统进行交互,一般通过一个配置文件来提交任务。
- commant-line tools:命令行工具
- web browsers:浏览器
- scheduler:调度器,负责取出Paxos中的数据,并进行任务调度,根据应用特点将其调度到具体机器上。
下面我们来看一下Kubernetes的架构:

在Kubenetes中,由领导者、执行者与持久化数据库组成,其中
Master为领导者,其内部组成为:
-
- 调度器------scheduler:负责调度任务执行,执行顺序为scheduler将任务通过api server 写入到etcd
-
- 控制器------replication controller:负责维护副本数平衡,如果当前副本数与期望值不符,RC负责将副本生成/同步至主机。
-
- 服务入口------api server:
具体领导者模型如下:

而执行者则是Node,通常称为节点,下面会具体聊Kubenetes中的组成架构,这里先看一下Node的模型:

重点--Etcd: 类似Borg系统中的数据库Paxos,用于存储当前任务数据。etcd官方将etcd定义为了一个可信赖的分布式键值型数据库,能够存储分布式集群的关键数据,用于分布式集群正常运转。Etcd具备两种存储结构,分别为Memory 和Batabase ,但在Kubernetes1.11版本之后,Memory的v2版本被弃用。
接下来,具体学习一下Kubenetes的架构组件有哪些?并且理解一下这些组件的基础概念 Kubernetes的主要组件由以下几部分构成:
-
ETCD:etcd用于保存整个集群的状态,可以看作是前面的Paxos数据库;
-
Api Server:用于Api调度,类似网关,提供了资源操作的唯一入口,并且提供了认证、授权、访问控制、API注册与发现机制;
-
Controller Manager:控制器管理,负责维护集群状态,如:故障检测、自动扩展、滚动更新等内容,具备多种类型,如:
- 节点控制器--节点出现故障进行通知与响应
- 任务控制器--监测代表一次性任务的job对象,创建Pods运行任务直至结束
- 端点分片控制器:填充端点分片对象
- 服务账号控制器:为新的命名空间提供默认的服务账号;
-
scheduler:负责资源调度,按照预定调度策略将Pod调整到相应机器,其主要负责 监视新创建的或者是未指定运行节点(node)和Pods,并通过节点选择来让Pod在上面运行;
-
Kubelet:负责维护当前容器生命周期,同时也负责CVI和CNI的管理;
-
Container Runtime:负责镜像管理以及Pod和容器的真正运行;
-
kube-proxy负责为Service提供集群内部的服务发现和负载均衡。

基本概念
Container------容器
容器是一种便捷式、轻量级的操作系统级虚拟化技术,使用namespace来隔离不同的软件运行环境,并通过镜像自包含软件的运行环境来实现容器的可移植性,使得一个容器可以很方便的在任何地方运行。
容器由于其体积小、启动快 的特点,可以在每个容器镜像中打包一个应用程序。这种针对一对一的应用镜像关系具备无环境限制、单独APP无需外部依赖、不依赖外部基础架构环境等优势,解决了由开发到生产环境的一致性问题。
容器同样比虚拟机更加透明,有助于监测和管理。尤其是针对容器进程的生命周期转为由基础设施管理,而不是由进程管理器隐藏在容器的内部。
容器具备高度封装化的特点,单独的一个容器就可以看作是一个单独的应用程序。大大提升了管理和部署效率。
其他优点:
- 适应敏捷开发 ,应用程序的创建与部署更加高效;与镜像相比,容器镜像更易用、高效。
- 支持CI/CD,提供了可靠与频繁的容器镜像构建、部署和快速简便的回滚操作。
- 应用与基础架构分离,容器镜像包含自顶向下的全部所需内容。
- 可以有效保证环境的一致性,对于企业场景,开发、测试与上线的环境虽不同,但是由于在云上运行,且使用相同容器,从而保证了一致性。
- 可移植性强。
- 以应用作为中心进行管理,在传统硬件上部署操作系统提升到操作系统中部署应用程序。
- 具备松耦合 、分布式 、弹性伸缩 与微服务 等多种特点,可以进行动态管理与部署 ,使程序运行在不同的专业设备 上从而提升应用稳定性。
- 实现了资源隔离与资源利用。具备可预测的应用性能以及高效率和高密度的特点。
Pod
在Kubernetes中,管理容器的核心是Pod,一个Pod可以容纳一个或是多个联系紧密的容器。
Pod可以看作是一组高密度的容器的集合,他们共享IPC与Network namespace(网络命名空间)------对于使用相同namespace的资源,可以进行进程间资源共享,也是Kubernetes调度的基本单位。Pod中的多个容器共享网络与文件系统,可以通过进程间通信与文件共享的简单方式组合来完成服务。(基于Http Client实现服务间调用)
以下为官网Pod模型 及Linux中的IPC概念

在K8S中,对象使用mainfest(yaml/json方式)进行定义。比如:nginx服务配置可以定义为nginx.yaml
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec: containers:
-name: nginx
image: nginx
ports:
- containerPort: 80
Node
Node是Pod的真正运行主机,其可以是物理机,也可以是虚拟机,用于管理多个Pod,每个Node节点上至少要具备容器的运行环境(docker、rkt)、Kubelet与kube-proxy服务。(图片来自:kubernetes.feisky.xyz/introductio...)

Namespace
namespace是在Linux当中一组资源/一组容器对象的抽象表示 ,可以根据namespace 来实现 将系统内部的对象划分为不同的项目组或用户组。常见的pods、services、replication controllers与deployments等都是属于一个namespace的,而node、persistantVolumes等则不属于任何namespace。
Service
Service是应用服务的抽象,通过labels为应用提供负载均衡 与服务发现。匹配labels的Pod IP与端口列表会组成一个endpoints,由kube-proxy负责将服务的IP负载均衡到这些endpoints上。
每一个Service会自动分配一个cluster IP,该IP为当前服务仅在集群内部可以访问的虚拟地址和一个DNS名称,其他容器允许通过当前的地址/DNS来访问服务,不需要了解后端容器的运行情况。
Label
Label是识别当前Kubenetes的标签,以KV形式附加在对象中。Label不具备唯一性并且在Kubenetes中,经常由很多对象使用同一个Label来标志当前具体的应用。
Label 定义好后其他对象可以使用 Label Selector 来选择一组相同 label 的对象(比如 ReplicaSet 和 Service 用 label 来选择一组 Pod)。Label Selector 支持以下几种方式:
- 等式,如
app=nginx
和env!=production
- 集合,如
env in (production, qa)
- 多个 label(它们之间是 AND 关系),如
app=nginx,env=test
这就是今天的学习成果啦!!!
完结撒花,日更Kubenetes笔记,由于自己的学习主要是基于官网,后续可能会寻找一些优质的视频网课进行学习。也希望有一起学习Kubenetes 的伙伴或者是码友推荐一些好用的Kubenetes学习资料。先谢谢各位了!!!