编辑
2023-07-30
🚀运维部署
00
请注意,本文编写于 689 天前,最后修改于 225 天前,其中某些信息可能已经过时。

目录

kubernetes核心技术-pod
1.pod概述
2.pod存在的意义
3. pod实现机制
共享网络
共享存储
4. pod镜像拉取策略
5. Pod资源限制
6. pod重启机制
7. pod健康检查
8.创建pod流程
Master节点
Node节点
9.影响pod调用的属性

kubernetes核心技术-pod

1.pod概述

pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象

其他的资源对象都是用来支撑或者扩展pod对象功能的,

比如:

  • 控制器对象是用来管控pod对象的,
  • service或者Ingress资源是用来暴露pod引用对象的
  • PersistentVolume资源对象是用来为pod提供存储等等,

k8s不会直接处理容器,而是pod,pod是由一个或多个container组成

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

image.png

概括一下:

  1. pod是最小的部署单元
  2. 包含多个容器(一组容器集合)
  3. 一个pod中容器共享网络命名空间
  4. pod是短暂的

2.pod存在的意义

  1. 创建容器使用docker,一个docker对应一个容器,一个容器对应一个应用程序

  2. pod是多进程设计,运行多个应用程序。一个pod有多个容器,一个容器里面运行一个应用程序。

  3. pod存在为了亲密性应用。两个应用之间进行交互;网络之间调用;两个应用需要频繁调用

image.png

3. pod实现机制

共享网络

前提条件:容器在同一个namespace里面

  • 容器本身之间相互隔离的,主要技术是:

    namespace

    group

image.png

通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个命名空间,实现网络共享。

共享存储

  1. 持久化数据 引入数据卷概念Volumn,使用数据卷进行持久化存储

数据类型主要有:
* 日志数据 * 业务数据

image.png

image.png

4. pod镜像拉取策略

yaml
apiversion: v1 kind: Pod metadata: name: mypod spec: containers: - name: nginx image: nginx:1.14 imagePullPolicy: Always # IfNotPresent: 默认值,镜像在宿主机上不存在时才拉去 # Always:每次创建Pod都会重新拉取一次镜像 # Never: Pod永远不会主动拉取这个镜像

5. Pod资源限制

保证pod资源最大效果使用

image.png

CPU 250m等于250 milicpu,一个vCPIU或者一个超线程 = 1000milicpu。m表示是微秒/

image.png

6. pod重启机制

yaml
apiVersion: v1 kind: pod metadata: name: dns-test spec: contianers: - name: busybox image: busybox:1.28.4 args: - /bin/sh - -c - sleep 36000 restartPolicy: Never # Always: 当容器终止退出后,总是重启容器,默认策略 # OnFailure: 当容器异常退出(退出状态吗 非0)时,才重启容器 # Never: 当容器终止退出,从不重启容器 # 后两个适合批量任务

7. pod健康检查

例如:java堆内存溢出:状态是正常的,但是服务不能使用了

在k8s检查状态,状态虽然是Running,但是已经不能提供服务了

shell
kubectl get pods

解决方法:在应用层面进行健康检查

yaml
apiVersion: v1 kind: Pod metadata: labels: test: liveness name: liveness-exec spec: contianers: - name: liveness image: busybox args: - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5 # livenessProbe (存活检查) ## 如果检查失败,将杀死容器,根据pod的restartPolicy来操作 # readlinessProbe(就绪检查) ## 如果检查失败,kubernetes会把pod从service endpoints中剔除 # probe支持以下三种检查方法: ## httpGet ### 发送Http请求,返回200-400范围状态码为成功 ## exec ### 执行shell命令返回状态码是0为成功 ## tcpSocket ### 发起TCP socket 建立成功

8.创建pod流程

image.png

Master节点

  1. createpod -- apiserver -- etcd
  2. scheduler -- apiserver -- etcd -- 调度算法,把pod调度某个node节点上

Node节点

  1. kubelet -- apiserver -- 读取etcd拿到分配给当前节点pod -- docker创建容器

9.影响pod调用的属性

  1. pod资源限制对pod调用产生影响

image.png

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

首先要对节点创建标签

shell
kubectl label node node1 env_role=prod

image.png

image.png

  1. 节点亲和性影响pod调度
yaml
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoreDuringExecution: nodeSelectorTerms: - matchExpressions: - key: env_role operator: In values: - dev - test preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: group operator: In values: - otherprod containers: - name: webdemo image: nginx

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

  1. 硬亲和性

    约束条件必须要满足

  2. 软亲和性

    尝试满足,不保证

image.png

支持常用操作符:

  • In
  • NotIn
  • Exists
  • Gt
  • Lt
  • DoesNotExists
  1. 污点和污点容忍
一、基本介绍 nodeSelector和nodeAffinity: Pod调度到某些节点上,Pod属性,调度时候实现 Taint污点:节点不做普通分配调度,是节点属性 二、应用场景 1. 专用节点 2. 配置特点硬件节点 3. 基于Taint驱逐 三、具体演示 1. 查看节点污点情况 kubectl describe node k8smaster | grep Taint 污点值有三个 * NoSchedule 一定不被调度 * PreferNoSchdule 尽量不被调度 * NoExecute 不会调度,并且还会驱逐Node已有Pod 2. 为节点添加污点 kubectl taint node [node] key=value:污点的三个值 3. 删除污点 kubectl taint node k8snodel env_role:NoSchedule 4. 污点容忍

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!