Kubernetes是Google开源的容器集群管理系统。它构建于docker技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等整一套功能,本质上可看作是基于容器技术的mini-PaaS平台。本文旨在梳理Kubernetes的架构、概念及基本工作流,并且通过运行一个简单的示例应用来介绍如何使用Kubernetes。
 
总体概览
 
如下图所示是我初步阅读文档和源代码之后整理的总体概览,基本上可以从如下三个维度来认识Kubernetes。
 
操作对象
 
Kubernetes以RESTFul形式开放接口,用户可操作的REST对象有三个:
  • pod:是Kubernetes最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。比如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod。
  • service:是pod的路由代理抽象,用于解决pod之间的服务发现问题。因为pod的运行状态可动态变化(比如切换机器了、缩容过程中被终止了等),所以访问端不能以写死IP的方式去访问该pod提供的服务。service的引入旨在保证pod的动态变化对访问端透明,访问端只需要知道service的地址,由service来提供代理。
  • replicationController:是pod的复制抽象,用于解决pod的扩容缩容问题。通常,分布式应用为了性能或高可用性的考虑,需要复制多份资源,并且根据负载情况动态伸缩。通过replicationController,我们可以指定一个应用需要几份复制,Kubernetes将为每份复制创建一个pod,并且保证实际运行pod数量总是与该复制数量相等(例如,当前某个pod宕机时,自动创建新的pod来替换)。
可以看到,service和replicationController只是建立在pod之上的抽象,最终是要作用于pod的,那么它们如何跟pod联系起来呢?这就要引入label的概念:label其实很好理解,就是为pod加上可用于搜索或关联的一组key/value标签,而service和replicationController正是通过label来与pod关联的。如下图所示,有三个pod都有label为"app=backend",创建service和replicationController时可以指定同样的label:"app=backend",再通过label selector机制,就将它们与这三个pod关联起来了。例如,当有其他frontend pod访问该service时,自动会转发到其中的一个backend pod。
 
功能组件
 
如下图所示是官方文档里的集群架构图,一个典型的master/slave模型。
master运行三个组件:
  • apiserver:作为kubernetes系统的入口,封装了核心对象的增删改查操作,以RESTFul接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。
  • scheduler:负责集群的资源调度,为新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。
  • controller-manager:负责执行各种控制器,目前有两类:
    • endpoint-controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。
    • replication-controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。
slave(称作minion)运行两个组件:
  • kubelet:负责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。
  • proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。
 
工作流
 
上文已经提到了Kubernetes中最基本的三个操作对象:pod, replicationController及service。下面分别从它们的对象创建出发,通过时序图来描述Kubernetes各个组件之间的交互及其工作流。
 
 
 
 

使用示例

 

最后,让我们进入实战模式,这里跑一个最简单的单机示例(所有组件运行在一台机器上),旨在打通基本流程。

搭建环境

第一步,我们需要Kuberntes各组件的二进制可执行文件。有以下两种方式获取:

  • 下载源代码自己编译:
  1. git clone https://github.com/GoogleCloudPlatform/kubernetes.git
  2. cd kubernetes/build
  3. ./release.sh
  • 直接下载人家已经编译打包好的tar文件:
  1. wget https://storage.googleapis.com/kubernetes/binaries.tar.gz
自己编译源码需要先安装好golang,编译完之后在kubernetes/_output/release-tars文件夹下可以得到打包文件。直接下载的方式不需要安装其他软件,但可能得不到最新的版本。
 
第二步,我们还需要etcd的二进制可执行文件,通过如下方式获取:
  1. wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz
  2. tar xvf etcd-v0.4.6-linux-amd64.tar.gz
第三步,就可以启动各个组件了:
etcd
  1. cd etcd-v0.4.6-linux-amd64
  2. ./etcd
apiserver
  1. ./apiserver \
  2. -address=127.0.0.1 \
  3. -port=8080 \
  4. -portal_net="172.0.0.0/16" \
  5. -etcd_servers=http://127.0.0.1:4001 \
  6. -machines=127.0.0.1 \
  7. -v=3 \
  8. -logtostderr=false \
  9. -log_dir=./log

scheduler

  1. ./scheduler -master 127.0.0.1:8080 \
  2. -v=3 \
  3. -logtostderr=false \
  4. -log_dir=./log
controller-manager
  1. ./controller-manager -master 127.0.0.1:8080 \
  2. -v=3 \
  3. -logtostderr=false \
  4. -log_dir=./log

kubelet

  1. ./kubelet \
  2. -address=127.0.0.1 \
  3. -port=10250 \
  4. -hostname_override=127.0.0.1 \
  5. -etcd_servers=http://127.0.0.1:4001 \
  6. -v=3 \
  7. -logtostderr=false \
  8. -log_dir=./log

创建pod
搭好了运行环境后,就可以提交pod了。首先编写pod描述文件,保存为redis.json:

  1. {
  2. "id": "redis",
  3. "desiredState": {
  4. "manifest": {
  5. "version": "v1beta1",
  6. "id": "redis",
  7. "containers": [{
  8. "name": "redis",
  9. "image": "dockerfile/redis",
  10. "imagePullPolicy": "PullIfNotPresent",
  11. "ports": [{
  12. "containerPort": 6379,
  13. "hostPort": 6379
  14. }]
  15. }]
  16. }
  17. },
  18. "labels": {
  19. "name": "redis"
  20. }
  21. }

然后,通过命令行工具kubecfg提交:

  1. ./kubecfg -c redis.json create /pods

提交完后,通过kubecfg查看pod状态:

  1. # ./kubecfg list /pods
  2. ID                  Image(s)            Host                Labels              Status
  3. ----------          ----------          ----------          ----------          ----------
  4. redis               dockerfile/redis    127.0.0.1/          name=redis          Running

Status是Running表示pod已经在容器里运行起来了,可以用"docker ps"命令来查看容器信息:

  1. # docker ps
  2. CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                    NAMES
  3. ae83d1e4b1ec        dockerfile/redis:latest   "redis-server /etc/r   19 seconds ago      Up 19 seconds                                k8s_redis.caa18858_redis.default.etcd_1414684622_1b43fe35

创建replicationController

  1. {
  2. "id": "redisController",
  3. "apiVersion": "v1beta1",
  4. "kind": "ReplicationController",
  5. "desiredState": {
  6. "replicas": 1,
  7. "replicaSelector": {"name": "redis"},
  8. "podTemplate": {
  9. "desiredState": {
  10. "manifest": {
  11. "version": "v1beta1",
  12. "id": "redisController",
  13. "containers": [{
  14. "name": "redis",
  15. "image": "dockerfile/redis",
  16. "imagePullPolicy": "PullIfNotPresent",
  17. "ports": [{
  18. "containerPort": 6379,
  19. "hostPort": 6379
  20. }]
  21. }]
  22. }
  23. },
  24. "labels": {"name": "redis"}
  25. }},
  26. "labels": {"name": "redis"}
  27. }

然后,通过命令行工具kubecfg提交:

  1. ./kubecfg -c redisController.json create /replicationControllers

提交完后,通过kubecfg查看replicationController状态:

  1. # ./kubecfg list /replicationControllers
  2. ID                  Image(s)            Selector            Replicas
  3. ----------          ----------          ----------          ----------
  4. redisController     dockerfile/redis    name=redis          1

同时,1个pod也将被自动创建出来,即使我们故意删除该pod,replicationController也将保证创建1个新pod。

Kubernetes(一)初探的更多相关文章

  1. K8s的工作原理

    title: Kubernetes之初探 subtitle: K8s的工作原理 date: 2018-09-18 18:26:37 --- K8s概述 我清晰地记得曾经读到过的一篇博文,上面是这样写的 ...

  2. ASP.NET Core on K8S 入门学习系列文章目录

    一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...

  3. 云原生时代, Kubernetes 多集群架构初探

    为什么我们需要多集群? 近年来,多集群架构已经成为“老生常谈”.我们喜欢高可用,喜欢异地多可用区,而多集群架构天生就具备了这样的能力.另一方面我们也希望通过多集群混合云来降低成本,利用到不同集群各自的 ...

  4. Kubernetes集群初探

    上文我们在一台虚机上演示了Kubernetes基于redis和docker的guestbook留言簿案例,本文我们将通过配置Kubernetes集群的方式继续深入研究.集群组件安装如下配置. IP N ...

  5. Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

    Kubernetes简介 Kubernetes是Google基于Borg开源的容器编排调度引擎,作为CNCF(Cloud Native Computing Foundation)最重要的组件之一,它的 ...

  6. Kubernetes 初探

    一.容器: 1. 容器是运行一个或一组进程的方法,使得这些进程和主机上其他进程相隔离 2. 容器类似于虚拟机,但不同于虚拟机 容器                                    ...

  7. Kubernetes初探 :总体概述及使用示例

    Kubernetes是Google开源的容器集群管理系统.它构建于docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于容器技术的mini-Pa ...

  8. Kubernetes初探:原理及实践应用

    总体概览 如下图所示是我初步阅读文档和源代码之后整理的总体概览,基本上可以从如下三个维度来认识Kubernetes. 操作对象 Kubernetes以RESTFul形式开放接口,用户可操作的REST对 ...

  9. Kubernetes系列:(1) 初探

    1. 背景 在部门内容组织了一次K8s的培训,普及了下K8s的概念.框架.操作等,为便于后期查阅,也为了进一步深究K8s,因此开展K8s系列,周期不定- 2. 概念 (1) 含义:来自希腊语,意为&q ...

随机推荐

  1. Disable Oracle Automatic Jobs

    By default, Oracle will run some maintance jobs every night. If you don't want to run those jobs, yo ...

  2. JIT编译器

    深入理解Java Class文件格式(九) http://blog.csdn.net/zhangjg_blog/article/details/22432599 http://blog.csdn.ne ...

  3. 窗体彻底关闭事件FormClosed

    //Application.Exit()是退出整个应用程序 Application.ExitThread();//强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题 System.Dia ...

  4. jquery+asp.net 调用百度geocoder手机浏览器定位--Api介绍及Html定位方法

    原文来自:***/projecteactual/jqueryaspnetbaidugeocodermobilebrowserposition.html 在做一个社区项目中,支持移动浏览器进行选择地区和 ...

  5. 二分箭术--G&K稳健过神思路

    自从资料片开始,一直在思考稳定可靠的过神思路,现在有眉目了,试验了几把感觉不错,先分享如下: 1)只开2个分城,特殊情况除外.Re: 经过多次打的经验,开2个分城比开3个分城更容易选址,政策更快,快乐 ...

  6. Python 里 and、or 的计算规则

    引子: >>> print '' or 5 or 05>>> print 5 and 44>>> print '' or 5 or 0 and 4 ...

  7. 孙鑫VC++视频教程笔记

    写在前面的话:在学习孙鑫老师的VC++视频时,为了加深自己对知识的深入理解,就做了下面的笔记. 第一讲: 第二讲: 第三讲: 第四讲: 第五讲: 第六讲: 第七讲: 第八讲: 第九讲: 第十讲: 第十 ...

  8. Mysql通过一个限制条件,查出多条不同的记录

    表1和表2是不同数据库中的同名table,但是发现表1中的查询和表2中的查询有区别,(事实是表1的查询是对的.) 表1的查询结果 mysql> select * from slot_value ...

  9. c++之——template模板函数

    为了实现与数据类型无关的编程,模板应运而生: #include<iostream> #include<string.h> using namespace std; templa ...

  10. 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼【转】

    摘要: 这篇文章给大家带来<五大主流浏览器 HTML5 和 CSS3 兼容性大比拼>,让我们一起来看看2013年的浏览器现状.浏览器厂商之间的竞争促使各大浏览器对 HTML5 和 CSS3 ...