K8S系列Pod详解

Posted 颜淡慕潇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8S系列Pod详解相关的知识,希望对你有一定的参考价值。

目录

序言

1 前言

2 为什么需要pod

3 什么是Pod?

3.1 Pod的组成

3.2 Pod的用途

3.3 Pod的生命周期

3.4 Pod的特点

4 Pod的使用

5 结论 

序言

任何一件事情,只要坚持六个月以上,你都可以看到质的飞跃。

今天学习一下K8s-Pod相关内容,希望此文,能帮助读者对K8s-pod有一个进一步的了解

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

1 前言

Kubernetes(简称k8s)是一个流行的开源容器编排系统,它能够简化应用程序部署、管理和扩展。在Kubernetes中,Pod是最基本的部署单元

本文将对Kubernetes Pod进行详细介绍。

2 为什么需要pod

相信你在学习和使用 Kubernetes 项目的过程中,已经不止一次地想要问这样一个问题:

为什么我们会需要 Pod?

我们知道,容器的本质是一种特殊的进程,如果映射到系统中,容器镜像就是这个系统里的“.exe”安装包。那么 Kubernetes 呢?Kubernetes 就是操作系统!

在一个真正的操作系统里,进程并不是“孤苦伶仃”地独自运行的,而是以进程组的方式,“有原则地”组织在一起。

而 Kubernetes 项目所做的,其实就是将“进程组”的概念映射到了容器技术中,并使其成为了这个云计算“操作系统”里的“一等公民”。

Pod 是 Kubernetes 里的原子调度单位。这就意味着,Kubernetes 项目的调度器,是统一按照 Pod 而非容器的资源需求进行计算的。

关于 Pod 最重要的一个事实是:它只是一个逻辑概念。

也就是说,Kubernetes 真正处理的,还是宿主机操作系统上 Linux 容器的 Namespace 和 Cgroups,而并不存在一个所谓的 Pod 的边界或者隔离环境。

那么,Pod 又是怎么被“创建”出来的呢?

答案是:Pod,其实是一组共享了某些资源的容器。

具体的说:

Pod 里的所有容器,共享的是同一个 Network Namespace,并且可以声明共享同一个 Volume

pod的实现:

在 Kubernetes 项目里,Pod 的实现需要使用一个中间容器,这个容器叫作 Infra 容器。在这个 Pod 中,Infra 容器永远都是第一个被创建的容器,

而其他用户定义的容器,则通过 Join Network Namespace 的方式,与 Infra 容器关联在一起。这样的组织关系,叫做pod。可以用下面这样一个示意图来表达: 

 如上图所示,这个 Pod 里有两个用户容器 A 和 B,还有一个 Infra 容器。

Infra 容器一定要占用极少的资源,所以它使用的是一个非常特殊的镜像,叫作:k8s.gcr.io/pause。这个镜像是一个用汇编语言编写的、永远处于“暂停”状态的容器,解压后的大小也只有 100~200 KB 左右。

而在 Infra 容器“Hold 住”Network Namespace 后,用户容器就可以加入到 Infra 容器的 Network Namespace 当中了。

所以,如果你查看这些容器在宿主机上的 Namespace 文件,它们指向的值一定是完全一样的。

这也就意味着,对于 Pod 里的容器 A 和容器 B 来说:

  • 通信:它们可以直接使用 localhost 进行通信;
  • 网络:它们看到的网络设备跟 Infra 容器看到的完全一样;
  • IP地址:一个 Pod 只有一个 IP 地址,也就是这个 Pod 的 Network Namespace 对应的 IP 地址;
  • 其他网络资源:其他的所有网络资源,都是一个 Pod 一份,并且被该 Pod 中的所有容器共享;
  • 生命周期:Pod 的生命周期只跟 Infra 容器一致,而与容器 A 和 B 无关。

而对于同一个 Pod 里面的所有用户容器来说,它们的进出流量,认为都是通过 Infra 容器完成的。

这一点很重要,因为将来如果你要为 Kubernetes 开发一个网络插件时,应该重点考虑的是如何配置这个 Pod 的 Network Namespace,而不是每一个用户容器如何使用你的网络配置,这是没有意义的。

有了这个设计之后,共享 Volume 就简单多了:Kubernetes 项目只要把所有 Volume 的定义都设计在 Pod 层级即可。

3 什么是Pod?

Pod是Kubernetes中最小的可部署单元,它是一个或多个紧密关联的容器的组合,这些容器共享同一个网络命名空间和存储卷。Pod提供了一个抽象层,它封装了容器在节点上的运行环境,例如存储、网络和运行时环境。

3.1 Pod的组成

Pod由以下组件组成:

  • 容器:Pod中可以有一个或多个容器。
  • 共享存储:Pod中的所有容器都可以访问共享存储卷。
  • 网络:Pod中的所有容器都共享相同的网络命名空间和IP地址。

3.2 Pod的用途

Pod是K8s中最基本的计算单元,用于托管应用程序或服务。Pod可用于:

  • 运行单个容器应用程序
  • 运行多个相关容器应用程序
  • 运行应用程序和sidecar容器,sidecar容器提供支持应用程序所需的其他功能,如日志记录、监视和调试。
  • 提供应用程序和其依赖项之间的网络通信
  • 提供应用程序和存储之间的访问

3.3 Pod的生命周期

Pod具有以下生命周期:

  • 创建:当Pod定义被提交到K8s API服务器时,Pod被创建。
  • 运行:当Pod被调度到节点上时,Pod处于运行状态。
  • 更新:可以通过更新Pod的定义来更新Pod中的容器和其他资源。
  • 扩展:可以通过创建更多的Pod实例来扩展应用程序。
  • 删除:当Pod被删除时,Pod中的容器被停止并且Pod中的资源被释放。

3.4 Pod的特点

Pod具有以下特点:

  • Pod是最小的可部署单元,它封装了一个或多个容器。
  • Pod提供了容器共享网络和存储的能力
  • Pod具有自己的IP地址和DNS名称,可以作为一个独立的服务进行访问。
  • Pod可以水平扩展,即可以通过副本集进行复制并进行负载均衡。
  • Pod可以使用亲和性和反亲和性进行节点调度,以满足特定的调度需求。

4 Pod的使用

要创建一个Pod,必须定义一个Pod描述文件,该文件描述了Pod的规范、容器和相关的资源。下面是一个示例Pod描述文件:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

在上面的示例中,我们定义了一个名为nginx-pod的Pod,它包含一个名为nginx的容器,该容器使用最新的nginx镜像,并监听80端口。

要创建该Pod,可以使用kubectl apply命令:

kubectl apply -f nginx-pod.yaml

该命令将会创建一个名为nginx-pod的Pod,并且启动一个nginx容器。

5 结论

Pod是Kubernetes中最基本的部署单元,它封装了一个或多个容器,并提供容器共享网络和存储的能力

Pod也可以作为一个独立的服务进行访问,并且可以通过副本集进行复制并进行负载均衡。要使用Pod,必须定义一个Pod描述文件,并使用kubectl apply命令创建Pod。

Python 详解K-S检验与3σ原则剔除异常值

文章目录


一、引言

异常值分析是检验数据是否有录入错误,是否含有不合常理的数据。忽视异常值的存在是十分危险的,不加剔除地将异常值放入数据的计算分析过程中,会对结果造成不良影响;重视异常值的出现,分析其产生的原因,经常成为发现问题进而改进决策的契机。

异常值是指样本中的个别值,其数值明显偏离其他的观测值。异常值也称为离群点,异常值分析也称为离群点分析。

而对于数据异常值的处理,3σ 原则是一种基于统计的方法,简单实用。


二、3σ原则

什么叫 3σ 原则呢?

  • 3σ 原则,又叫拉依达原则,它是指假设一组检测数据中只含有随机误差,需要对其进行计算得到标准偏差,按一定概率确定一个区间,对于超过这个区间的误差,就不属于随机误差而是粗大误差,需要将含有该误差的数据进行剔除。
  • 局限性:仅局限于对正态或近似正态分布的样本数据处理,它是以测量次数充分大为前提(样本>10),当测量次数少的情形用准则剔除粗大误差是不够可靠的。在测量次数较少的情况下,最好不要选用该准则。

3σ 原则:

  • 数值分布在(μ-σ,μ+σ)中的概率为 0.6827
  • 数值分布在(μ-2σ,μ+2σ)中的概率为 0.9545
  • 数值分布在(μ-3σ,μ+3σ)中的概率为 0.9973

其中,μ 为平均值,σ 为标准差。一般可以认为,数据 Y 的取值几乎全部集中在(μ-3σ,μ+3σ)区间内,超出这个范围的可能性仅占不到 0.3%,这些超出该范围的数据可以认为是异常值。

在实验科学中有对应正态分布的 3σ 定律(Three-sigma Law),是一个简单的推论,内容是 “几乎所有” 的值都在平均值正负三个标准差的范围内,也就是在实验上可以将 99.7% 的机率视为 “几乎一定” 。不过上述推论是否有效,会视探讨领域中 “显著” 的定义而定,在不同领域,“显著” 的定义也随着不同,例如在社会科学中,若置信区间是在正负二个标准差(95%)的范围,即可视为显著。但是在粒子物理中,若是发现新的粒子,置信区间要到正负五个标准差(99.99994%)的程度。

即使在不是正态分布的情形下,也有另一个对应的 3σ 定律(three-sigma rule)。即使是在非正态分布的情形下,至少会有 88.8% 的机率会在正负三个标准差的范围内,这是依照切比雪夫不等式的结果。若是单模分布(unimodal distributions)下,正负三个标准差内的机率至少有95%,若符合特定一些条件的分布,机率可能会到 98% 。所以如果数据不服从正态分布,也可以用远离平均值的标准差的自定义倍数来描述。


三、K-S检验

可以使用 K-S 检验一列数据是否服从正态分布

from scipy.stats import kstest

kstest(rvs, cdf, args=(), N=20, alternative='two-sided', mode='auto')
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kstest.html

补充学习:


四、Python实现

Python实现步骤具体步骤如下:

  • 首先需要保证数据列大致上服从正态分布(可以使用 box-cox 变换等);
  • 计算需要检验的数据列的平均值 μ 和标准差 σ;
  • 比较数据列的每个值与平均值的偏差是否超过 3 倍标准差,如果超过 3 倍,则为异常值;
  • 剔除异常值,得到规范的数据。

K-S 正态分布检验和 3σ 原则剔除异常值,Python 代码如下:

import numpy as np
import pandas as pd
from scipy.stats import kstest
from scipy.special import boxcox1p
from scipy.stats import boxcox_normmax
from scipy.special import inv_boxcox


def KsNormDetect(df):
    # 计算均值
    u = df['value'].mean()
    # 计算标准差
    std = df['value'].std()
    # 计算P值
    print(kstest(df['value'], 'norm', (u, std)))
    res = kstest(df['value'], 'norm', (u, std))[1]
    print('均值为:%.2f,标准差为:%.2f' % (u, std))
    # 判断p值是否服从正态分布,p<=0.05 拒绝原假设 不服从正态分布
    if res <= 0.05:
        print('该列数据不服从正态分布')
        print("-" * 66)
        return True
    else:
        print('该列数据服从正态分布')
        return False


def OutlierDetection(df, ks_res):
    # 计算均值
    u = df['value'].mean()
    # 计算标准差
    std = df['value'].std()
    if ks_res:
        # 定义3σ法则识别异常值
        outliers = df[np.abs(df['value'] - u) > 3 * std]
        # 剔除异常值,保留正常的数据
        clean_data = df[np.abs(df['value'] - u) < 3 * std]
        # 返回异常值和剔除异常值后的数据
        return outliers, clean_data

    else:
        print('请先检测数据是否服从正态分布')
        return None


if __name__ == '__main__':
    # 构造数据  某一列数据  含有异常值
    data = np.random.normal(60, 5, 200)
    data[6], data[66], data[196] = 16, 360, 180
    print(data)
    
    print("-" * 66)
    # 可以转换为pandas的DataFrame 便于调用方法计算均值和标准差
    df = pd.DataFrame(data, columns=['value'])
    # box-cox变换
    lam = boxcox_normmax(df["value"] + 1)
    df["value"] = boxcox1p(df['value'], lam)
    # K-S检验
    ks_res = KsNormDetect(df)
    outliers, clean_data = OutlierDetection(df, ks_res)
    # 异常值和剔除异常值后的数据
    outliers = inv_boxcox(outliers, lam) - 1
    clean_data = inv_boxcox(clean_data, lam) - 1
    print(outliers)
    print("-" * 66)
    print(clean_data)

剔除异常值结果如下:


补充学习:

以上是关于K8S系列Pod详解的主要内容,如果未能解决你的问题,请参考以下文章

容器技术Docker K8s 45 Serverless Kubernetes(ASK)详解-ECI Pod管理

Kubernetes对象之Pod详解(附安装部署方法)

Kubernetes 系列K8S 进阶 容器和 Pod 分配内存资源

K8S实战系列:2-Pod工作负载与服务

k8s系列(二):Pods与Nodes

kubernetes云原生k8s资源管理命令与Namespace使用详解