其他分享
首页 > 其他分享> > 8.Kubernetes核心技术Pod

8.Kubernetes核心技术Pod

作者:互联网

Kubernetes核心技术Pod

Pod概述

Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象,其它的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,K8S不会直接处理容器,而是Pod,Pod是由一个或多个container组成。

Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为 “根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。

image-20201114185528215

Pod基本概念

Pod存在的意义

image-20201114190018948

Pod是在K8S集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。同时Pod对多容器的支持是K8S中最基础的设计理念。在生产环境中,通常是由不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。

Pod是K8S集群中所有业务类型的基础,可以把Pod看作运行在K8S集群上的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8S的业务主要可以分为以下几种

上述的几种类型,分别对应的小机器人控制器为:Deployment、Job、DaemonSet 和 StatefulSet (后面将介绍控制器)

Pod实现机制

主要有以下两大机制

共享网络

容器本身之间相互隔离的,一般是通过 namespacegroup 进行隔离,那么Pod里面的容器如何实现通信?

关于Pod实现原理,首先会在Pod会创建一个根容器: pause容器,然后我们在创建业务容器 【nginx,redis 等】,在我们创建业务容器的时候,会把它添加到 info容器

而在 info容器 中会独立出 ip地址,mac地址,port 等信息,然后实现网络的共享

image-20201114190913859

完整步骤如下

共享存储

Pod持久化数据,专门存储到某个地方中

image-20201114193124160

使用 Volumn数据卷进行共享存储,案例如下所示

image-20201114193341993

Pod镜像拉取策略

我们以具体实例来说,拉取策略就是 imagePullPolicy

image-20201114193605230

拉取策略主要分为了以下几种

Pod资源限制

也就是我们Pod在进行调度的时候,可以对调度的资源进行限制,例如我们限制 Pod调度是使用的资源是 2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度

image-20201114194057920

示例

我们在下面的地方进行资源的限制

image-20201114194245517

这里分了两个部分

Pod重启机制

因为Pod中包含了很多个容器,假设某个容器出现问题了,那么就会触发Pod重启机制

image-20201114194722125

重启策略主要分为以下三种

Pod健康检查

通过容器检查,原来我们使用下面的命令来检查

kubectl get pod

但是有的时候,程序可能出现了 Java 堆内存溢出,程序还在运行,但是不能对外提供服务了,这个时候就不能通过 容器检查来判断服务是否可用了

这个时候就可以使用应用层面的检查

# 存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy【重启策略】来操作
livenessProbe

# 就绪检查,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除
readinessProbe

image-20201114195807564

Probe支持以下三种检查方式

Pod调度策略

创建Pod流程

image-20201114201611308

影响Pod调度的属性

Pod资源限制对Pod的调度会有影响

根据request找到足够node节点进行调度

image-20201114194245517

节点选择器标签影响Pod调度

image-20201114202456151

关于节点选择器,其实就是有两个环境,然后环境之间所用的资源配置不同

image-20201114202643905

我们可以通过以下命令,给我们的节点新增标签,然后节点选择器就会进行调度了

kubectl label node node1 env_role=prod

节点亲和性

节点亲和性 nodeAffinity 和 之前nodeSelector 基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上

image-20201114203433939

支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists

反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等

污点和污点容忍

概述

nodeSelector 和 NodeAffinity,都是Prod调度到某些节点上,属于Pod的属性,是在调度的时候实现的。

Taint 污点:节点不做普通分配调度,是节点属性

场景

查看污点情况

kubectl describe node k8smaster | grep Taint

image-20201114204124819

污点值有三个

未节点添加污点

kubectl taint node [node] key=value:污点的三个值

举例:

kubectl taint node k8snode1 env_role=yes:NoSchedule

删除污点

kubectl taint node k8snode1 env_role:NoSchedule-

image-20201114210022883

演示

我们现在创建多个Pod,查看最后分配到Node上的情况

首先我们创建一个 nginx 的pod

kubectl create deployment web --image=nginx

然后使用命令查看

kubectl get pods -o wide

image-20201114204917548

我们可以非常明显的看到,这个Pod已经被分配到 k8snode1 节点上了

下面我们把pod复制5份,在查看情况pod情况

kubectl scale deployment web --replicas=5

我们可以发现,因为master节点存在污点的情况,所以节点都被分配到了 node1 和 node2节点上

image-20201114205135282

我们可以使用下面命令,把刚刚我们创建的pod都删除

kubectl delete deployment web

现在给了更好的演示污点的用法,我们现在给 node1节点打上污点

kubectl taint node k8snode1 env_role=yes:NoSchedule

然后我们查看污点是否成功添加

kubectl describe node k8snode1 | grep Taint

image-20201114205516154

然后我们在创建一个 pod

# 创建nginx pod
kubectl create deployment web --image=nginx
# 复制五次
kubectl scale deployment web --replicas=5

然后我们在进行查看

kubectl get pods -o wide

我们能够看到现在所有的pod都被分配到了 k8snode2上,因为刚刚我们给node1节点设置了污点

image-20201114205654867

最后我们可以删除刚刚添加的污点

kubectl taint node k8snode1 env_role:NoSchedule-

污点容忍

污点容忍就是某个节点可能被调度,也可能不被调度

image-20201114210146123

标签:node,容器,Kubernetes,kubectl,核心技术,调度,Pod,节点
来源: https://www.cnblogs.com/nwnusun/p/16466683.html