Pod概念
pod是k8s的基本调度单元 pod扮演的是传统部署环境中的虚拟机角色 容器扮演的运行在虚拟机中的用户进程
由一个或多个容器组合在一起得共享资源
共享存储 如Volumes卷
网络 唯一的集群IP地址
每个容器运行的信息 例如:容器镜像版本
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里面的内容也会被自动更新
而这个文件的名字,就是 kubectl create secret 指定的 Key,或者说是 Secret 对象的data字段指定的 Key
由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
容器健康检查和恢复机制
restartPolicy 它是Pod的Spec部分的一个标准字段(pod.spec.restartPolicy)默认值是 Always即:任何时候这个容器发生了异常它一定会被重新创建
Kubernetes中并没有Docker的Stop语义,所以虽然是 Restart(重启) 但实际却是重新创建了容器
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通过设置restartPolicy改变Pod的恢复策略.除了Always还有OnFailure和Never两种情况:
1.Always:在任何情况下只要容器不在运行状态,就自动重新创建一个新的容器
一个Pod它只计算1+1=2计算完成输出结果后退出变成Succeeded状态.这时,你如果再用restartPolicy=Always强制重启这个Pod的容器就没有意义
2.OnFailure: 只在容器异常时才自动重启容器
3.Never: 从来不重启容器
如果要关心这个容器退出后的上下文环境比如容器退出后的日志,文件和目录.就需要将restartPolicy设置为Never.因为一旦容器被自动重新创建,这些内容就有可能丢失掉了(被垃圾回收了)
Pod显示状态的原则
1.只要Pod的restartPolicy指定的策略允许重启异常的容器(比如:Always)那么这个Pod就会保持Running状态,并进行容器重启.否则Pod就会进入Failed状态
2.对于包含多个容器的Pod只有它里面所有的容器都进入异常状态后Pod才会进入Failed状态.在此之前Pod都是Running状态此时Pod的READY字段会显示正常容器的个数
Pod预设置
可以首先创建一个PodPreset的对象 然后通过selector选中相关Pod的定义 在创建Pod对象的时候自动把两者的字段进行合并
PodPreset只会影响被创建出来的pod实例 并不会影响创建pod的各种控制器的定义(Deployment)
k8s一切皆对象
1.应用抽象成Pod对象
2.应用的配置抽象成ConfigMap对象
3.应用要访问的密码抽象成Secret对象
4.Pod进行批量化,自动化修改的工具对象抽象成PodPreset对象
Node资源对象
Node是Kubernetes中的工作节点,可以是虚拟机或物理机.每个Node由Master管理Node上可以有多个pod,Kubernetes Master会自动处理群集中Node的pod调度,同时Master的自动调度会考虑每个Node上的可用资源
Node上运行的进程:
1.Kubelet
Kubelet管理Kubernetes Master和Node之间的通信管理机器上运行的Pods和containers容器
2.container runtime (如Docker,rkt)
3.kube-proxy 监视的service创建和变化 动态创建Node上面的iptables规则