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基础组件概述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言将链表写入二进制文件_通过逐级遍历将二进制树转换为单链表的C程序

c语言将链表写入二进制文件Problem statement: Write a C program to convert a binary tree into a single linked list by traversing level-wise. 问题陈述:编写一个C程序,通过逐级遍历将二进制树转换为单个链表 。 Example: 例: The ab…

洛谷 P2689 东南西北【模拟/搜索】

题目描述 给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地。求到达终点的最少时间。 如果无法偏移至终点,输出“-1”。 输入输出格式 输入格式: 第一行两个正整数x1,y1,表示小明所…

单链表遍历_单链表及其遍历实现的基本操作

单链表遍历单链表 (Single linked list) Single linked list contains a number of nodes where each node has a data field and a pointer to next node. The link of the last node is to NULL, indicates end of list. 单个链表包含许多节点,其中每个节点都有一…

8086简单的指令流水线_在8086微处理器中执行流水线的指令和概念的步骤

8086简单的指令流水线Any computer or machine works according to some instructions. These instructions are responsible for all the work that the machine does. But how does a machine work to understand and execute that instruction? 任何计算机或机器都按照某些…

node.js 爬虫入门总结

node.js爬虫 前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 php , python 等。当然这是在 nodejs 前了,nodejs 的出现,使得 Javascript 也可以用来写爬虫了。由于 nodejs 强大的异步特性&#xf…

将八进制数制转换为二进制,十进制和十六进制数制

1)将八进制数制转换为二进制数制 (1) Conversion of Octal Number System to Binary Number System) To convert octal numbers into binary numbers, we can use the relationship between octal and binary numbers. 要将八进制数转换为二进制数,我们可以使用八进…

想提高用户访问的响应速度和成功率还不赶快学习CDN

2019独角兽企业重金招聘Python工程师标准>>> 课程介绍 CDN可以将源站内容分发至最接近用户的节点,使用户可就近取得所需内容,提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题,适用于站点加速、点…

Python 核心编程(第二版)——条件和循环

Python 中的 if 子句由三部分组成: 关键字本身,用于判断结果真假的条件表达式, 以及当表达式为真或者非零时执行的代码块。if 语句的语法如下: if expression: expr_true_suite 单个 if 语句可以通过使用布尔操作符 and , or 和 not实现多重判断条件或…

Silverlight 异步单元测试

Silverlight 中的很多操作都是异步的,很多情况下要求单元测试也是异步的,但是介绍异步单元测试的文档很少。通过对 Silverlight Toolkit 中的 Microsoft.Silverlight.Testing 和 Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight 这两个文件…

Wafer晶圆封装工艺介绍

芯片封装的目的(The purpose of chip packaging): 芯片上的IC管芯被切割以进行管芯间连接,通过引线键合连接外部引脚,然后进行成型,以保护电子封装器件免受环境污染(水分、温度、污染物等)&…

iOS:个人浅谈工厂模式

一、什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了…

wrf 嵌套网格作用_在网格系统中使用响应列,嵌套列和偏移列 引导程序

wrf 嵌套网格作用介绍 (Introduction) In the previous article, we have learnt what is grid and grid system and how it works? Now, we will learn about how Responsive column, Nesting Columns and Offset Columns works and how to use them? If you have any doubt…

[看书笔记]《深入java虚拟机》——java体系结构(二)

java虚拟机的三种含义: - 抽象的规范 - 一个具体的实现 - 一个运行中的虚拟机实例 ---------------------java虚拟机的生命周期: java虚拟机实例的天职就是负责运行一个java程序。 启动一个java程序,一个虚拟机实例诞生了;程序关闭…

全新的membership框架Asp.net Identity(1)——.Net membership的历史

在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改变,都使得验证框架更加的适应变化和可定制。这篇文章是Asp.net Identity系列的开篇,主要就membersh…

二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...

复习编写一个控制台应用程序,目标是在控制台输出“Hello World” 1.第一步,打开Visual Studio 2012以上版本(我用的是VS 2015),打开完成后出现以下界面 2.第二步,这时候就要新建一个解决方案了,创建解决方案可以直接点…

node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第1部分)| Node.js

node oauth2验证In my last articles, we looked at the implementation of the passport-local authentication strategy. We also looked at the various requirements to get started with the login form. 在上一篇文章中,我们介绍了护照本地身份验证策略的实现…

RYU控制器安装`

2019独角兽企业重金招聘Python工程师标准>>> 同样是参考了http://linton.tw/2014/02/11/note-how-to-set-up-ryu-controller-with-gui-component/的内容。 1. 由于Ubuntu中自带有Python,因此直接开始安装pip apt-get install python-pip apt-get i…

数据库连接池的设计思路及java实现

2019独角兽企业重金招聘Python工程师标准>>> connectionPool.DBConnectionManager [java] view plain copy package connectionPool; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; i…

窄带物联网(NB-IoT)初步了解

哪有什么天生如此,只是我们天天坚持。既然总有人要赢的话,为什么不能是我呢?[TOC] 什么是NB-Iot? 基于蜂窝的窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支。NB-IoT构建于蜂窝网…

JavaOne大事纪:IBM谈OpenJ9和Open Liberty

JavaOne大会以IBM陈述其最近对开源社区的贡献作为开场:OpenJ9、Open Liberty和MicroProfile。IBM杰出工程师John Duimovich做了“IBM和Java:助力下一代创新”的开场演讲。\\读者可以回看演讲视频。\\Duimovich说IBM之所以致力于推动Java生态系统的创新&a…