Docker k8s学习笔记

参考https://draveness.me/docker/

https://my.oschina.net/jamesview/blog/2994112

https://blog.csdn.net/uxiAD7442KMy1X86DtM3/article/details/99020133

Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

Build, Ship and Run

Build once,Run anywhere

Namespaces

命名空间 (namespaces) 是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离。Linux 的命名空间机制提供了以下七种不同的命名空间,包括 CLONE_NEWCGROUPCLONE_NEWIPCCLONE_NEWNETCLONE_NEWNSCLONE_NEWPIDCLONE_NEWUSERCLONE_NEWUTS,通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。

CGroups

我们通过 Linux 的命名空间为新创建的进程隔离了文件系统、网络并与宿主机器之间的进程相互隔离,但是命名空间并不能够为我们提供物理资源上的隔离,比如 CPU 或者内存,如果在同一台机器上运行了多个对彼此以及宿主机器一无所知的『容器』,这些容器却共同占用了宿主机器的物理资源。Groups(简称 CGroups)就是能够隔离宿主机器上的物理资源,例如 CPU、内存、磁盘 I/O 和网络带宽。

UnionFS

Linux 的命名空间和控制组分别解决了不同资源隔离的问题,前者解决了进程、网络以及文件系统的隔离,后者实现了 CPU、内存等资源的隔离,但是在 Docker 中还有另一个非常重要的问题需要解决 - 也就是镜像。

Docker 镜像其实本质就是一个压缩包,Docker 镜像就是一个文件

Docker 中的每一个镜像都是由一系列只读的层组成的,Dockerfile 中的每一个命令都会在已有的只读层上创建一个新的层。当镜像被 docker run 命令创建时就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。

UnionFS 其实是一种为 Linux 操作系统设计的用于把多个文件系统『联合』到同一个挂载点的文件系统服务。而 AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。

每一个镜像层或者容器层都是 /var/lib/docker/ 目录下的一个子文件夹;在 Docker 中,所有镜像层和容器层的内容都存储在 /var/lib/docker/aufs/diff/ 目录中。

/var/lib/docker/aufs/layers/ 中存储着镜像层的元数据,每一个文件都保存着镜像层的元数据,最后的 /var/lib/docker/aufs/mnt/ 包含镜像或者容器层的挂载点,最终会被 Docker 通过联合的方式进行组装。

Docker k8s学习笔记

Docker技术的三大核心概念,分别是:

  • 镜像(Image)

  • 容器(Container)

  • 仓库(Repository)对Docker镜像进行管理的,是Docker Registry服务

如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理.K8S,就是基于容器的集群管理平台,它的全称,是kubernetes。

一个K8S系统,通常称为一个K8S集群(Cluster)

这个集群主要包括两个部分:

  • 一个Master节点(主节点)

  • 一群Node节点(计算节点)

一看就明白:Master节点主要还是负责管理和控制。Node节点是工作负载节点,里面是具体的容器。

Docker k8s学习笔记

Master节点包括API Server、Scheduler、Controller manager、etcd。

API Server是整个系统的对外接口,供客户端和其它组件调用,相当于“营业厅”。

Scheduler负责对集群内部的资源进行调度,相当于“调度室”。

Controller manager负责管理控制器,相当于“大总管”。

Docker k8s学习笔记

Node节点包括Docker、kubelet、kube-proxy、Fluentd、kube-dns(可选),还有就是Pod

Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。这段不太好理解,跳过吧。

Docker,不用说了,创建容器的。

Kubelet,主要负责监视指派到它所在Node上的Pod,包括创建、修改、监控、删除等。

Kube-proxy,主要负责为Pod对象提供代理。

Fluentd,主要负责日志收集、存储与查询。

Docker k8s学习笔记

API Server  是 Kubernetes Cluster 的前端接口,各种客户端工具(CLI或UI)以及Kubermetes 其他组件可以通过它管理 Cluster 的各种资源。

Scheduler 负责决定将 Pod 放在哪个Node 上运行。

Contoller Manager 负责管理 Cluster 各种资源,保证资源处于预期的状态。ContollerManager 由多种 controller 组成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。
etcd 负责保存 Kubernetes Cluster 的配置信息和各种资源的状态信息。

Pod 是 Kubernetes 调度的最小单元。一个Pod可以包含一个或多个容器

一个Pod中的多个容器共享以下资源:

    PID命名空间:Pod中不同的应用程序可以看到其他应用程序的进程ID。
    network命名空间:Pod中多个容器处于同一个网络命名空间,因此能够访问的IP和端口范围都是相同的。也可以通过localhost相互访问。
    IPC命名空间:Pod中的多个容器共享Inner-process Communication命名空间,因此可以通过SystemV IPC或POSIX进行进程间通信。
    UTS命名空间:Pod中的多个容器共享同一个主机名。
    Volumes:Pod中各个容器可以共享在Pod中定义分存储卷(Volume)。
kubelet 是 Node 的 agent,当 Scheduler 确定在某个 Node 上运行 pod 后,会将 Pod 的具体配置信息(imager、volume 等)发送给该节点的 kubelet,然后 kubelet 根据这些信息创建和运行容器,并向 Master 报告运行状态。
service 在逻辑上代表了后端的多个 Pod, 外界通过 service 访问 Pod。

    k8s 其他组件:

    CoreDNS:可以为集群中的 SVC 创建一个域名 IP 的对应关系解析;
    Dashboard:给 k8s 集群提供一个 B/S 结构访问体系;
    Ingress Controller:k8s 官方默认只能实现四层代理,INGRESS 可以实现七层代理;
    Federation:提供一个可以跨集群中心多 k8s 统一管理功能;
    Prometheus:提供 k8s 集群监控能力;
    ELK:提供 k8s 集群日志统一分析介入平台;