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…

[转载] C Primer Plus 第6章 C控制语句 6.16 编程练习及答案

参考链接: 用Python打印金字塔图案的程序 2019独角兽企业重金招聘Python工程师标准>>> 1、编写一个程序,创建一个具有26个元素的数组,并在其中存储26个小写字母。并让该程序显示该数组的内容。 #include int main (void) { …

C# String和string的区别

C#中同时存在String与string MSDN中对string的说明: string is an alias for String in the .NET Framework。string是String的别名而已,string是c#中的类,String是Framework的类,C# string 映射为 Framework的 String。如果用str…

要求用户在Python中输入整数| 限制用户仅输入整数值

input() function can be used for the input, but it reads the value as a string, then we can use the int() function to convert string value to an integer. input()函数可用于输入,但它将值读取为字符串,然后可以使用int()函数将字符串值转换为…

[转载] python——if语句、逻辑运算符号

参考链接: 用Python链接比较运算符 1.if条件判断语句: if 要判断的条件(True): 条件成立的时候,要做的事情 elif 要判断的条件(True): .... elif 要判断的条件(True): .... else: 条件不成立的时候要做的事情 示例: 判断学生…

洛谷 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. 单个链表包含许多节点,其中每个节点都有一…

[转载] python中for语句用法_详解Python中for循环的使用_python

参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 “探索 Python,第 5 部分:用 Python 编程” 一文讨论了 if 语句和…

windows 软链接的建立及删除

在windows服务器上有时有这样的需求,你的文件在f:\test中,但由于其它原因用户访问的是e:\test,如果又希望e:\test 中的文件与f:\test的保持同步,除了用同步软件来做外,可以用windows 的文件夹映射来做 cmd: mklink /J …

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? 任何计算机或机器都按照某些…

[转载] 使用Python编写打字训练小程序

参考链接: 在Python中切换大小写(替换) 你眼中的程序猿 别人眼中的程序猿,是什么样子?打字如飞,各种炫酷的页面切换,一个个好似黑客般的网站破解。可现实呢? 二指禅的敲键盘,写一行代码&#…

shell两个数字相乘_使用8086微处理器将两个16位数字相乘而不带进位

shell两个数字相乘Problem statement: 问题陈述: To perform multiplication operation between 2 16bit numbers with carry using 8086 Microprocessor. 使用8086微处理器在2个16位数字之间进行带进位的乘法运算。 Algorithm: 算法: Load the first…

Dwr 框架简单实例

Dwr 是一个 Java 开源库,帮助你实现Ajax网站。 它可以让你在浏览器中的Javascript代码调用Web服务器上的Java,就像在Java代码就在浏览器中一样。 Dwr 主要包括两部分: 在服务器上运行的 Servlet 来处理请求并把结果返回浏览器。 运行在浏览器…

[转载] Python进阶:设计模式之迭代器模式

参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案。在一本圣经级的书籍《设计模式:可复用面向对…

JavaScript | 如何为变量分配十进制,八进制和十六进制值?

Just like C programming language, we can assign integer value in the different format to the variable. 就像C编程语言一样 ,我们可以将不同格式的整数值分配给变量。 Assigning decimal value: It can be assigned simply without using any prefix. 分配十…

路由器DHCP和DHCP中继的配置

路由器 DHCP和DHCP中继的配置 路由器作为DHCP服务器: 1.配置router的地址:Route(config)# hostname gateway (更改主机名字) Gateway(config)# interface gigabitethernet 0/0 …

[转载] 大数据分析Python For循环教程

参考链接: Python中的迭代器函数1 大数据分析Python除了循环遍历列表之外,for循环还有很多其他功能,在现实世界的数据科学工作中,您可能需要将numpy数组和pandas DataFrames用于其他数据结构的循环。 大数据分析Python For循环教…

node.js 爬虫入门总结

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

数组重复次数最多的元素递归_使用递归计算链接列表中元素的出现次数

数组重复次数最多的元素递归Solution: 解: Required function: 所需功能: func_occurence ( node *temp) //recursive functionInput: 输入: A singly linked list whose address of the first node is stored in a pointer, say head and…

SecureCRT中文乱码解决方法

服务端export LANGzh_CN.UTF-8客户端SecureCRT编码选择UTF-8客户端SecureCRT字体选择新宋体,字符集选择中文总结:客户端和服务端字符编码一致,客户端字体字符集支持转载于:https://blog.51cto.com/leomars/1972669