Kubernetes初探:原理及实践应用

[日期:2014-11-03] 来源:CSDN 作者:张俊 [字体:大 中 小]

  总体概览

  如下图所示是我初步阅读文档和源代码之后整理的总体概览,基本上可以从如下三个维度来认识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初探:原理及实践应用相关推荐

  1. SpringCloud 应用在 Kubernetes 上的最佳实践 — 高可用(熔断)

    作者 | 宿何 导读:前几篇我们主要站在应用发布的场景,描述在发布过程中会遇到的灰度.监控.回滚.优雅上下线等保障发布能顺利进行的注意事项.作为一个程序员 GG,可灰度的发布顺利上线往往意味着准点下班 ...

  2. SpringCloud 应用在 Kubernetes 上的最佳实践 — 线上发布(可回滚)

    作者 | 长门 **导读:**本篇是<SpringCloud 应用在 Kubernetes 上的最佳实践>系列文章的第七篇,主要介绍了新功能上线时,如何尽快减少对线上用户的影响?发布系统需 ...

  3. Kubernetes入门——Kubernetes工作原理及使用

    作者简介: 星龙 百度基础架构部研发工程师 负责混部调度系统研发 本文基于百度云原生团队『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门-Kubernetes工作原理』梳理. 视 ...

  4. 密码学原理与实践第三版pdf_云计算原理与实践PDF电子书下载

    今天分享的电子书是<云计算原理与实践>PDF电子书下载 本书细节 书名:<云计算原理与实践> 作者:王伟主编:郭栋,张礼庆,邱娟,张静轩,张东启,谭一鸣编著 出版时间:2018 ...

  5. Dubbo原理与实践(2)

    Dubbo是阿里开源的的rpc框架,现已成为Apache的顶级项目.Dubbo在国内的大公司中使用较多,具有良好的服务治理能力. 在阿里停止维护一段时间后,2017年又重新开始维护,2.x的最新版本为 ...

  6. 云原生服务网格Istio:原理、实践、架构与源码解析

    华为云原生团队600多页的Istio实战精华总结,云原生服务网格Istio:原理.实践.架构与源码解析的电子书. 图书介绍 <云原生服务网格Istio:原理.实践.架构与源码解析>分为原理 ...

  7. 基于Docker和Kubernetes的企业级DevOps实践训练营

    基于Docker和Kubernetes的企业级DevOps实践训练营 课程准备 离线镜像包 百度:https://pan.baidu.com/s/1N1AYGCYftYGn6L0QPMWIMw 提取码 ...

  8. 上新了!国内首本从原理与实践角度全面讲解InfluxDB的宝藏书

    新书速递 InfluxDB是一款非常优秀的软件,直接推动监控技术进入了实时.纳秒级的新时代,除了类SQL查询语言.RESTful API等现代特性外,还具有读写性能高.存储压缩率高.生态丰富.功能强大 ...

  9. Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

    Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...

最新文章

  1. 5000字、12 连环炮、一张图快速搞定线程池
  2. linux中查看lvm的名称,关于Linux中LVM的使用总结
  3. 你知道吗?Workspot属于二级VDI平台?
  4. React Native开发错误警告处理总结(已解决 !持续更新)
  5. linux下的mysql修改默认编码
  6. VC基于MSCOMM控件串口通讯
  7. HashMap 和 HashTable 到底哪不同 ?
  8. AWS Fargate告诉你:什么是容器即服务
  9. 语法比较:Julia,Matlab,Python
  10. java for 变量赋值_Java 如何引用变量赋值?
  11. 转Java 开发环境配置
  12. JSP程序设计实训(五)——JSP基本语法(一)
  13. IT售前工程师需要掌握哪些技术
  14. POJ1251 Jungle Roads(kru)
  15. 一切从零开始------软件篇
  16. k线图的分析小技巧以及买入卖出信号
  17. 为什么卷积层不加bias
  18. [0CTF 2016]piapiapia php反序列化字符串逃逸
  19. anywhere 随起随用本地服务器
  20. PHICOMM(斐讯)N1盒子 - Armbian5.77(Debian 9)基本配置

热门文章

  1. 测试一个数是不是素数
  2. ArcGIS中标注之一上下标、分数等特殊形式标注(转)
  3. 原创:纯手工打造CSS像素画--笨笨熊系列图标
  4. OpenCV的HSV空间度量与标准HSV不一样,使用的时候需要换算;另附一个调色取色的小工具
  5. mysql的grant权限
  6. leetcode算法题--数组中重复的数字
  7. leetcode算法题--全排列
  8. 环境/---Liunx环境安装
  9. js --- for in 和 for of
  10. centos7安装配置ELK(Elasticsearch+Logstash+Kibana)