pod基本概念 (几种容器)
pod 是k8s最小的创建和运行单元
一个pod包含几个容器,1个根容器/父容器/基础容器,一个或者多个应用容器/业务容器,pause容器
pod里面容器共享 network UTS IPC命令空间
k8s 创建的Pod 分为两种:
自主式/静态pod:不被控制器管理的pod,没有自愈能力,一旦pod挂掉,不会被重新拉起。而且副本数量也不会因为达不到期望值而创建新的pod。
控制器管理的pod:被控制器管理的pod,有自愈能力,一旦pod挂掉,会被重新拉起。而且副本数量会因为达不到期望值而创建新的pod。
三种容器
pause容器 两大功能
给pod中的所有应用容器提供网络 (共享IP)和存储(共享存储)资源共享,作为PID-1的进程 (intit进程),管理整个pod中容器组生命周期。
初始化容器 (init容器)
阻塞或者延迟应用容器的启动,可以为应用容器事先提供好运行环境和工具,多个init容器时串行启动的,每个init容器都必须在下一个init容器启动前完成启动和退出。
应用容器 (main 容器)
在所有init容器成功启动和退出后应用容器才会启动 并行启动的,提供应用程序的业务。
pod 存在的意义
在一组容器作为一个单元的情况下,难以对整体的容器简单地进行判断及有效地进行行动。比如,一个容器死亡了 那么引入与业务无关的Pause容器作为Pod的基础容器,以它的状态代表着整个容器组的状态,这样就可以解决该问题。
Pod里的多个应用容器共享Pause容器的IP,共享Pause容器挂载的Volume,这样简化了应用容器之间的通信问题,也解决了容器之间的文件共享问题。
镜像拉取的策略
pod镜像拉取策略(imagePullPolicy)三种
1、IfNotPresent: 优先使用本地已存在的仓库,如本地没有,则从仓库镜像拉取。
2、Always:总是从仓库拉取镜像,无论本地是否已存在镜像。
3、Never:总是不从仓库拉取镜像,仅使用本地镜像。
pod 容器重启策略(restartPolicy) 三种 container在同一层
1、Always:容器退出总是重启容器,不管返回状态码如何,默认的Pod容器重启策略。
2、Never:容器退出时从不重启容器,不管返回状态码如何
3、OnFailure:仅在容器异常退出时(状态码非0时),会重启容器。
命令
应用容器
创建yaml文件
执行后查看pod状态
kubectl describe pod myapp-pod -n qq
kubectl logs myapp-pod -c init-myservice -n qq
显示缺失文件
添加service文件
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
(加命名空间)
查看pod状态
镜像拉取
创建yaml文件
查看pod状态
发现 Pod 中的容器在生命周期结束后,由于 Pod 的重启策略为 Always,容器再次重启了,并且又重新开始拉取镜像。
修改yaml 文件
查看pod状态
资源限制(cpu 内存)
spec.containers[].resources.requests.cpu //定义创建容器时预分配的CPU资源
spec.containers[].resources.requests ,memory //定义创建容器时预分配的CPU资源
spec.containers[].resources.limits.cpu //定义创建容器时预分配的内存资源
spec.containers[].resources.limits .memory //定义 cpu 的资源上限//定义内存的资源上限
kubectl describe nodes node01 查看资源占用
探针 (健康检查),存活,就绪,启动
存活探针:判断容器是否运行正常,如果探测失败则杀掉容器 (不是pod),容器会根据容器策略决定时否重启。
就绪探针:判断pod是能够进入ready状态,做好就收请求的准备,如果探测失败就会进入notready状态并且service资源的endpoints中剔除,service将不会把访问请求转发给这个pod。
启动探针:判断容器是否会成功,在探测成功转变为success之前,其他探针都会处于失效状态。
三种探测方式
exec:通过command设置执行在容器内执行的linux 命令来探测,如果返回码为0,则为探测成功。
httpget:通过http get 请求范文指定的容器端口和url路径,如果返回状态为>=200且< 400,则认为探测成功。
tcpsocket:通过指定的端口发送TCP 连接,如果端口无误 且三次握手成功 (tcp连接成功),则认为探测成功