概念
pod是k8s的基本调度单元 pod扮演的是传统部署环境中的虚拟机角色 容器扮演的运行在虚拟机中的用户进程
Pod对象字段
NodeSelector 提供用户将Pod与Node进行绑定的字段 Pod只能运行在满足NodeSelector的节点上 否则会调度失败
NodeName 一旦Pod的这个字段被赋值 k8s就会被认为此Pod已经通过了调度 调度的结果就是赋值的节点名字(可以用来调试)
HostAliases 定义Pod的hosts文件(/etc/hosts) 里面的内容
凡是跟 Linux Namespace相关的属性 都是Pod级别的
Init Containers字段
Init Containers的生命周期 会先于所有的Containers 并且严格按照定义的顺序执行
Containers字段
ImagePullPolicy 拉取镜像的策略方式
Lifecycle 容器状态发送变化时触发的钩子操作
postStart 在容器启动后立即执行的一个操作 和容器的ENTRYPOINT命令是异步执行的 postStart启动时候ENTRYPOINT有可能并没有执行完
postStart 执行失败该pod也会处于失败状态
preStop 容器被杀死之前执行 preStop操作是同步执行的 它会阻塞当前容器的杀死流程 直到preStop执行完毕才能运行容器退出
Pod的生命周期
Pending Pod的YAML文件已经提交给k8s API对象已经保存到etcd中 但是Pod中的某些容器还没有被创建
Running Pod已经被成功调度 包含的容器都已经被创建 并且至少有一个容器正在运行
Succeeded Pod中所有的容器都已经正常运行完毕并且已经退出(一次性任务)
Failed Pod中至少有一个容器以不正常的状态(非0的返回码)退出
Unknown 意味着Pod的状态不能持续的被kubelet汇报给apiserver(可能是主从节点通信问题)
Ready和Running的区别 Running 只代表容器自身的进程是正常运行的 但不能表示容器中提供服务的主进程是正常的(nginx返回500)等
Pod的Volume类型
投射数据卷(projected)
Secret 把pod想要访问的加密数据存储在etcd中 通过pod中的容器以挂载volume的方式来访问
这些保存在etcd里面的信息会以文件的方式出现在容器的volume目录中一旦etcd中的数据发生变化volume里面的内容也会被自动更新
由kubelet组件定时进行维护 所以这些内容的更新可能会有一定的时延 需要有重试和超时处理机制
configMap
明文存储配置文件信息
Downward
获取宿主机和Pod本身的一些属性信息 downwardApi能够获取到的信息一定是Pod里面的容器进程启动之前就能够确定下来的信息
pod里容器运行后才能出现的信息就不能被获取到了 这种情况要获取可以用sidecar容器来获取相关信息
serviceAccountToken
apiserver访问授权信息
Service Account介绍
是k8s系统内置的一种服务账户 它是k8s进行权限分配的对象
service Account的授权信息和文件实际上保存在它所绑定的一个特殊的Secret对象中 这个特殊的Secret对象就叫做ServiceAccountToken
k8s在每个pod创建的时候 自动在它的spec.volumes部分添加了默认的ServiceAccountToken定义然后给每个容器加上对应的volumeMounts字段
Pod中的容器固定路径的授权文件路径 /var/run/secrets/kubernetes.io/serviceaccount
容器健康检查和恢复机制
为Pod里的容器定义一个健康检查的探针
kubelet会根据这个探针的返回值来决定这个容器的状态 而不是直接以容器是否运行(Docker返回的信息)做为是否健康的依据
pod的恢复机制是重新创建一个新容器 而不是重启一个容器
pod一旦与某个宿主机进行了绑定 默认就不会离开这个节点 哪怕这个节点已经宕机了
如果需要在节点宕机后使pod自动切换到其它节点 就必须使用pod控制器(Deployment)来管理pod 这就是单纯的pod和控制器管理的pod的区别
livenessProbe探针
exec shell命令
httpGet
tcpSocket
livenessProbe的检查结果 影响的是Pod的生命周期 会导致Pod里面的容器发生异常时候自动重新创建新的容器 Pod的恢复策略
readinessProbe探针
语法和livenessProbe一样 但是作用却不一样 readlinessProbe检查出的结果成功与否 决定着这个Pod能否通过Service的方式被访问到
而不影响Pod的生命周期
Pod预设置
可以首先创建一个PodPreset的对象 然后通过selector选中相关Pod的定义 在创建Pod对象的时候自动把两者的字段进行合并
PodPreset只会影响被创建出来的pod实例 并不会影响创建pod的各种控制器的定义(Deployment)
k8s一切皆对象
1.应用抽象成Pod对象
2.应用的配置抽象成ConfigMap对象
3.应用要访问的密码抽象成Secret对象
4.Pod进行批量化,自动化修改的工具对象抽象成PodPreset对象
原文地址:https://www.cnblogs.com/yxh168/p/10919898.html