Kubernetes初探:原理及实践应用

Kubernetes是Google开源的容器集群管理系统。它构建Ddocker技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等整一套功能,本质上可看作是基于容器技术的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各组件的二进制可执行文件。有以下两种方式获取:

下载源代码自己编译: git clone https://github.com/GoogleCloudPlatform/kubernetes.git  

cd kubernetes/build  

./release.sh  
直接下载人家已经编译打包好的tar文件: wget https://storage.googleapis.com/kubernetes/binaries.tar.gz

自己编译源码需要先安装好golang,编译完之后在kubernetes/_output/release-tars文件夹下可以得到打包文件。直接下载的方式不需要安装其他软件,但可能得不到最新的版本。

第二步,我们还需要etcd的二进制可执行文件,通过如下方式获取:

wget https://github.com/coreos/etcd/releases/download/v0.4.6/etcd-v0.4.6-linux-amd64.tar.gz 

tar xvf etcd-v0.4.6-linux-amd64.tar.gz  

第三步,就可以启动各个组件了:

etcd

cd etcd-v0.4.6-linux-amd64  

./etcd  

apiserver

./apiserver \  

-address=127.0.0.1 \  

-port=8080 \  

-portal_net="172.0.0.0/16" \  

-etcd_servers=http://127.0.0.1:4001 \  

-machines=127.0.0.1 \  

-v=3 \  

-logtostderr=false \  

-log_dir=./log  

scheduler

./scheduler -master 127.0.0.1:8080 \  

-v=3 \  

-logtostderr=false \  

-log_dir=./log

controller-manager

./controller-manager -master 127.0.0.1:8080 \  

-v=3 \  

-logtostderr=false \  

-log_dir=./log  

kubelet

./kubelet \  

-address=127.0.0.1 \  

-port=10250 \  

-hostname_override=127.0.0.1 \  

-etcd_servers=http://127.0.0.1:4001 \  

-v=3 \  

-logtostderr=false \  

-log_dir=./log

创建pod

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

{  

  "id": "redis",  

  "desiredState": {  

    "manifest": {  

      "version": "v1beta1",  

      "id": "redis",  

      "containers": [{  

        "name": "redis",  

        "image": "dockerfile/redis",  

        "imagePullPolicy": "PullIfNotPresent",  

        "ports": [{  

          "containerPort": 6379,  

          "hostPort": 6379  

        }]  

      }]  

    }  

  },  

  "labels": {  

    "name": "redis"  

  }  

}  

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

./kubecfg -c redis.json create /pods

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

# ./kubecfg list /pods  

ID                  Image(s)            Host                Labels              Status  

----------          ----------          ----------          ----------          ----------  

redis               dockerfile/redis    127.0.0.1/          name=redis          Running    

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

# docker ps  

CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS                    NAMES  

ae83d1e4b1ec        dockerfile/redis:latest   "redis-server /etc/r   19 seconds ago      Up 19 seconds                                k8s_redis.caa18858_redis.default.etcd_1414684622_1b43fe35  

创建replicationController

{  

    "id": "redisController",  

    "apiVersion": "v1beta1",  

    "kind": "ReplicationController",  

    "desiredState": {  

      "replicas": 1,  

      "replicaSelector": {"name": "redis"},  

      "podTemplate": {  

        "desiredState": {  

           "manifest": {  

             "version": "v1beta1",  

             "id": "redisController",  

             "containers": [{  

               "name": "redis",  

               "image": "dockerfile/redis",  

               "imagePullPolicy": "PullIfNotPresent",  

               "ports": [{  

                   "containerPort": 6379,  

                   "hostPort": 6379  

               }]  

             }]  

           }  

         },  

         "labels": {"name": "redis"}  

        }},  

    "labels": {"name": "redis"}  

  }

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

./kubecfg -c redisController.json create /replicationControllers 

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

# ./kubecfg list /replicationControllers  

ID                  Image(s)            Selector            Replicas  

----------          ----------          ----------          ----------  

redisController     dockerfile/redis    name=redis          1  

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

原文链接: Kubernetes初探(责编:周小璐)

如需要了解更多Docker相关的资讯或是技术文档可访问Docker技术社区;如有更多的疑问请在Dcoker技术论坛提出,我们会邀请专家回答。购票等问题可咨询QQ群:303806405。

Container技术日报公众账号已开启,欢迎关注!

时间: 2024-11-03 21:26:03

Kubernetes初探:原理及实践应用的相关文章

DockOne微信分享(一四四):BizCloud:基于Kubernetes的私有云实践

[编者的话]随着搜狗业务的快速增长,需要更有效地控制成本,提升研发效率,我们基于Docker和Kubernetes构建了一站式私有云管理平台--BizCloud,此平台涵盖服务管理.弹性伸缩.灰度发布.自动运维.持续集成等功能.本文将简要介绍BizCloud的设计思路.架构及服务发现.授权.灰度发布等核心功能的实现. BizCloud简介 本文将的是DockOne微信分享(一四四):BizCloud:基于Kubernetes的私有云实践我们基础环境非常复杂,目前有多个版本操作系统共存,应用也常常

DockOne微信分享(一三九):基于Kubernetes的应用编排实践

本文讲的是DockOne微信分享(一三九):基于Kubernetes的应用编排实践[编者的话]近年容器的使用越来越深入,越来越多的服务采用容器的方式进行部署.但随着服务数量的增加,如何管理服务之间的依赖关系,如何对多个服务之间的更新与部署进行管理,如何在新的环境中实现多个服务的快速部署.这些问题都希望通过基于Kubernetes应用编排管理来解决,从而实现对于复杂多服务系统的快速部署和高效管理. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资

学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

原文 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践 感谢大家在上一篇 学一点Git--20分钟git快速上手 里的踊跃发言.这里再次分享干货, 简单介绍mysql双机,多机异地热备简单原理实战. 双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一 致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换到另一个. 2. 可以做负载均衡,可以将请求分摊到其中任何一台上

《 C++程序设计:原理与实践(进阶篇.》导读

本节书摘来自华章出版社< C++程序设计:原理与实践(进阶篇)>一书中作者[美] 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著 刘晓光 李忠伟 王刚 译     前 言 Programming: Principles and Practice Using C++, Second Edition 该死的鱼雷!全速前进. --Admiral Farragut 程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在寻找求解方案以及对其求精上

c++-关于《C++程序设计原理与实践》第3章例子的一个问题

问题描述 关于<C++程序设计原理与实践>第3章例子的一个问题 本人菜鸟,现正在学习C++.<C++程序设计原理与实践>第3章有一个例子,代码如下: #include #include #include #include #include using namespace std; inline void keep_window_open(){ char ch; cin >> ch; } int main() //C++ Programs start by executi

推荐系统——从原理到实践,还有福利赠送!

之前流水账似的介绍过一篇机器学习入门的文章,大致介绍了如何学习以及机器学习的入门方法并提供了一些博主自己整理的比较有用的资源.这篇就尽量以白话解释并介绍机器学习在推荐系统中的实践以及遇到的问题... 也许很多点在行家的眼里都是小菜一碟,但是对于刚刚接触机器学习来说,还有很多未知等待挑战. 所以读者可以把本篇当做是机器学习的玩具即可,如果文中有任何问题,还请不吝指教. 本篇将会以下面的步骤描述机器学习是如何在实践中应用的: 1 什么是推荐系统? 2 机器学习的作用 3 机器学习是如何使用的? 4

源代码-C++程序设计原理与实践

问题描述 C++程序设计原理与实践 #include "std_lib_facilities.h" int main() { cout<<"Hello,world!n"; return 0; } 我下了源代码,放到那里才能猜VC98编译时不出错?最好详细点,带有图解 解决方案 ...大哥,都什么年代了还用98

RocketMQ的原理与实践

备注: 1.如果您此前未接触过RocketMQ,请先阅读附录部分,以便了解RocketMQ的整体架构和相关术语 2.文中的MQServer与Broker表示同一概念 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回避不了两个问题: 消息的顺序问题 消息的重复问题 RocketMQ作为阿里开源的一款高性能.高吞吐量的消息中间件,它是怎样来解决这两个问题的?RocketMQ 有哪些关键特性?其实现原理是怎样的? 关键特性以及其实现

深入解析SQL Server并行执行原理及实践(下)

谈完并行执行的原理,咱们再来谈谈优化,到底并行执行能给我们带来哪些好处,我们又应该注意什么呢,下面展开.   Amdahl's  Law    再谈并行优化前我想有必要谈谈阿姆达尔定律,可惜老爷子去年已经驾鹤先去了.     其中  P:可以并行的百分比 N:算法并行计算使用的"CPU"    这里我们举个简单的例子,我们来做一份大餐,如图1-1所示:   图1-1   土豆泥,荷兰豆,鸡排还有整体组合各需十分钟.在这里前三个食材是可以共同执行的,也就是说4个步骤中3步可并行 P=3/