《Kubernetes in Action》Chapter01 Kubernetes 介绍
1、NoOps
理想情况是,开发者是部署程序本身,不需要知道硬件基础设施的任何情况,也不需要和运维团队交涉,这被叫做NoOps。
Kubernetes通过对实际硬件做抽象,然后将自身暴露成一个平台,用于部署和运行应用程序。
Kubernetes实现了NoOps:Kubernetes允许开发者在不需要系统管理员的帮助下,自己配置和部署应用程序;而系统管理员则聚焦于保持底层基础设施运转正常,不需要关注实际运行在平台上的应用程序。
2、容器类隔离机制
容器是什么?
容器允许在同一太机器上运行多个服务,不仅提供不同的环境给每个服务,而且将它们相互隔离。
容器的两个隔离机制
(1)Linux命名空间,它是每个进程只看到它自己的系统视图(文件、进程、网络接口、主机名等)
一个进程不单单只属于某一个命名空间,而属于每一个类型的一个命名空间。
每种命名空间被用来隔离一组特定的资源。
命名空间是Linux内核一个强大的特性。每个容器都有自己的单独命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。
(2)Linux控制组(cgroups),它限制类进程能使用的资源量(CPU、内存、网络带宽等)
3、Docker容器平台
Docker是一个打包、分发和运行应用程序的平台。
Docker本身并不提供进程隔离,实际上容器隔离是在Linux内核上使用诸如Linux命名空间和cgroup之类的内核特性完成的,Docker仅简化类这些特性的使用。
Docker的3个主要概念:
- 镜像(Image)
Docker镜像里包含了你打包的应用程序及其所依赖的环境。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像是分层存储的,它并非像一个ISO那样的打包文件。镜像只是一个虚拟的概念,它实际体现并不是一个文件组成,而是由一组多层文件系统联合组成。
层使得分发更高效,也有助于减少镜像的存储空间。
- 仓库(Repository)
Docker镜像仓库是一个集中存储、分发镜像的服务。
一个Docker Registry中可以包含多个仓库(Repository);每个Repository可以包含多个标签(Tag);每个Tag对应一个镜像。
同一个软件往往有不同的版本,标签Tag就对于的是软件的版本号。而一个仓库Repository中只包含一个软件不同版本的镜像。
我们通过<仓库名>:<标签>来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以lastest作为默认标签。
(1)Docker Registry公开服务,是开发给用户使用、允许用户管理镜像的Registry服务。默认的Registry是官方的Docker Hub。由于访问速度问题,国内一些云服务商针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被成为加速器。
(2)私有Docker Registry
- 容器(Container)
Docker容器通常是一个Linux容器,它是基于Docker镜像被创建的。镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、暂停、停止、删除。
4、Kubernetes
Kubernetes是一个软件系统,通过它你可以很容易地部署和管理容器化的应用。
Kubernetes系统由一个主节点和若干个工作节点组成。
Kubernetes的两个核心功能:
(1)帮助开发者聚焦核心应用功能;
(2)帮助运维团队获得更高的资源利用率;
Kubernetes集群架构:在硬件级别,一个Kubernetes集群由很多个节点组成,这些节点被分为一下两种类型:
-
主节点,它承载着Kubernetes控制和管理整个集群系统的控制面板(control plane)
-
工作节点,它们运行着用户实际部署的应用
控制面板(control plane)
控制面板用于控制集群并使集群工作。control plane包含多个组件,组件可以运行在单个节点上,也可通过副本分别部署在多个主节点以确保高可用性。这些组件是:
- Kubernetes API服务器,
- Scheduler,调度
- Controller Manager,它执行集群级别的功能,如复制组件、持续跟踪工作节点、处理节点失败等
- etcd,分布式数据存储
工作节点(Node)
工作节点是运行容器化应用的机器。运行、监控和管理应用服务的任务是以下组件完成的:
- Docker、rtk或其他的容器类型
- Kubelet,它与API服务器通信,并管理它所在节点的容器
- KUbernetes Service Proxy(kube-proxy),负责组件之间的负载均衡网络流量
#Kubernetes#
#Docker#
补充内容:
1、veth
veth全称是(Virtual Ethernet)虚拟以太网。
使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
· host模式,使用--net=host指定。
· container模式,使用--net=container:NAME_or_ID指定。
· none模式,使用--net=none指定。
· bridge模式,使用--net=bridge指定,默认设置。
2、chroot
chroot,即 change root directory (更改 root 目录)。
在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的;而在使用 chroot 之后,系统的目录结构将以指定的位置作为 `/` 位置。
在经过 chroot 之后,系统读取到的目录和文件将不在是旧系统根下的,而是新根下(即被指定的新的位置)的目录结构和文件。
Linux命名空间名称 | 说明 |
1、mnt命名空间(Mount) | 类似chroot,将一个进程放到一个特定的目录执行。mnt命名空间允许不同命名空间的进程看到文件结构不同,这样每个命名空间中的进程所看到文件目录就被隔离开了。 与chroot不同的是,每个命名空间中的容器在/proc/mounts/的信息只包含所在命名空间的mount point。
|
2、pid命名空间(Process ID) | 不同用户的的进程就是通过pid命名空间隔离开的,而且不同命名空间中可以有相同的pid。所有的LXC进程在Docker中的父进程为Docker进程,每个LXC进程具有不同的命名空间。
|
3、Network(net命名空间) | 每个命名空间中的pid能够相互隔离,但是网络端口还是共享host的端口。 网络隔离是通过net命名空间实现的,每个net命名空间有独立的网络设备、IP地址、路由表、/proc/net目录。这样每个容器的网络就能隔离开来。 Docker默认采用veth的方式,将容器中的虚拟网卡同host上的一个Docker网桥docker0连接在一起。
|
4、ipc命名空间 (Inter-process communication) | 容器中进程交互采用Linux常见的交互方法(inter-process communication IPC),包括信号量、消息队列和共享内存等。 与VM不同的是,容器的进程间交互实际上是host上具有相同pid命名空间中的进程间交互。故需要在IPC资源申请时将入命名空间信息,每个IPC资源有一个唯一的32位id。
|
5、uts命名空间 | UTS(UNIX Timesharing System)命名空间允许每个容器拥有独立的hostname和domainname ,使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
|
6、user命名空间(User ID) | 每个容器可以有不同的用户和组id,也就是说可以在容器内部用容器内部的用户执行程序而非主机上的用户。
|