• 一些重要的k8s概念


    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 上运行 glusterdceph
    • 在每个 Node 上运行日志收集 daemon,例如fluentdlogstash
    • 在每个 Node 上运行监控 daemon,例如 Prometheus Node Exportercollectd、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 所在主机通信失败。
  • 相关阅读:
    Linux内核同步
    Linux内核同步
    Linux内核同步
    Linux内核同步
    Linux内核同步
    Linux中断
    Linux中断
    Linux中断
    Linux中断
    Linux中断
  • 原文地址:https://www.cnblogs.com/spillage/p/10429795.html
Copyright © 2020-2023  润新知