Kubernetes-cni网络调用分析-v1.5.2

什么是CNI

CNI是Kubernetes提供的网络接口。要使用CNI,需要在kubelet上加参数–network-plugin=cni,需要需要也可以设置–cni-conf-dir和–cni-bin-dir参数。对于Kubernetes来说,network plugin就是一个二进制文件。本次分析将介绍CNI的调用过程。

阅读全文

Docker命令行分析-load-save-v1.12.3

tar包

docker load/save命令可以从tar包导入镜像或把镜像压缩成tar包(一般使用tar格式即可),其中tar包中可以包含多个镜像。我们以命令行docker save nginx:v1 golint:v1 > test.tar生成test.tar包,然后分析test.tar包中的内容。

阅读全文

Dockerd的server启动流程分析-v1.12.3

Docker v1.12.3版本中有两个二进制文件,其中docker为客户端,dockerd为服务端,docker一般通过Unix socket访问本地dockerd,也可以通过网络访问其他主机上的dockerd(前提是其他主机上的dockerd对网络端口进行了监听)。本次分析就介绍dockerd如何启动server监听的。

阅读全文

GO语言-切片原理

切片本质

切片的定义如下:

1
2
3
4
5
type slice struct {
array unsafe.Pointer
len int
cap int
}

阅读全文

Kubernetes-resourceVersion机制分析

resourceVersion

我们先来看下Kubernetes的版本策略。通过Apiserver获取到的所有对象中,都有一个”resourceVersion”的字段。如:

1
2
3
4
5
6
apiVersion: v1
kind: Pod
metadata:
resourceVersion: "879232"
selfLink: /api/v1/namespaces/default/pods/nginx-1zr5x
uid: 9910eaf7-f0f3-11e7-a0b3-0800274a4ec3

阅读全文

Kubernetes-Ingress使用-v1.5.2

Ingress

Ingress是Kubernetes集群用来暴露内部服务给外部人使用的一种机制,目前。Ingress机制主要由两部分组成:Ingress规则和Ingress Controller。Ingress规则定义了服务的访问规则。在Kubernetes中,Ingress和Service之类的一样,是一个资源。Ingress中定义了具体路径到后端容器的对应关系。Ingress Controller就是对定义Ingress进行响应的组件。以Nginx-Controller举例,Nginx监听某一地址,Nginx-Controller读取Kubernetes中的Ingress,然后把Ingress中定义的信息翻译到Nginx配置文件中,从而达到访问Nginx就可访问内部容器服务的功能。这就是Ingress的用途,监听某一地址,把流量代理到后端的容器。

阅读全文

kube-controller分析(五)-QuotaController-v1.5.2

本次分析将介绍ResourceQuotaController。之前我们已经介绍过Kubernetes如何管理配额,但当发生删除操作时,无需经过比较配额,直接删除即可,或者,系统配额与实际情况不一致的情况,这些,都需要一种机制来矫,而这个机制就是ResourceQuotaController。

阅读全文

runc源码分析(二)-namespace设置流程-v1.0.0-rc2

我们知道,runc是使用init进程作为容器内的第一个进程,来看下面代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//***构造init进程***//
//***通过process中的信息构建cmd***//
func (c *linuxContainer) commandTemplate(p *Process, childPipe, rootDir *os.File) (*exec.Cmd, error) {
//***Fankang***//
//***initArgs[0]: /proc/self/exe***//
//***initArgs[1:]: [init]***//
cmd := exec.Command(c.initArgs[0], c.initArgs[1:]...)
cmd.Stdin = p.Stdin
cmd.Stdout = p.Stdout
cmd.Stderr = p.Stderr
cmd.Dir = c.config.Rootfs
if cmd.SysProcAttr == nil {
cmd.SysProcAttr = &syscall.SysProcAttr{}
}
//***Fankang***//
//***把childPipe放到cmd的ExtraFiles中***//
cmd.ExtraFiles = append(p.ExtraFiles, childPipe, rootDir)
//***Fankang***//
//***在环境变量中加入_LIBCONTAINER_INITPIPE和_LIBCONTAINER_STATEDIR***//
cmd.Env = append(cmd.Env,
fmt.Sprintf("_LIBCONTAINER_INITPIPE=%d", stdioFdCount+len(cmd.ExtraFiles)-2),
fmt.Sprintf("_LIBCONTAINER_STATEDIR=%d", stdioFdCount+len(cmd.ExtraFiles)-1))
// NOTE: when running a container with no PID namespace and the parent process spawning the container is
// PID1 the pdeathsig is being delivered to the container's init process by the kernel for some reason
// even with the parent still running.
if c.config.ParentDeathSignal > 0 {
cmd.SysProcAttr.Pdeathsig = syscall.Signal(c.config.ParentDeathSignal)
}
return cmd, nil
}

阅读全文

Docker创建spec文件分析-v1.12.3

我们知道runc是从spec文件,即config.json启动容器的,而Docker所做的事就是生成这份config.json。本次分析将介绍Docker如何生成config.json文件的,及config.json中主要字段的含义。

daemon.createSpec()

我们先来看Docker中容器启动函数containerStart(),定义在/daemon/start.go中:

1
2
3
4
5
6
7
8
9
10
11
func (daemon *Daemon) containerStart(container *container.Container) (err error) {
......
//***创建spec文件***//
//***定义在/daemon/oci_linux中***//
spec, err := daemon.createSpec(container)
if err != nil {
return err
}
......
return nil
}

阅读全文

Docker工具包分析-archive-v1.12.3

本次分析介绍Docker的archive工具包。之前说到”docker cp”命令用到了TarResourceRebase(),CopyTo(),TarResource()和Unpack()
。我们先来看压缩的代码。

压缩

TarResource()

TarResource()定义在/pkg/archive/copy.go中:

1
2
3
func TarResource(sourceInfo CopyInfo) (content Archive, err error) {
return TarResourceRebase(sourceInfo.Path, sourceInfo.RebaseName)
}

阅读全文