pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象
其他的资源对象都是用来支撑或者扩展pod对象功能的,
比如:
k8s不会直接处理容器,而是pod,pod是由一个或多个container组成
Pod是Kubernetes的最重要概念,每一个pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
概括一下:
创建容器使用docker,一个docker对应一个容器,一个容器对应一个应用程序
pod是多进程设计,运行多个应用程序。一个pod有多个容器,一个容器里面运行一个应用程序。
pod存在为了亲密性应用。两个应用之间进行交互;网络之间调用;两个应用需要频繁调用
前提条件:容器在同一个namespace里面
容器本身之间相互隔离的,主要技术是:
namespace
group
通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个命名空间,实现网络共享。
数据类型主要有:
* 日志数据
* 业务数据
yamlapiversion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: Always
# IfNotPresent: 默认值,镜像在宿主机上不存在时才拉去
# Always:每次创建Pod都会重新拉取一次镜像
# Never: Pod永远不会主动拉取这个镜像
保证pod资源最大效果使用
CPU 250m等于250 milicpu,一个vCPIU或者一个超线程 = 1000milicpu。m表示是微秒/
yamlapiVersion: 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: 当容器终止退出,从不重启容器
# 后两个适合批量任务
例如:java堆内存溢出:状态是正常的,但是服务不能使用了
在k8s检查状态,状态虽然是Running,但是已经不能提供服务了
shellkubectl get pods
解决方法:在应用层面进行健康检查
yamlapiVersion: 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 建立成功
首先要对节点创建标签
shellkubectl label node node1 env_role=prod
yamlapiVersion: 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调度到哪些节点上。
硬亲和性
约束条件必须要满足
软亲和性
尝试满足,不保证
支持常用操作符:
一、基本介绍 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 许可协议。转载请注明出处!