1. Pause容器是什么
作为init pod存在,其他pod都会从pause 容器中fork出来
由pause容器管理
pause容器的工作
可知kubernetes的pod抽象基于Linux的namespace和cgroups,为容器提供了良好的隔离环境。在同一个pod中,不同容器犹如在localhost中。
在Unix系统中,PID为1的进程为init进程,即所有进程的父进程。它很特殊,维护一张进程表,不断地检查进程状态。例如,一旦某个子进程由于父进程的错误而变成了“孤儿进程”,其便会被init进程进行收养并最终回收资源,从而结束进程。
或者,某子进程已经停止但进程表中仍然存在该进程,因为其父进程未进行wait syscall进行索引,从而该进程变成“僵尸进程”,这种僵尸进程存在时间较短。不过如果父进程只wait,而未syscall的话,僵尸进程便会存在较长时间。
同时,init进程不能处理某个信号逻辑,拥有“信号屏蔽”功能,从而防止init进程被误杀。
容器中使用pid namespace来对pid进行隔离,从而每个容器中均有其独立的init进程。例如对于寄主机上可以用个发送SIGKILL或者SIGSTOP也就是docker kill 或者docker stop)来强制终止容器的运行,即终止容器内的init进程。一旦init进程被销毁, 同一pid namespace下的进程也随之被销毁,并容器进程被回收相应资源。
kubernetes中的pause容器便被设计成为每个业务容器提供以下功能:
在pod中担任Linux命名空间共享的基础;
启用pid命名空间,开启init进程。
tini-init是一个容器初始化命令, 与pause container的差别在于,通过tini可以初始化一个docker, pause是调度k8s集群及命名空间共享的基础
dumb init可以立即生成一个pid=1的子进程用于处理和转发信号
dumb init是在docker内一个可执行的二进制文件
tini和dumb是同一个东西,容器内的初始化
与pause container的差别是使用两个镜像还是一个镜像。
entry point更新时,使用tini 或dumb要使用发版-重启操作;但使用pause container,只要重启就可以
在其他使用场景上没有差别
2. Daemon sets
DaemonSet 确保全部(或者一些)Node 上运行一个 Pod 的副本。当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。
使用 DaemonSet 的一些典型用法:
运行集群存储 daemon,例如在每个 Node 上运行 glusterd
、ceph
。
在每个 Node 上运行日志收集 daemon,例如fluentd
、logstash
。
在每个 Node 上运行监控 daemon,例如 Prometheus Node Exporter、collectd
、Datadog 代理、New Relic 代理,或 Ganglia gmond
。
一个简单的用法是,在所有的 Node 上都存在一个 DaemonSet,将被作为每种类型的 daemon 使用。 一个稍微复杂的用法可能是,对单独的每种类型的 daemon 使用多个 DaemonSet,但具有不同的标志,和/或对不同硬件类型具有不同的内存、CPU要求。
3. svc是k8s 集群对外提供服务的最小节点。
4. etcd 所有的持久状态数据存储在etcd集群中。它提供了一种分布式的方式来可靠地存储配置数据。
5. 命名空间
命名空间就像一个资源名称的前缀。命名空间帮助不同的项目,环境(例如,开发和生产),团队或客户共享同一个集群。它能够阻止名称冲突。
命名空间可以通过配置文件创建。
命名空间的作用是在同一个命名空间下的进程和线程可以共享资源,如网络,文件系统,PID、网络、IPC
创建一个命名为development-ns.yaml
的文件,并写入以下内容:
kind: "Namespace" apiVersion: "v1" metadata: name: "development" labels: name: "development"
然后可以运行下面的命令创建新的命名空间:
$ kubectl create -f development-ns.yaml namespaces/development
-u, --uts[=<file>] enter UTS namespace hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
了解linux的namespace,就要了解nsenter命令,是ubuntu新出的新特性,也是容器的基础
6. pod的生命周期
挂起(Pending)时间和通过网络下载镜像的时间,这可能需要花点时间。
运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
成功(Successed):Pod 中的所有容器都被成功终止,并且不会再重启。
失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知(Unkonwn):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。