目录

  • 一、Docker简介
  • 1、3个核心概念
  • 2、镜像与可写层驱动
  • 3、Docker组件
  • 4、Kata Containers
  • 二、K8s系统基础
  • 1、容器编排
  • 1.1、定义
  • 1.2、为用户提供关键能力
  • 2、集群概述
  • 1、集群概括
  • Pod
  • 2、集群架构
  • 1、主节点组件说明
  • etcd
  • controller-manager
  • 调度器
  • 2、工作节点组件说明
  • kubelet
  • 容器运行时
  • kebe-porxy
  • 3、核心组件及常用附件
  • 网络插件
  • CoreDNS
  • Dashboard
  • 监控
  • 日志
  • Ingress Controller
  • 3、应用的运行及互联互通
  • 1、service
  • 2、Pod控制器
  • Deployment
  • StatefulSet
  • 3、三种网络,节点网络,Pod网络,service网络
  • 4、K8s生态系统
  • 1、具备的具体重要特性


一、Docker简介

1、3个核心概念

容器、镜像、镜像仓库。容器镜像之内直接包含了应用程序及其依赖的系统环境、库、基础程序等。

2、镜像与可写层驱动

docker使用aufs、devicemapper、overlay2等存储驱动来管理镜像层和可写容器层的内容。尽管实现的管理方式不同,但都使用了可堆叠的镜像层和写时复制策略。

3、Docker组件

自1.11.0版本,docker引擎由一个单体拆分成了docker engine、containerd、containerd-shim、runC四个项目。

docker engine:客户在docker客户端发出的指令由docker AIP发送到引擎接受并处理。

containerd:是一个守护进程,进行对容器与镜像的具体操作。如删除,创建等。通过gRPC向上层调用者docker engin公开API。

containerd-shim:作为高级别容器运行时containerd与低级别容器运行时runC的中间层,以支持多种不同的OCI运行(CRI-O、Podman、Kata Containers)时,并能够将容器运行为无守护进程模式,即将containerd-shim作为容器父进程,而不是containerd。这意味着每创建一个容器,containerd会创建一个containerd-shim,然后containerd-shim来创建一个runC来启动容器。

4、Kata Containers

由于容器受限于容器引擎宿主机的内核版本以及不支持异构的硬件平台等原因。所以基于虚拟化的安全容器项目兴起,Kata Containers在专有的精简内核中运行容器,提供网络,I/O和内存的隔离。致力于通过轻量级虚拟机来构建安全的容器运行时。

二、K8s系统基础

1、容器编排

1.1、定义

容器编排是指自动化容器应用的部署、管理、扩展、和联网的一系列管控操作。

具体有:调度和部署容器、容器间分配资源、扩展容器应用规模、、容器的宿主机迁移、负载均衡以及监视容器和主机的运行状况。

但K8s不限于容器调度,其本质是”以应用为中心“的现代应用基础设施,通过管理各种基础支撑类服务(如消息队列,集群存储系统,服务发现,数据处理框架及负载均衡)将各种中间件”下沉“到自身内部,并将API向上层应用暴漏这些基础设施能力。

1.2、为用户提供关键能力

  • 集群管理与基础设施抽象化:将多个虚拟机或物理机构成一个协同运行的集群,并将这些硬件基础设施抽象为一个统一的资源池。
  • 资源分配与优化:基于配置清单中指定的资源需求与实际可用资源,利用成熟的调度算法进行合理调度工作负载。
  • 应用部署:支持跨主机的自动应用部署,支持多版本并存、滚动更新和回滚等机制。
  • 应用伸缩:规模实例的自动或手动伸缩。
  • 应用隔离:支持位租户、项目或应用进行访问隔离。
  • 服务可用性:利用状态检测和应用重构机制确保服务始终健康运行

2、集群概述

1、集群概括

使用共享网络将多个主机构建成统一的集群。其中1个或少量几个作为主节点,其他都是工作节点。

主节点:作为控制中心,负责管理整个集群系统。它是各类客户端访问集群的唯一入口。

工作节点:使用本地和外部资源接受请求并以Pod形式运行工作负载。它来接受master工作指令并相应的创建或销毁Pod对象,并且可调整网络规则以合理完成路由和转发流量等任务。

Pod

是一组容器的集合并包含容器的管理机制。是k8s最小的调度单元,同一Pod中的容器必须运行于同一工作节点之上。

2、集群架构

k8s属于server-client形式的二层架构。

主节点由API Server、controller-manager和scheduler以及一个用于集群状态存储的etcd存储服务组成。

工作节点由kubelet、kube-proxy以及容器运行时(最常用的docker)组成。

K8S国内镜像 k8s基础镜像_docker

1、主节点组件说明

注:

etcd

是一种分布式键值存储。集群所有状态信息都要持久存储于存储系统etcd里面。并且可以进行服务发现、共享配置以及一致性保障。还为其存储数据提供了监听机制,用于监视和推送变更。API Server是k8s集群中唯一能与etcd进行通讯的组件。

controller-manager

控制器负责实现用户通过API Server提交的终态声明,通过一系列操作步骤驱动API对象的当前状态逼进或等同于期望状态,比如有驱动Node、Pod、Server、Endpoint、Token等十多种类型的API对象的控制器。

在逻辑上,每个控制器都应该属于一个单独的进程,但为了降低复杂性,他们被统一编译到一个单独的二进制程序文件,也就是kube-controller-manager,并以单个进程来运行。

调度器

API Server接收到每一个Pod创建的请求,都会为其匹配出一个最佳工作节点,其中kube-scheduler是默认的调度器进程。

2、工作节点组件说明
kubelet

运行在每一个Node上的节点代理服务,负责接受并执行Master发来的指令,以及管理当前Node上Pod对象的容器等任务。通过从API Server接受Pod配置清单,也可以通过指定的本地目录中加载静态Pod配置清单,然后通过容器运行时对容器进行创建、启动、监视等操作。

kebelet可以对容器进行监视,并且内置了HTTP服务器,监听TCP协议的10248、10250。

10248:通过/healthz响应来对自身的健康状态进行检查。

10250:暴漏API,以验证、接受并响应API Server的通信请求。

容器运行时

负责容器整个生命周期的。kubelet通过CRI(容器运行时接口)来支持多种不同类型的容器进行时,如docker、containerd、CRI-O、runC、kata containers等。

kebe-porxy

也是运行在集群的每个节点上的服务进程。负责确保集群中Node、Service、Pod之间的有效通信,个人理解就是通过制定iptables规则,来将Service的Cluster IP的流量分发至后端的Pod上,本质上更像Pod的代理以及负载均衡器。

3、核心组件及常用附件
网络插件

常见的由Flannel、Calico、Canal、Cilium、Weave Net

Flannel默认使用10.244.0.0/16

Calico默认使用192.168.0.0/16

CoreDNS

k8s在1.11版本默认使用CoreDNS,集群内部中定制的DNS应用程序来实现名称解析,也就是提供了服务注册与服务发现功能。

通常服务的DNS名称遵循标准规则:svc.namespace.svc.cluster-domain

Dashboard

可视化图形面板

监控

Prometheus等

日志

EFK

Ingress Controller

通常情况下,service和pod的IP仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到service在Node上暴露的NodePort上,然后再由kube-proxy将其转发给相关的Pod。而Ingress就是为进入集群的请求提供路由规则的集合,也就是将外部流量引入到集群内部,但是它不会暴露任何端口和协议。而流量的具体穿透是由Ingress控制器来发挥作用,常见的有Nginx、haproxy、kong等

3、应用的运行及互联互通

1、service

service是一种API资源类型,基于匹配规则来选出一组Pod对象的集合,为他们提供一个固定的IP地址,以及请求调度。匹配规则我们通常使用"标签选择器"来实现。其中Server IP也成为Cluster IP,并且这个ip是虚拟的,不会被添加到任何网络接口设备上。

2、Pod控制器

虽然说kubelet能够将非正常的Pod进行重启或重构,但kubelet进程坏了或者资源耗尽或节点故障导致回收操作,从而将Pod实例删除怎么办?

这时候就需要Pod控制器,能够构建跨越工作节点生命周期的Pod对象。用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试 进行重启,当根据重启策略无效,则会重新新建pod的资源。。还支持应用规模中Pod实例的自动扩容、缩容、滚动更新和回滚。

Deployment

常用于管理无状态应用的Pod控制器。由期望的副本数量、Pod模板、标签选择器组成。用户需手动修改期望的副本数量来进行扩容或缩容。但如果集群部署了监控如Prometheus,用户则可以使用HPA(horizontal pod autoscaler)来根据Pod对象的CPU等资源占用计算出合适的Pod副本数量,并自动修改期望的副本数量来实现动态伸缩,提高集群资源利用率。

StatefulSet

常用于管理有状态应用的Pod实例。其他还有DaemonSet、Job、CronJob等

3、三种网络,节点网络,Pod网络,service网络

用于各Pod之间通信。是一种虚拟网络,相关地址配置在Pod的网络接口,由传统的kubenet网络插件实现或新式的CNI(容器网络接口)网络插件实现。

4、K8s生态系统

简而言之,K8s提整合并抽象了底层的硬件和系统环境等基础设施,并对外提供了一个统一的资源池,让用户通过AIP进行调用资源。

1、具备的具体重要特性

  • 自动装箱
  • 自我修复
  • 水平扩展
  • 服务发现和负载均衡
  • 自动发布和回滚
  • 密钥和管理配置
  • 存储编排
  • 批量处理执行