Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在K8S上运行容器化应用的资源对象
,其它的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,K8S不会直接处理容器,而是Pod,Pod是由一个或多个container组成。
Pod是Kubernetes的最重要概念,每一个Pod都有一个特殊的被称为 “根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
Pod的存在是为了亲密性应用
Pod是在K8S集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。同时Pod对多容器的支持是K8S中最基础的设计理念。在生产环境中,通常是由不同的团队各自开发构建自己的容器镜像,在部署的时候组合成一个微服务对外提供服务。
Pod是K8S集群中所有业务类型的基础,可以把Pod看作运行在K8S集群上的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前K8S的业务主要可以分为以下几种
上述的几种类型,分别对应的小机器人控制器为:Deployment、Job、DaemonSet 和 StatefulSet (后面将介绍控制器)
主要有以下两大机制
容器本身之间相互隔离的,一般是通过 namespace 和 group 进行隔离,那么Pod里面的容器如何实现通信?
首先需要满足前提条件,也就是容器都在同一个namespace之间
关于Pod实现原理,首先会在Pod会创建一个根容器: pause容器(info容器),然后我们在创建业务容器 【nginx,redis 等】,在我们创建业务容器的时候,会把它添加到 info容器 中而在 info容器 中会独立出 ip地址,mac地址,port 等信息,然后实现网络的共享
Pod持久化数据,专门存储到某个地方中
引入Volumn数据卷概念,使用数据卷进行持久化存储
使用 Volumn数据卷进行共享存储,案例如下所示
apiversion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: write #循环写入1-100
image: centos
command: ["bash","-c","for i in (1..100 );do echo $i >> /data/hello;sleep 1;done"]
volumeMounts: #挂载数据卷
- name: data
mountPath: /data
- name: read #写入读取的数据
image: centos
cominand: ["bash","-c","tail -f /data/hel1o"]
volumeMounts: #挂载数据卷
- name: data
mountPath: /data
volumes: #定义数据卷
- name: data
emptyDir: () #默认是空的
拉取策略就是 imagePullPolicy
apiversion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
imaae: nainx :1.14
imagePullPolicy: Always
拉取策略(imagePullPolicy)主要分为了以下几种
也就是我们Pod在进行调度的时候,可以对调度的资源进行限制,例如我们限制 Pod调度是使用的资源是 2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度
示例
apiversion:v1
kind: Pod
metadata:
name : frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources: #资源限制部分
recuests: #request:表示调度所需的资源
memory: "64Mi" #内存
cpu:"250m" #cpu
limits: #limits:表示最大所占用的资源
memory: "128Mi"
cpu: "500m"
状态值 | 说明 |
---|---|
Pending | API Server已经创建了该Pod,但Pod中的一个或多个容器的镜像还没有创建,包括镜像下载过程 |
Running | Pod内所有容器已创建,且至少一个容器处于运行状态、正在启动状态或正在重启状态 |
Completed | Pod内所有容器均成功执行退出,且不会再重启 |
Failed | Pod内所有容器均已退出,但至少一个容器退出失败 |
Unknown | 由于某种原因无法获取Pod状态,例如网络通信不畅s:/iblog.csdn.nakai46385076 |
因为Pod中包含了很多个容器,假设某个容器初选问题了,那么就会触发Pod重启机制
apiversion: v1
kind: Pod
metadata:
name: dns-test
spec:
containers :
- name: busybox
image: busybox : 1.28.4
args:
- /bin/sh
- -c
- sleep 36000
restartPolicy: Never
重启策略(restartPolicy)主要分为以下三种
通过容器检查,原来我们使用下面的命令来检查
[root@k8s-master ~]$ kubectl get pods
但是有的时候,程序可能出现了 Java 堆内存溢出,程序还在运行,但是不能对外提供服务了,这个时候就不能通过 容器检查来判断服务是否可用了
这个时候就可以使用应用层面的检查
# 存活检查,如果检查失败,将杀死容器,根据Pod的restartPolicy【重启策略】来操作
livenessProbe
# 就绪检查,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除
readinessProbe
示例
apiversion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /emp/healthy
livenessProbe: #健康检查策略
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
Probe(livenessProbe)支持以下三种检查方式
根据request找到足够node节点进行调度
apiversion:v1
kind: Pod
metadata:
name : frontend
spec:
containers:
- name: db
image: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
resources: #资源限制部分
recuests: #request:表示调度所需的资源
memory: "64Mi" #内存
cpu:"250m" #cpu
limits: #limits:表示最大所占用的资源
memory: "128Mi"
cpu: "500m"
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
nodeSelector: #节点选择器
env_role: dev #开发环境
containers:
- name: nginx
image: nginx:1.15
关于节点选择器,其实就是有两个环境,然后环境之间所用的资源配置不同
我们可以通过以下命令,给我们的节点新增标签,然后节点选择器就会进行调度了
[root@k8s-master ~]$ kubectl label node k8s-node01 env_role=prod
k8s-node01:节点的名字
env_role:标签的名字
节点亲和性 nodeAffinity 和 之前nodeSelector 基本一样的,根据节点上标签约束来决定Pod调度到哪些节点上
支持常用操作符:in(存在)、NotIn(不存在)、Exists(存在)、Gt(大于)、Lt(小于)、DoesNotExists(不存在)
反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等
概述
nodeSelector 和 NodeAffinity,都是Prod调度到某些节点上,属于Pod的属性,是在调度的时候实现的。
Taint 污点:节点不做普通分配调度,是节点属性
应用场景
查看污点情况
[root@k8s-master ~]$ kubectl describe node k8s-master | grep Taint
Taints: node-role.kubernetes.io/master:NoSchedule
#NoSchedule值
污点值有三个
为节点添加污点
语法:
kubectl taint node [nodeName] key=value:污点的三个值
key:名字随便起
value:yes
示例
#查看污点
[root@k8s-master ~]$ kubectl describe node k8s-node01 | grep Taint
Taints:
#删除一个pod,之前创建的
[root@k8s-master ~]$ kubectl delete deployment nginx
#创建一个pod
[root@k8s-master ~]$ kubectl create deployment web --image=nginx
#查看详细信息
[root@k8s-master ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-5dcb957ccc-9sm2z 1/1 Running 0 60s 10.244.2.6 k8s-node02
#分配到了node02节点上了
#多创建几个,scale 子命令扩宿容副本集的数量。deployment,资源对象,web 指定资源的名称
[root@k8s-master ~]$ kubectl scale deployment web --replicas=5
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-5dcb957ccc-9sm2z 1/1 Running 0 5m55s 10.244.2.6 k8s-node02
web-5dcb957ccc-bzdtb 1/1 Running 0 25s 10.244.1.4 k8s-node01
web-5dcb957ccc-kczbb 1/1 Running 0 25s 10.244.2.8 k8s-node02
web-5dcb957ccc-pb7wg 1/1 Running 0 25s 10.244.1.5 k8s-node01
web-5dcb957ccc-qjrd8 1/1 Running 0 25s 10.244.2.7 k8s-node02
#没有加污点,就会分配不同的节点
#为了演示污点,把创建的pod全部删掉
[root@k8s-master ~]$ kubectl delete deployment web
#添加污点
[root@k8s-master ~]$ kubectl taint node k8s-node01 env_role=yes:NoSchedule
[root@k8s-master ~]$ kubectl describe node k8s-node01 | grep Taint
Taints: env_role=yes:NoSchedule
#创建一个pod
[root@k8s-master ~]$ kubectl create deployment web --image=nginx
#查看详细信息
[root@k8s-master ~]$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-5dcb957ccc-9sm2z 1/1 Running 0 60s 10.244.2.6 k8s-node02
#分配到了node02节点上了
#多创建几个,scale 子命令扩宿容副本集的数量。deployment,资源对象,web 指定资源的名称
[root@k8s-master ~]$ kubectl scale deployment web --replicas=5
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-5dcb957ccc-4pr6j 1/1 Running 0 27s 10.244.2.10 k8s-node02
web-5dcb957ccc-h5sp2 1/1 Running 0 27s 10.244.2.12 k8s-node02
web-5dcb957ccc-q2bdz 1/1 Running 0 58s 10.244.2.9 k8s-node02
web-5dcb957ccc-vqpnf 1/1 Running 0 27s 10.244.2.11 k8s-node02
web-5dcb957ccc-wbr44 1/1 Running 0 27s 10.244.2.13 k8s-node02
#全部分配到了node02节点上面
#删除污点
[root@k8s-master ~]$ kubectl taint node k8s-node01 env_role:NoSchedule-
污点容忍