Kubernetes 设计概要
英文原文:Kubernetes Design Overview
OverviewKubernetes builds on top of Docker to construct a clustered container scheduling service. The goals of the project are to enable users to ask a Kubernetes cluster to run a set of containers. The system will automatically pick a worker node to run those containers on. As container based applications and systems get larger, some tools are provided to facilitate sanity. This includes ways for containers to find and communicate with each other and ways to work with and manage sets of containers that do similar work. When looking at the arechitecture of the system, we'll break it down to services that run on the worker node and services that play a "master" role. |
译者信息![]() 概述Kubernetes基于Docker,其构建了一个集群容器的调度服务。该项目的目标是运行用户在Kubernetes集群上运行一系列容器。系统会自动在这些容器上选择一个工作节点。 由于基于容器的应用和系统不断变大,一些提供便捷智能的工具出现了。这包括容器间发现和彼此的沟通方式,以及与容器管理集的协作方法等类似工作。 当审视系统的架构时,我们希望将架构打破,将其变为那些运行在工作节点和服务上的“master”角色。 |
Key Concept: Container PodWhile Docker itself works with individual containers, Kubernetes works with a The Kubernetes NodeThe Kubernetes node has the services necessary to run Docker containers and be managed from the master systems. The Kubernetes node design is an extension of the Container-optimized Google Compute Engine image. Over time the plan is for these images/nodes to merge and be the same thing used in different ways. It has the services necessary to run Docker containers and be managed from the master systems. Each node runs Docker, of course. Docker takes care of the details of downloading images and running containers. |
译者信息![]() 关键概念:Pod容器Docker本身是一个独立的容器,然而Kubernetes则基于一个pod容器。所谓的pod是指一组被安排到相同的物理节点上的容器。除了定义运行在pod的容器,pod中的容器都使用相同的网络命名空间/IP并且定义了一组存储卷。端口则基于每个pod基础上进行部署。 Kubernetes节点Kuberneter节点包含运行Docker容器的必须服务,并且可以被主系统管理。 Kuberneter节点是基于容器优化的谷歌计算引擎图像的扩展而设计的。随着时间的推移,该计划主要为了对这些图像/节点进行合并,使之以不同的方式使用同样的事情。它包含运行Docker容器的必须服务,并且可以被主系统管理。 当然,每一个节点都运行着Docker。Docker关注下载图像和运行容器的详细信息。 |
KubeletThe second component on the node is called the The Kubelet works in terms of a container manifest. A container manifest (defined here) is a YAML file that describes a There are 4 ways that a container manifest can be provided to the Kubelet:
|
译者信息![]() Kubelet节点上的第二个组件叫做kubelet。Kubelelet是容器代理的逻辑后继者(用Go重写),它是计算引擎图像的一部分。 Kubelet工作于容器清单。容器清单是一个描述了pod的YAML文件(定义在这儿)。Kubelet采用了一组不同机制提供的清单,并确保这些清单描述的容器已启动并继续运行。 容器清单可以为Kubelet提供四种方式:
|
Kubernetes ProxyEach node also runs a simple network proxy. This reflects The Kubernetes MasterThe Kubernetes master is split into a set of components. These work together to provide an unified view of the cluster. etcdAll persistent master state is stored in an instance of |
译者信息![]() Kubernetes代理每个节点此外还运行着一个简单的网络代理。它反射了定义在 Kubernetes API 中每个节点上的service,并且可以在一组后端做简单的 TCP流转发或TCP循环转发。 Kubernetes MasterKuberneters 控制被分到了一系列的组件中。这些组件工作在一起,提供统一的集群视图。 etcd所有持久化的控制状态都被存储在一个etcd的实例中。这提供了一中非常可靠的存储配置数据的方式。通过watch支持,各个协调组件的变更通知可以是非常快速的查看到。 |
Kubernetes API ServerThis server serves up the main Kubernetes API. It validates and configures data for 3 types of objects:
Beyond just servicing REST operations, validating them and storing them in
|
译者信息![]() Kubernetes API服务器此服务器提供了主要的 Kubernetes API。 它将验证和配置3种对象类型的数据:
除了仅仅服务“其他”操作,校验和在etcd中存储,API服务器还要做其他两件事情:
|
Kubernetes Controller Manager ServerThe |
译者信息![]() Kubernetes控制管理服务器对于Kubernetes的使用来说,repliationController的类型描述并非严格必需。它实际是一个基于简单pod API的服务。在这一层上执行,其逻辑定义的repliationController实际上是被划分到其他的服务器上的。在服务器上查看etcd是为了改变repliationController对象和使用公共的KubernetesAPI去实现响应算法。 |
Key Concept: LabelsPods are organized using labels. Each pod can have a set of key/value labels set on it. Via a "label query" the user can identify a set of Label queries would typically be used to identify and group pods into, say, a tier in an application. You could also idenitfy the stack such as |
译者信息![]() 关键概念:标签pod用标签进行组织。每个pod具备一个key/value键值映射的标签。 通过“标签查询”,用户可以识别一系列的pod集合。这个简单的方法是services和replicationControllers如何工作的关键部分。一个service指向的pod集合由一个标签查询定义。类似的,由replicationController监听的pod的数量同样也是由标签查询定义。 标签查询通常会用于,我们讲,在一个应用程序层次上面识别和分组的pod。同样可以用来识别栈,例如dev、staging或者production。 |
These sets could be overlapping. For instance, a service might point to all pods with |
译者信息![]() 这些设置可以重复。举例来说,一项服务可能会通过tier in (frontend), stack in (pod)来指向所有的pod。那如果现在,你说你有10个pod的副本组成了这一层,但是你希望能够创建一个新的"canary"版本的组件,你可以通过标签 tier=fronted, stack=prod, canary=no 来为 大部分副本设置一个replicationController,另外通过标签tier=fronted, stack=prod, canary=yes为canary设置一个replicationController。现在服务就能够覆盖canary和非canary的pod。但因此你可能会搞混两个replicationController单独进行测试和监测得到的结果。 |
Network ModelKubernetes expands the default Docker networking model. The goal is to have each For the Google Compute Engine cluster configuration scripts, advanced routing is set up so that each VM has a extra 256 IP addresses that get routed to it. This is in addition to the 'main' IP address assigned to the VM that is NAT-ed for Internet access. The networking bridge (called |
译者信息![]() 网络模型Kuberneters扩展了默认的Docker网络模型。其目标是实现每一个pod都能在一个可通过网络与其他物理电脑和容器进行充分沟通的共享网络空间中有自己的Ip地址。通过这种方式,可以尽可能的减少部署端口。 对于谷歌计算引擎群集配置脚本,通过配置高级路由,使每个 VM 都有额外256个IP地址可以寻址到它。当然,这里面出去了为VM分配的主Ip地址,这个地址是用来接入互联网的。以区别于docker0的网络桥cbr0,通过正确设置Docker,仅作Nat功能,用来疏散网络流量,这里的网络不是指的虚拟网络。 |
Ports mapped in from the 'main IP' (and hence the internet if the right firewall rules are set up) are proxied in user mode by Docker. In the future, this should be done with Release ProcessRight now "building" or "releasing" Kubernetes consists of some scripts (in |
译者信息![]() 从 '主要 IP'(确保互联网防火墙被正确的配置)进行的端口映射都是Docker在用户模式下实现的。将来,这项工作应该由Kubelet或者Docker通过iptables实现:Issue#15。 发布过程现在"building"或者"releasing"Kubernetes由一些脚本(在release/下)组成,通过创建一个tar包来包含所需的数据,然后将它上传到谷歌云存储。在将来,我们将生成以上描述组件的大部分Docker图像:Issue#19。 |
GCE Cluster ConfigurationThe scripts and data in the
The heavy lifting of configuring the VMs is done by SaltStack. The bootstrapping works like this:
|
译者信息![]() GCE集群配置位于cluster/目录下的脚本和数据自动创建了一系列Google Compute Engine VM并且安装了所有的Kubernetes组件。这里有一个单独的主节点和一系列的工作者节点。 对于集群,config-default.sh中有一整套可调的定义/参数。 繁重的配置VM的操作由SaltStack完成。 引导这样工作: 1. kubeup.sh脚本对主节点和下属节点都采取GCE startup-script的方式进行操作。
2. SaltStack会在每个节点上安装必要的服务项。
3. VM启动之后,kube-up.sh脚本每2s会调用curl,直到apiserver开始响应。 kube-down.sh可以用来卸载整个集群。如果你build一个新的版本,需要升级你的集群,你可以用kube-push.sh进行升级和应用(用salt的术语就是highstate)salt配置。 |
Cluster SecurityAs there is no security currently built into the All communication within the cluster (worker nodes to the master, for instance) occurs on the internal virtual network and should be safe from eavesdropping. The password is generated randomly as part of the |
译者信息![]() 集群安全目前还没有建立安全的apiserver,salt的配置会安装Nginx。配置Night是为了使用带有签名证书的HTTPS。HTTP的基础认证使用的是来自客户端Nginx。Nginx会通过原来的HTTP发起对apiserver普通请求。由于使用了签名证书,从而保证了被访问服务器不遭到"man in the middle"的攻击被窃听。使用浏览器访问将导致警告和工具一样的需要”——不安全”的标志。 集群内的所有信息交流(例如,工作的节点)都在在内部虚拟网络中以免遭到窃听。 密码是随机生成的kube-up.sh脚本部分以及存储在kubernetes_auth 。 |
Kubernetes 设计概要的更多相关文章
- Kubernetes系列02—Kubernetes设计架构和设计理念
本文收录在容器技术学习系列文章总目录 1.Kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分 ...
- MySQL 索引设计概要
在关系型数据库中设计索引其实并不是复杂的事情,很多开发者都觉得设计索引能够提升数据库的性能,相关的知识一定非常复杂. 然而这种想法是不正确的,索引其实并不是一个多么高深莫测的东西,只要我们掌握一定的方 ...
- 腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊
转自:http://data.qq.com/article?id=817 三.Hermes设计概要 架构描述 系统核心进程均采用分散化设计,根据业务发展需求,可随意扩缩容机器; 周期性数据直接通过td ...
- (转)Kubernetes设计架构
转:https://www.kubernetes.org.cn/kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, ...
- k8s入坑之路(7)kubernetes设计精髓List/Watch机制和Informer模块详解
1.list-watch是什么 List-watch 是 K8S 统一的异步消息处理机制,保证了消息的实时性,可靠性,顺序性,性能等等,为声明式风格的API 奠定了良好的基础,它是优雅的通信方式,是 ...
- Google Kubernetes设计文档之服务篇-转
摘要:Kubernetes是Google开源的容器集群管理系统,构建于Docker之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等功能. Pod是创建.调度和管理的最小部署单位,本文详 ...
- RESTful API设计概要
一.简介 1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fiel ...
- Kubernetes设计架构
官方文档:https://www.kubernetes.org.cn/doc-11 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc), ...
- 【云计算】Docker云平台—Docker进阶
Docker云平台系列共三讲,此为第二讲:Docker进阶 参考资料: 五个Docker监控工具的对比:http://www.open-open.com/lib/view/open1433897177 ...
随机推荐
- Spring Cloud 学习笔记(一)——入门、特征、配置
[TOC] 0 放在前面 0.1 参考文档 http://cloud.spring.io/spring-cloud-static/Brixton.SR7/ https://springcloud.cc ...
- 服务器数据库挂掉 Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) ";
刚刚遇到这个报错,我无语了,我这么个菜逼,咋解决,还好师兄(付付)解决了,付付真棒,在此记录一下,以供学习 Can 't connect to local MySQL server through s ...
- Android分享功能实现
通过系统分享组件实现分享功能 Intent.createChooser() 方法用来弹出系统分享列表. createChooser(Intent target, CharSequence title, ...
- 响应式web-媒体查询
响应式web-媒体查询 媒体查询是一个将很多响应式概念和工具连接在一起的粘合剂.这些查询语句都是简单但是功能很强大的,它们允许我们检测设备属性,定义规则,并根据规则等的不同加载不同的 CSS 属性.例 ...
- 深入理解Java虚拟机 - 学习笔记 1
Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...
- Linux parent process and child process when 'sudo'
如果在一般用户下如user,执行sudo命令,会产生两个进程. ps -ef | grep Container root 4305 643 0 16:37 pts/39 00:00:00 sudo . ...
- linux centos7.0安装subversion
安装环境以及软件版本如下: subversion使用1.8.17版本,CentOS7.0(64位) 安装svn共需要使用如下软件,apr-1.5.2.tar.gz.apr-util-1.5.4.tar ...
- 连续分段累计器FPGA实现的探讨
- linux命令11
tar命令的使用 tar文件是把几个文件的(或)目录集合在一个文件夹里,是创建备份和归档的最佳工具. [root@localhost ~]# tar --help用法: tar [选项...] [FI ...
- OVS 中的 upcall 线程
总体概览如下: 假设upcall handler线程有两个,vport有四个,那么每个vport下都将持有两个NetLink连接的信息,这两个NetLink连接将被用来上送upcall消息. 每个Ne ...