(一)背景资料

  • 在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dockerremote API,这个项目在https://github.com/fsouza/go-dockerclient中。
  • 在Kubernetes1.3中直接使用docker公司提供的client来实现,通过这个client可以实现同DockerDeamon之间的通讯,这个客户端项目在https://github.com/docker/engine-api/中,感兴趣的话可以去看看。
  • 在Kubernetes1.4中延用了1.3中的方式,直接使用docker公司提供的client来实现。

(二)支持Docker版本

  • 对于Kubernetes1.4需要使用Docker版本至少是1.9.x,Docker1.9.x对应的API版本是1.21。
  • 下面是Docker版本同API版本对应关系,其中红色字体的部分是Kubernetes1.4不支持的。

Docker版本

API版本

1.12x

1.24

1.11.x

1.23

1.10.x

1.22

1.9.x

1.21

1.8.x

1.20

1.7.x

1.19

1.6.x

1.18

1.5.x

1.17

1.4.x

1.16

1.3.x

1.15

1.2.x

1.14

(三)调用Docker API

下面表格展现了Docker最新版本所有的API列表,同时也展现了Kubernetes1.4版本和1.3版本都使用了哪些API。

  • 第一列是Docker 1.24版本API列表
  • 第二列是这些API使用方式
  • 第三列是Kubernetes1.4中使用到的API
  • 第四列是Kubernetes1.3中使用到的API
  • 红色字体部分为1.4版本比1.3版本增加的调用API,也就是说1.4版本比1.3版本增加的操作Docker的功能

Docker API 1.24

使用方式

Kubernetes1.4

Kubernetes1.3

Get container stats based on resource usage

GET /containers/(id)/stats

 

 

Update a container

POST /containers/(id)/update

 

 

Rename a container

POST /containers/(id)/rename

 

 

Retrieving information about files and folders in a container

HEAD /containers/(id)/archive

 

 

List containers

GET /containers/json

Inspect a container

GET /containers/(id)/json

Inspect changes on a container’s filesystem

GET /containers/(id)/changes

Create a container

POST /containers/create

Start a container

POST /containers/(id)/start

Stop a container

POST /containers/(id)/stop

Restart a container

POST /containers/(id)/restart

 

 

Pause a container

POST /containers/(id)/pause

 

 

Unpause a container

POST /containers/(id)/unpause

 

 

List processes running inside a container

GET /containers/(id)/top

 

 

Kill a container

POST /containers/(id)/kill

Remove a container

DELETE /containers/(id)

Get an archive of a filesystem resource in a container

GET /containers/(id)/archive

 

 

Extract an archive of files or folders to a directory in a container

PUT /containers/(id)/archive

 

 

Copy files or folders from a container

POST /containers/(id)/copy,以后会被删除掉,使用archive代替

 

 

Wait a container

POST /containers/(id)/wait

 

 

Create a new image from a container’s changes

POST /commit

 

 

Attach to a container

POST /containers/(id)/attach

Attach to a container (websocket)

GET /containers/(id or name)/attach/ws

 

 

Get container logs

GET /containers/(id)/logs

Resize a container TTY

POST /containers/(id)/resize

 

Export a container

GET /containers/(id)/export

 

 

List Images

GET /images/json

Inspect an image

GET /images/(name)/json

Get the history of an image

GET /images/(name)/history

Push an image on the registry

POST /images/(name)/push

 

 

Build image from a Dockerfile

POST /build

 

 

Create an image

POST /images/create

Load a tarball with a set of images and tags into docker

POST /images/load

 

 

Get a tarball containing all images in a repository

GET /images/(name)/get

 

 

Get a tarball containing all images

GET /images/get

 

 

Tag an image into a repository

POST /images/(name)/tag

 

 

Remove an image

DELETE /images/(name)

Search images

GET /images/search

 

 

Monitor Docker’s events

GET /events

 

 

Show the docker version information

GET /version

Display system-wide information

GET /info

Ping the docker server

GET /_ping

 

 

List volumes

GET /volumes

 

 

Create a volume

POST /volumes/create

 

 

Inspect a volume

GET /volumes/(name)

 

 

Remove a volume

DELETE /volumes/(name)

 

 

List networks

GET /networks

 

 

Inspect network

GET /networks/<network-id>

 

 

Create a network

POST /networks/create

 

 

Remove a network

DELETE /networks/(id)

 

 

Connect a container to a network

POST /networks/(id)/connect

 

 

Disconnect a container from a network

POST /networks/(id)/disconnect

 

 

Check auth configuration

POST /auth

 

 

Exec Create

POST /containers/(id)/exec

Exec Start

POST /exec/(id)/start

Exec Resize

POST /exec/(id)/resize

 

Exec Inspect

GET /exec/(id)/json

List plugins

GET /plugins

 

 

Install a plugin

POST /plugins/pull?name=<plugin name>

 

 

Inspect a plugin

GET /plugins/(plugin name)

 

 

Enable a plugin

POST /plugins/(plugin name)/enable

 

 

Disable a plugin

POST /plugins/(plugin name)/disable

 

 

Remove a plugin

DELETE /plugins/(plugin name)

 

 

List nodes

GET /nodes

 

 

Inspect a node

GET /nodes/<id>

 

 

Remove a node

DELETE /nodes/<id>

 

 

Update a node

POST /nodes/<id>/update

 

 

Inspect swarm

GET /swarm

 

 

Initialize a new swarm

POST /swarm/init

 

 

Join an existing swarm

POST /swarm/join

 

 

Leave a swarm

POST /swarm/leave

 

 

Update a swarm

POST /swarm/update

 

 

List services

GET /services

 

 

Create a service

POST /services/create

 

 

Remove a service

DELETE /services/(id or name)

 

 

Inspect one or more services

GET /services/(id or name)

 

 

Update a service

POST /services/(id or name)/update

 

 

List tasks

GET /tasks

 

 

Inspect a task

GET /tasks/(task id)

 

 

1)       从表格中可以看到,Kubernetes1.4中调用了Docker的Resize a container TTY接口,用来配置Docker容器的虚拟终端(TTY),重新设置Docker容器的虚拟终端之后,需要重新启动容器才能生效。

HTTP请求例子:

 POST/containers/4fa6e0f0c678/resize?h=40&w=80 HTTP/1.1

返回响应例子:

 HTTP/1.1 200 OK
Content-Length: 0
Content-Type: text/plain; charset=utf-8

请求参数:

h – 虚拟终端高度

w – 虚拟终端宽度

HTTP返回响应状态值:

200 – 设置成功

404 – 没有找到指定Docker容器

500 – 不能够重新设置虚拟终端参数

2)       从表格中还可以看到,Kubernetes1.4中调用了Docker的Exec Resize接口,如果在Docker容器中执行exec命令时指定了虚拟终端(tty),那么通过这个API接口就可以重新设置虚拟终端(tty)。

HTTP请求例子:

  POST/exec/e90e34656806/resize?h=40&w=80 HTTP/1.1
Content-Type: text/plain

返回响应例子:

  HTTP/1.1201 Created
Content-Type: text/plain

请求参数:

h –虚拟终端高度

w –虚拟终端宽度

HTTP返回响应状态值:

201 –设置成功

404 –没有找到指定exec实例

3)       Kubernetes1.4新增加了上面两个接口调用,可以看看这两个接口调用在源代码中的位置:

func AttachContainer(client DockerInterface,containerID kubecontainer.ContainerID, stdin io.Reader, stdout, stderrio.WriteCloser, tty bool, resize <-chan term.Size) error {

      <span style="color:#FF0000;"> kubecontainer.HandleResizing(resize, func(size term.Size) {

              client.ResizeContainerTTY(containerID.ID,int(size.Height), int(size.Width))

       })</span>

       opts:= dockertypes.ContainerAttachOptions{

              Stream:true,

              Stdin:  stdin != nil,

              Stdout:stdout != nil,

              Stderr:stderr != nil,

       }

       ……

}

func (*NativeExecHandler)ExecInContainer(client DockerInterface, container *dockertypes.ContainerJSON,cmd []string, stdin io.Reader, stdout, stderr io.WriteCloser, tty bool, resize<-chan term.Size) error {

       ……

      <span style="color:#FF0000;"> kubecontainer.HandleResizing(resize, func(size term.Size) {

              client.ResizeExecTTY(execObj.ID, int(size.Height),int(size.Width))

       })</span>

       startOpts:= dockertypes.ExecStartCheck{Detach: false, Tty: tty}

       streamOpts:= StreamOptions{

              InputStream:  stdin,

              OutputStream:stdout,

              ErrorStream:  stderr,

              RawTerminal:  tty,

       }

       err= client.StartExec(execObj.ID, startOpts, streamOpts)

       iferr != nil {

              returnerr

       }

……

}

这两处开发开发人员的注释如下:

Have to start this before the call toclient.AttachToContainer because client.AttachToContainer is a blocking call:-( Otherwise, resize events don't get processed and the terminal neverresizes.

Have to start this before the call toclient.StartExec because client.StartExec is a blocking call :-( Otherwise,resize events don't get processed and the terminal never resizes.

通过注释可以发现,因为attach和start exec两个接口都是可以阻塞的,所以通过增加设置虚拟终端(tty)来判断向attach和start exec两个接口发送的请求是否阻塞。

4)       从表格中还可以看到,Kubernetes没有使用到Docker的网络接口,也没有使用到Docker的卷接口,原因是Kubernetes自己定义了Service和POD,自己实现了POD之间的网络和挂载到POD上的卷。

5)       从表格中也可以看到,Kubernetes对Docker容器的管理只有很少的功能,甚至都没有使用到Docker的重启接口,还是因为Kubernetes自己定义的POD,Kubernetes以POD为基本操作单元,而且是Kubernetes从容器集群管理角度设计的,所以不存在对POD里面单个Docker容器的重启操作。

(四)对Docker其他操作

1)       Linux ext4文件系统要求文件名字符个数不能超过255,在Kubernetes1.4中进行了控制。

2)       由于Docker1.12支持了通过—sysctl参数来设置内核参数,所以在Kubernetes1.4可以将安全的sysctl命令放入白名单列表中,这样就可以对容器内核参数进行配置操作,下面是Kubernetes1.4对内核参数的默认设置:

•       sysctl -wvm.overcommit_memory=1

表示节点上有多少物理内存就用多少,不进行内存超分配

•       sysctl -w vm.panic_on_oom=0

表示当节点上物理内存耗尽时,内核触发OOM killer杀掉最耗内存的进程

•       sysctl -w kernel/panic=10

表示当内核panic时,等待10秒后在重启

•       sysctl -wkernel/panic_on_oops=1

设置当内核oops发生时,采用panic方式处理。不同于panic会导致OS重启,设备驱动引发的oops通常不会导致OS重启,但是可以通过设置这个参数来指定oops发生时进行OS重启

(五)K8S操作Docker的网络实现

我们可以用下面这张图来把POD和容器之间的关系形象化,此图仅供说明问题时的参考,并无实际意义。

我们可以把POD看作是机器里面的操作系统,把容器看作是里面的进程,在操作系统内部进程间是可以通过IPC(Inter-Process Communication)进行通讯的,不同操作系统之间的进程是通过操作系统IP和端口进行通讯的,那么对应到POD和容器,就变成了POD内部容器间事可以通过IPC(Inter-Process Communication)进行通讯的,不同POD之间的容器是通过POD IP和端口进行通讯的。从集群的角度来考虑问题,Kubernetes基本操作单元是POD,不需要关注到POD中的容器,那么我们可以想象一下,如果我们要按照虚拟机的使用方式来使用容器,那样的话应该如何使用Kubernetes呢?可以看下面的图:

这样我们就实现了像虚拟机那样使用容器,我们可以认为POD就是一个虚拟机,只不过在这个虚拟机中只有一个容器。但是如果要对这个虚拟机进行操作的时候我们发现问题来了,从前面的表格中可以看到,Kubernetes对Docker容器的管理只有很少的功能,没有使用到Docker的重启接口,但是如果把容器当作虚拟机用,必然要使用重启功能,抛开Kubernetes的设计理念,我们自己可以扩展Kubernetes对POD重启的实现,实现把容器当作虚拟机来使用的需求。

kubernetes1.4新特性:支持Docker新特性的更多相关文章

  1. 下一代的中间件必须是支持docker规范的

    下一代的中间件必须是支持docker规范的,这是中间件技术走向标准规范化的必经之路. 什么是 Docker? 答案是:Docker 是下一代的云计算模式.Docker 是下一代云计算的主流趋势. Do ...

  2. Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth

    Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1 Python 3_x 新特性1 python3.4新特性1 python3.5新特性1 值得关注的新特性1 ...

  3. Git 2.7: 一个新的带来许多新特性和性能提升的主要版本

    在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...

  4. 代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版

    代码走查25条疑问   代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程.通过代码走查可以提高代码的 质量,同时减少Bug出现的几率.但是在小公司中并没有代码走查的过程在这 ...

  5. Atitit.业务系统的新特性 开发平台 新特性的来源总结

    Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. ...

  6. 11g新特性与12c新特性

    1. 11g新特性概图 管理新特性> 开发新特性> 2. 12c 新特性概图

  7. CentOS 7 Docker基本特性

    Docker是一个开源的应用容器引擎,开发人员可以非常容易地打包已经开发好的应用,同时将应用相关的依赖包也打包到这样一个可移植的容器中,然后发布到任意的Linux主机系统上.Docker是基于Linu ...

  8. linux如何编译安装新内核支持NTFS文件系统?(以redhat7.2x64为例)

    内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修订了旧内核 ...

  9. 让ie浏览器支持html5新标签的解决方法(使用html5shiv)

    没估计错的话旧版浏览器都是不识别这些新增的标签所以都是用行内元素来处理解决的,所以,有一个解决办法的突破口就是让它变成块状元素就不会处于同一行了,这样在新旧浏览器都是可以显示同样的效果,再者就是让浏览 ...

随机推荐

  1. 关于python的列表操作(一):取值,增加,修改,删除

    # 列表操作 name_list = ["wang", "niu", "bai", "sui"] # 取值 print( ...

  2. 建造者模式(Builder)(生成器模式)(框架化)

    建造者模式将一个复杂对象的构建与其表示分离. 将复杂对象进行框架化,将同类的对象编造进同一个制造流程.同类·对象会有一样的框架. 而由于各部分的实现细节有所不同,所生产出来的产品会有所不同.从而有不同 ...

  3. Python list以及numpy处理技巧

    1.numpy数组后面添加一个list: import numpy as np a=[[1,2,3],[4,5,6],[7,8,9]] box=np.array(a) box=np.vstack((b ...

  4. 初学linux时遇到的那些哭笑不得的问题

    1.终端中无法输入密码? 在终端输入密码,是不会在输入密码的时候看见星号或者圆点符号的.它不会有任何输入密码的视觉指示,也不会有任何光标移动,什么也不显示. 其实是输进去了,只是没有明文显示出来而已. ...

  5. IntersectionObserver API 使用教程(转载)

    作者: 阮一峰 日期: 2016年11月 3日 网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. 上图的绿色方块不断滚动,顶部会提示它的 ...

  6. 修改代码150万行!与 Blink 合并后的 Apache Flink 1.9.0 究竟有哪些重大变更?

    8月22日,Apache Flink 1.9.0 正式发布,早在今年1月,阿里便宣布将内部过去几年打磨的大数据处理引擎Blink进行开源并向 Apache Flink 贡献代码.当前 Flink 1. ...

  7. bzoj2547: [Ctsc2002]玩具兵

    划了一天水,其实我还是有点愧疚的. 传送门 其实是水题,然而我真是太蠢了... 首先不考虑天兵,其他兵要到一个点去一定是通过它-另一种兵-它……这样多次交换的,并且交换对象是无所谓的,和它换的兵最终会 ...

  8. WebForm与MVC模式优缺点(转)

    Asp.net Web开发方式,分为两种: 1. WebForm开发 2. Asp.Net MVC开发 MVC是微软对外公布的第一个开源的表示层框架,MVC目的不是取代WebForm开发,只是web开 ...

  9. [jnhs]全套CRC校验 算法

    摘自 https://blog.csdn.net/cp1300/article/details/51443350 uint8_t crc4_itu(uint8_t *data, uint_len le ...

  10. day 53

    目录 orm表关系如何建立 django中间件 路由层 反向解析 路由分发 名称空间 伪静态 虚拟环境 django版本的区别 视图层 orm表关系如何建立 ​ 多对多 ​ 一对多 ​ 一对一 ​ 换 ...