前言:
参考k8s教程由浅入深
一、Pod概述:
定义:
- k8s系统中可以创建、管理的最小单元
- 资源对象模型中用户创建或部署的最小资源模型
- k8s上运行容器化应用的资源对象
- 其他资源作用是支持pod,如控制器是为了管控pod,Service和Ingress是为了暴露pod引用对象,PersistentVolume为pod提供存储
- pod不是容器,是一个或多个容器组成。k8s不会直接操作容器
- 一个pod中共享网络命名空间
- pod是短暂的。每一个pod都有一个根容器,叫pause容器,还有用户自己创建的容器
二、pod存在意义:
- 创建容器使用docker,一个docker对应一个容器,一个容器运行一个应用程序,对应一个进程
- pod是多进程设计,运行多个应用程序
- pod是为亲密性应用而存在的(两个应用频繁相互调用)
三、pod实现机制
1. docker之间相互隔离
实现机制:linux的namespace机制/cgroup
namespace:linux内核隔离内核资源的方式。通过namespace能让进行仅看到和自己进程相关的资源
cgroup:Linux下控制一个(或一组)进程的资源限制机制,可精细化的控制进程使用的cpu/内存
2.共享网络
前提条件:容器在同一个namespace下可以共享网络
实现机制:
a.默认创建根容器 pause(info容器)
b.后续创建的业务容器会加入info容器,使得业务容器与info容器在同一个namespace中,实现网络共享
3.共享存储
pod需要持久化的数据:日志数据、业务数据
实现机制:使用数据卷(Volume)进行持久化存储
多个pod将数据存储到Volume中,若node结点宕机,新建的镜像可以从数据卷中重新读取数据进行同步
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: centos
name: write
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
command: ["bash","-c","tail -f /data/hello"]
# 挂载数据卷
volumeMounts:
- name: data
mountPath: /data
# 定义数据卷
volumes:
- name: data
emptyDir: {}
四、镜像拉取策略
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: nginx:1.14
name: nginx
# 镜像拉取策略
imagePullPolicy:Always
如上,imagePullPolicy为镜像拉取策略。拉取策略分为:
- IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
- Always:每次创建pod都拉取
- Never:Pod永远不会主动拉取这个镜像
五、pod资源限制
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
# 资源限制
resources:
# 调度大小
request:
memory: "64Mi"
cpu: "250m" # 一核=1c=1000m
# 限制最大资源
limit:
memory: "128Mi"
cpu: "500m"
六、pod重启机制
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: nginx:1.14
name: nginx
imagePullPolicy:Always
# 重启策略
restartPolicy:Never
Always:容器终止退出后,总重启容器
OnFailure:容器异常退出后(状态码非0)重启
Never:不重启
七、健康检查
1.容器检查(部分问题容器检查定位不了)
2.应用层面检查
存活检查:如果检查失败,kill,根据restartPolicy策略操作
就绪检查:如果检查失败,将pod从service endpoints中剔除
Probe检查方法:
1.httpGet 状态码200-400则为成功
2.exec 执行shell命令返回0为成功
3.tcpSocket 发起TCP socket建立成功
apiVersion: apps/v1
kind: Pod
metadata:
name: pod-test
spec:
containers:
- image: busybox
name: write
args:
- /bin/sh
- -C
- touch /tmp/healthy; sleep 30;rm -rf /tmp/healthy
livenessProbe:
# probe检查方法:exec;有tmp/healthy--->0 无--->1
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5