初探Kubenetes

太想进步啦!

大家好,这里是鲸鱼猫猫,最近由于公司项目在使用Kubenetes,又知道云原生是早晚都要接触的东西,又没什么事情干,因此就希望初步了解一下,看过之后,表示:有点过于繁琐,但是又要不断学习!!

接下来就是我近日学习Kubenetes的一些笔记,希望哪里有不对的地方,也能遇到好心人指点一二!

学习Kubenetes之前,我去了解了一下,目前的服务类别有哪些(因为Kubenetes主要使用在分布式应用部署与治理方面)。

  • Iaas:基础设施服务类(可以理解为提供基础服务的那些云厂商,如:ali、鹅厂等等)。
  • Paas:平台及服务,比较典型的就是早一点的新浪云,当用户在云厂商下单后,由云厂商运维搭建软件环境,提供应用部署等维护服务。在这期间,出现了CICD、容器化技术等众多云原生技术并加以运用。
  • Saas:Saas应用也就是典型的软件及服务,用户可以通过定制软件服务来实现软件使用,提供软件的厂商会根据用户定制来实现当前软件服务扩充。

什么叫做Kubenetes

Kubenetes是由Google公司提供,基于Go语言开发的一款用于容器编排的工具,具备轻量级、开源、水平扩展性请以及支持复杂均衡IPVS实现等多种特点。 Kubernetes的前身可以看做是Google的Burg系统。

Burg调度器架构如下:

具体解释:

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

下面我们来看一下Kubernetes的架构:

在Kubenetes中,由领导者、执行者与持久化数据库组成,其中

Master为领导者,其内部组成为:

    • 调度器------scheduler:负责调度任务执行,执行顺序为scheduler将任务通过api server 写入到etcd
    • 控制器------replication controller:负责维护副本数平衡,如果当前副本数与期望值不符,RC负责将副本生成/同步至主机。
    • 服务入口------api server:

具体领导者模型如下:

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

重点--Etcd: 类似Borg系统中的数据库Paxos,用于存储当前任务数据。etcd官方将etcd定义为了一个可信赖的分布式键值型数据库,能够存储分布式集群的关键数据,用于分布式集群正常运转。Etcd具备两种存储结构,分别为MemoryBatabase ,但在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=nginxenv!=production
  • 集合,如 env in (production, qa)
  • 多个 label(它们之间是 AND 关系),如 app=nginx,env=test

这就是今天的学习成果啦!!!

完结撒花,日更Kubenetes笔记,由于自己的学习主要是基于官网,后续可能会寻找一些优质的视频网课进行学习。也希望有一起学习Kubenetes 的伙伴或者是码友推荐一些好用的Kubenetes学习资料。先谢谢各位了!!!

相关推荐
2401_8368365917 小时前
k8s配置管理
云原生·容器·kubernetes
一切顺势而行17 小时前
k8s 使用docker 安装教程
docker·容器·kubernetes
霖檬ing17 小时前
K8s——配置管理(1)
java·贪心算法·kubernetes
澜兮子17 小时前
k8s-服务发布基础
云原生·容器·kubernetes
小安运维日记17 小时前
CKS认证 | Day4 最小化微服务漏洞
安全·docker·微服务·云原生·容器·kubernetes
2401_8368365917 小时前
k8s服务发布进阶
云原生·容器·kubernetes
裁二尺秋风20 小时前
CI/CD — DevOps概念之实现k8s持续交付持续集成(一)
ci/cd·kubernetes·devops
云上小朱1 天前
问题处理-k8s环境中,hadoop端口9000无法被访问
kubernetes
敖行客 Allthinker1 天前
云原生安全观察:零信任架构与动态防御的下一代免疫体系
安全·ai·云原生·架构·kubernetes·ebpf