upload successful

简介

基础概念

Kubernetes(简称 K8S)的出现是容器化技术发展的必然结果,容器化是应用程序级别的虚拟化,运行单个内核上有多个独立的用户空间实例,这些实例就是容器;容器提供了将应用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法,而且容器是共享一个内核的;由于容器技术的兴起,导致大量的容器应用出现,所以就出现了一些用来支持应用程序容器化部署和组织的容器编排技术,一些流行的开源容器编排工具有 Docker Swarm、Kubernetes 等,但是在发展过程中 Kubernetes 现在已经成为了容器编排领域事实上的一个标准了。

是 Google 团队发起的一个开源项目,它的目标是管理跨多个主机的容器,用于自动部署、扩展和管理容器化的应用程序,主要实现语言为 Go 语言,他的理论基础来源与 Google 内部的 Borg 项目,所以 Kubernetes 项目的理论基础就比其他开源项目要“先进”很多,因为 Borg 系统一直依赖就被称为 Google 公司内部最强大的“私密武器”。

为什么使用Kubernetes

使用k8s满足的企业需求:

  • 为了提高业务并发和高可用

  • 多容器跨主机提供服务

  • 多容器分布节点部署

  • 多容器升级

  • 高效管理容器

资源概念

  • Pod

    1
    2
    3
    4
    最小化部署单元
    一个容器的集合
    一个pod中的容器共享网络命名空间
    pod是短暂的
  • Controller

    1
    2
    3
    4
    5
    6
    Controller
    Deployment: 无状态服务部署
    StatefulSet: 有状态服务部署
    DaemonSet: 确保所有Node运行同一个Pod
    Job: 一次性任务
    Cronjob: 定时任务
  • Service

    1
    2
    3
    防止Pod失联
    对后端pod提供负载均衡
    定义一组Pod的访问策略
  • Label

    1
    标签,附加到某个资源上用于关联对象、查询和筛选
  • Namespace

    1
    2
    命名空间,将对象逻辑上隔离;
    针对Pod资源进行隔离,权限控制

网络通讯模式

同一个Pod内的多个容器之间:通过pause容器网络栈本地lo进行通讯;

各Pod之间的通讯:Overlay Network;

​ Pod1与Pod2不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不通Node之间的通信只能通过宿主机的物理网卡进行,将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问;

​ Pod1与Pod2在同一台主机,由docker0网桥直接转发请求至Pod2,不需要经过Flannel;

Pod与Service之间通讯:各节点的iptables规则 或者最新版本LVS,转发效率更高;

Pod到外网:Pod向外网发送请求,查找路由表,转发数据包到宿主机的网卡,宿主机网卡完成路由选择后,iptables执行Masquerade(动态转换)把源IP更换为宿主机网卡的IP,然后向外网服务器发送请求;

外网访问Pod:Service;

容器类型

infrastructure container:基础容器(pause),维护整个Pod网络空间

InitContainers:初始化容器,先于业务容器开始执行

Containers:业务容器,并行启动

工作流程

1
kubectl操作指令下发给apiserver,apiserver处理请求之后,将数据存放在etcd,scheduler负责调度容器,通过算法将容器部署到合适的节点中有kubectl来操作容器,controller-manager进行管理容器,负责保证pod的期望状态;

组件

Master

端口范围 组件
10250 Kubelet API
10251 kube-scheduler
10252 kube-controller-manager
2379-2380 etcd、API Server
64430-64439 API Server

ApiServer

所有服务访问统一入口;

与其他组件进行交互;

APIserver:集群的统一入口,各组件协调者,以RESTfulAPI提供接口服务,所有对象资源的增删改查和监听操作都交给APIserver处理后再提交给Etcd存储

CrontrollerManager

管理pod状态保证pod处于最初预期的状态;

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理控制器;

Scheduler

负责分发Pod任务,选择合适的节点进行分配Pod;

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上;

调度规则:

  • 设置cpu、内存的使用要求;
  • 增加node的label,并通过pod.Spec.NodeSelector进行强匹配;
  • 直接设置pod的nodeName,跳过调度直接下发。

Etcd

键值对数据库,存储K8S集群所有重要信息(持久化)

分布式键值存储系统,用于保存集群状态数据,比如Pod、Service等对象信息;

Node

Kubelet

直接跟容器引擎进行交互实现容器的生命周期管理;

主要接收apiserver下发的指令比如创建删除容器并获取容器和节点状态;

Kube-Proxy

负责写入规则至Iptables、IPVS 实现服务映射访问;

与后端容器进行通信,负责将请求转发后端容器;

其他组件

CoreDNS

可以为集群中的SVC创建域名对应的IP解析;

Dashboard

WEB访问体系;

Ingress

官方只能实现四层代理,Ingress可以实现七层代理;

Federation

可以跨集群中心多K8S统一管理功能;

Prometheus

提供K8S集群监控能力;

ELK

提供K8S集群日志统一分析存储平台;