Kubernetes基础组件概述

本文讲的是Kubernetes基础组件概述【编者的话】最近总有同学问Kubernetes中的各个组件的相关问题,其实这些概念内容在官方文档中都有,奈何我们有些同学可能英文不好,又或者懒得去看,又或者没有找到,今天有时间就专门写了这篇博客。

【深圳站|3天烧脑式Kubernetes训练营】培训内容包括:Kubernetes概述、架构、日志和监控,部署、自动驾驶、服务发现、网络方案等核心机制分析,进阶篇——Kubernetes调度工作原理、资源管理及源码分析等。

本文主要介绍Kubernetes的基础组件,先介绍Master节点上的控制管理组件,再介绍Node节点上的计算组件,最后是附加组件,后边会找时间再写一篇介绍Kubernetes中的各种资源及使用。

1 Master节点组件

Master节点组件是指运行在Kubernetes集群中的Master节点上,提供整个集群的管理控制功能的组件,例如调度组件(kube-scheduler),接口组件(kube-apiserver)等

1.1 kube-apiserver

kube-apiserver主要负责暴露Kubernetes API,不管是kubectl还是HTTP调用来操作Kubernetes集群各种资源,都是通过kube-apiserver提供的接口进行操作的。

详细介绍、文档、配置参数:API-Server配置

1.2 kube-controller-manager

管理控制器负责整个Kubernetes的管理工作,保证集群中各种资源的状态处于期望状态,当监控到集群中某个资源状态不正常时,管理控制器会触发对应的调度操作,主要由以下几部分组成:

  • 节点控制器(Node Controller)
  • 副本控制器(Replication Controller)
  • 端点控制器(Endpoints Controller)
  • 命名空间控制器(Namespace Controller)
  • 身份认证控制器(Serviceaccounts Controller)

详细介绍、文档、配置参数:Controller-Manager配置

1.3 cloud-controller-manager

云管理控制器是Kubernetes 1.6新加入的组件(组件抽象了一层IaaS平台的接口,具体的实现由各云厂商负责提供),主要负责与基础计算云平台(IaaS)的交互,目前还处于测试开发阶段,我们也还没有使用过该组件。该组件的具体实现包括:

  • 节点控制器(Node Controller)
  • 路由控制器(Route Controller)
  • 负载均衡服务控制器(Service Controller)
  • 数据卷控制器(Volume Controller)

1.4 kube-scheduler

调度器负责Kubernetes集群的具体调度工作,接收来自于管理控制器(kube-controller-manager)触发的调度操作请求,然后根据请求规格、调度约束、整体资源情况等因素进行调度计算,最后将任务发送到目标节点的kubelet组件执行。

详细介绍、文档、配置参数:Scheduler配置

1.5 etcd

etcd是一款用于共享配置和服务发现的高效KV存储系统,具有分布式、强一致性等特点。在Kubernetes环境中主要用于存储所有需要持久化的数据。

2 Node节点组件

Node节点组件是指运行在Node节点上,负责具体POD运行时环境的组件。

2.1 kubelet

kubelet是Node节点上最重要的核心组件,负责Kubernetes集群具体的计算任务,具体功能包括:

  • 监听Scheduler组件的任务分配
  • 挂载POD所需Volume
  • 下载POD所需Secrets
  • 通过与docker daemon的交互运行docker容器
  • 定期执行容器健康检查
  • 监控、报告POD状态到kube-controller-manager组件
  • 监控、报告Node状态到kube-controller-manager组件

2.2 kube-proxy

kube-proxy主要负责Service Endpoint到POD实例的请求转发及负载均衡的规则管理。

kube-proxy本身实际上并不负责请求转发和负载均衡,而时从kube-apiserver获取Service和POD的状态更新,生成对应的DNAT规则到本地的iptabels,最终的转发和负载均衡动作有iptabels实施,所以kube-proxy组件即使出现问题,已经更新到iptabels的转发规则依然能够生效。

详细介绍、文档、配置参数:Kube-Proxy配置

3 附加组件

BTW:所谓的附加组件并不是说这类组件在kunernetes环境中可有可无,只是为了区别于底层的基础计算组件。

有了上边介绍的Master节点组件和Node节点组件后,基础的Kubernetes环境算是已经构建好了:

kubectl调用apiserver发送创建pod的请求,scheduler收到调度任务发送到符合要求的node节点,node节点上的kubelet与docker daemon通讯创建docker容器。但是离真正可用的Kubernetes集群还有一定距离,例如Container IP管理,内部DNS解析,简单的管理控制台等。

3.1 Flannel

Flannel是由ConreOS主导设计的用于容器技术的覆盖网络(Overlay Network),在Flannel管理的容器网络中,每一个宿主机都会拥有一个独立子网,用于分配给其上的容器使用。通信方式是基于隧道协议的UDP和VXLAN等方式封包、解包及传输。

原生的docker网络结构:docker在启动的时候会创建一个网桥docker0(172.17.0.0),容器启动的时候会创建一对Veth pair,这个Veth pair成对出现用于链接容器与docker0网桥(可以将其理解成一根网线的两个插头,一头插在容器内改名为eth0,另一头插在宿主机的docker0网桥上),这样同一台宿主机上的容器就可以互相访问了,此时的路由表记录:

172.17.0.0     0.0.0.0         255.255.0.0       U     0      0        0 docker0

但是对于不同的宿主机A和宿主机B来说,它们的docker网络一模一样,IP也是一样,网络与网络之间也不通。

Flannel来了之后,在每个宿主机上增加了个P2P的虚拟网卡flannel0(172.17.0.0),一头对接docker0网桥,一头由Flanneld服务监听。Etcd管理着整个Flannel网络的子网分配,宿主机A和宿主机B分别用分到的子网172.17.1.0172.17.2.0创建docker0网桥,然后又悄悄地修改了一下docker daemon的启动参数--bip=172.17.1.1/24,同时添加路由表记录:

#宿主机A
172.17.0.0     0.0.0.0         255.255.0.0       U     0      0        0 flannel0
172.17.1.0     0.0.0.0         255.255.255.0     U     0      0        0 docker0

宿主机B

172.17.0.0     0.0.0.0         255.255.0.0       U     0      0        0 flannel0
172.17.2.0     0.0.0.0         255.255.255.0     U     0      0        0 docker0

模拟下Flannel网络下宿主机A上的docker容器(172.17.1.10)发送数据到宿主机B上的docker容器(172.17.2.15)的过程:

  1. 根据源容器和目的容器的IP匹配路由规则,同时匹配两个IP的路由规则是172.17.0.0/16,如果是同一个宿主机上的容器访问,匹配的是172.17.1.0或者172.17.2.0
  2. 数据从docker0网桥出来以后投递到flannel0网卡
  3. 监听flannel0网卡的Flanneld服务收到数据后封装成数据包发送到宿主机B
  4. 宿主机B上的Flanneld服务接收到数据包后解包还原成原始数据
  5. Flanneld服务发送数据到flannel0网卡,根据目的容器地址匹配到路由规则172.17.2.0/24(docker0)
  6. 投递数据到docker0网桥,进而进入到目标容器172.17.2.15。

Flannel的Github上有张比较详细的原理图:

图中的Flanneld运行在每个宿主机上,负责数据的发送、监听、封包、解包等任务。

强调下,Flannel的backend有UDP和VXLAN、GRE等实现,默认使用UDP,性能大约只有本地物理网络的一半,VXLAN推荐使用,性能损耗很小,不过需要3.9+的内核支持。

详细介绍、文档、源码:Flannel Github

3.2 Calico

Calico是纯三层的SDN实现,它基于BPG协议和Linux的路由转发机制,不依赖特殊硬件,没有使用NAT或Tunnel等技术。能够方便的部署在物理服务器,虚拟机(如OpenStack)或者容器环境下,可以无缝集成像OpenStack这种IaaS云架构,能够提供可控的VM、容器、裸机之间的IP通信,同时它自带的基于Iptables的ACL管理组件非常灵活,能够满足比较复杂的安全隔离需求。

Clico网络模型的特点:

  1. 在Calico中的数据包并不需要进行封包和解封。
  2. Calico中的数据包,只要被policy允许,就可以在不同租户中的workloads间传递或直接接入互联网或从互联网中进到Calico网络中,并不需要像overlay方案中,数据包必须经过一些特定的节点去修改某些属性。
  3. 因为是直接基于三层网络进行数据传输,TroubleShooting会更加容易,同时用户也可以直接用一般的工具进行操作与管理,比如ping、Whireshark等,无需考虑解包之类的事情。
  4. 网络安全策略使用ACL定义,基于iptables实现,比起overlay方案中的复杂机制更直观和容易操作。

Calico 的核心组件:

Felix:Calico agent,跑在每台需要运行workload的节点上,主要负责配置路由及 ACLs等信息来确保endpoint的连通状态;

etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性;

BGP Client(BIRD):主要负责把Felix写入kernel的路由信息分发到当前Calico网络,确保workload间的通信的有效性;

BGP Route Reflector(BIRD):大规模部署时使用,摒弃所有节点互联的mesh模式,通过一个或者多个BGP Route Reflector来完成集中式的路由分发;

详细介绍、文档、源码:Calico Github

3.3 DNS

kube-dns负责Kubernetes集群内的域名解析,解析服务通过dnsmasq实现。通过官方提供的Deployment和Service模板,可以很方便地部署kube-dns服务,并且可以任意伸缩POD实例来保证其高可用性。

默认的kube-dns的service_ip:10.96.0.10,默认的域名后缀为:cluster.local,如果是kubeadm部署的Kubernetes集群,kubelet的配置参数文件是:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

DNS解析的A记录规则为:my-svc.my-namespace.svc.cluster.local,例如kube-dns的service的A记录为:kube-dns.kube-system.svc.cluster.local

POD实例创建后,其中的Container内的resolver.conf的配置如下:

search kube-system.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
options timeout:1 rotate
options ndots:5

因为添加了search domain,在POD的容器内访问其他Service时可以用缩略域名访问,如访问kube-dns服务:kube-dns(同namespace内访问),kube-dns.kube-system(跨namespace访问)。

详细介绍、文档:Kube-Dns文档

3.4 Dashboard

Dashboard是官方提供的kubernetes集群的UI界面,提供了一些基础的查看及简单操作,随便用用还行。

可以通过官方提供的YAML模板创建:kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

详细介绍、文档:Kube-Dashboard文档

原文发布时间为:2017-04-26

本文作者:史绍虎

本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。

原文标题:Kubernetes基础组件概述

时间: 2024-10-26 05:42:30

Kubernetes基础组件概述的相关文章

iOS高可控性日历基础组件-SKCalendarView的使用和实现

简述 SKCalendarView是一个高可控性的日历基础组件,为了提高应用的自由度,默认只提供了日历部分的视图封装,但不涵盖切换月份按钮.年月分显示等非关键性控件,但请不要担心,SKCalendarView为你提供了多样性的API,你可以很轻松的拿到这些信息去展示在你自己的自定义控件中,以及对当前UI的修改:如:替换日历主题图片.节假日或特殊日期的日历背景.各种现实颜色等等.不仅如此,SKCalendarView还为你封装了公历.农历.节假日以及中国24节气的核心算法,即使你觉得默认的视图并不

关于Linux开源项目基础组件make编译流程

 关于Linux开源项目基础组件make编译流程 很多Linux开源项目都会用到编译出可执行文件的make,这个是有一套流程的. 首先,GNU构建系统:https://en.wikipedia.org/wiki/GNU_build_system 使用Autotool来编译和管理整个产品的生产流程. 就是下面这张图: 这里面需要先了解make和makefile make:https://en.wikipedia.org/wiki/Make_(software) makefile:https:/

VS2010 c# 怎样实现基础组件COM支持对接口IID的QueryInterface调用?急求。。。。

问题描述 VS2010c#怎样实现基础组件COM支持对接口IID的QueryInterface调用?急求....

Spring 三大基础组件简介

    一,Bean,Core,Context关系   在Spring的各种组件中,Bean,Core,Context算是基础组件(ExpressionLanguage表达式支持, 这个主要就是用来支持一些spring XML配置文件表达式 和 注解中一些表达式解析,让配置有动态特性,spring早期的版本是没有这货的,不算是特别必须的, 特别核心的东西,只是为了灵活性加的),在Core container这一层构建起了整个Spring的骨骼架构.在Spring中,强调的是对Bean的管理 ,所

AspNetPager分页组件概述

引言 在基于Asp.net的内网系统中,分页功能是最常用的,用的最多的组件就是AspNetPager. AspNetPager 官网:http://www.webdiyer.com/aspnetpager/ 官网也提供了存储过程的生成工具,这里还是自己动手写吧,顺便在学习一下存储过程的语法: CREATE PROC Paged @pageIndex INT, @pageCount INT OUTPUT, @pageSize INT AS DECLARE @count INT SELECT @co

HeartBeat 集群组件概述

Heartbeat 是一个基于Linux开源的高可用集群系统.主要包括心跳服务和资源接管两个高可用集群组件.心跳监测服务可以通过网络链路和串口进行,而且支持冗余链路, 它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务.本文简要描述了heartbeat v2集群架构组件及其相关概念,供大家参考. 一.高可用集群的特点 高可用服务 通常使用集群方式实现,这也是集群的最大作用和体现. 其

[android]android5大基础组件深入分析

5 Basic Components 1. Activity 2. Service 3. Broadcast Receiver 4. Content Provider 5. Intent Activity -- 应用表示层(基类Activity)        应用程序中的每个屏幕都是通过继承和扩展基类Activity来实现的.        同一应用中的每个Activity是相互独立的.程序启动后显示的第一幅画面是应用程序的第一个Activity(默认窗口),而后可以根据需要从这个Activi

JS基础知识概述

web页面的组成部分 HTML:定义了网页的内容 CSS:描述了网页的布局 JavaScript:网页的行为 完整的JavaScript 完整的JavaScript实现包含三个部分:ECMAScript,DOM(文档对象模型)和BOM(浏览器对象模型) DOM (Document Object Model)(文档对象模型)是用于访问 HTML 元素的正式 W3C 标准 JavaScript 是脚本语言 1.JavaScript 是一种轻量级但功能强大的可插入 HTML 页面的编程语言,语法规则定

Windows XP无线部署技术和组件概述

工作站工作站 (STA) 是指配备有无线局域网适配器的计算设备.配备有无线局域网适配器的个人计算机称为无线客户端.无线客户端可以直接相互通信或者通过无线访问点进行通信.无线客户端可以移动.无线访问点无线访问点 (AP) 是配备有无线局域网适配器的网络设备,它充当 STA 和传统有线网络之间的网桥.访问点包含:至少一个将 AP 连接到现有有线网络的接口( 例如,以太网干线).与无线客户端建立无线连接的无线电接收设备.IEEE 802.1D 桥接软件,以便它可以充当无线数据链接层与有线数据链接层之间