1、创建容器过程:
- 获取镜像
- 使用镜像创建容器
- 分配文件系统,挂载一个读写层,在读写层加载镜像
- 分配网络接口,让容器和宿主机通信
- 容器获取ip地址
- 执行容器命令
- 反馈容器启动结果
2、镜像分层:
- 加载宿主机内核
- 获取发行版
- 安装依赖
- 容器层
3、创建pod流程:
- 通过kubectl发起请求,
- apiserver通过对应的kubeconfig进行认证,通过之后将yaml中的pod信息存入etcd,
- Controller-manager通过apiserver的watch接口发现pod信息更新,执行该资源所依赖的拓扑结构整合,整合后将对应信息交给apiserver,再写入etcd中,此时pod可以被调度了,
- schedule也通过apiserver的watch接口更新到pod可以被调度,分配给相应的节点,并将pod和对应节点绑定的信息交给apiserver,apiserver写到etcd中,然后将pod交给kubelet。
- kubelet收到pod之后,调用cni接口给pod创建网络,调用cri去启动容器,调用csi进行存储卷挂载,
- 网络、容器、存储创建完成后,pod创建完成,等业务进程启动时,pod创建成功。
4、工作节点加入集群的过程:
- 在node上安装cni、kubelet、kube-proxy
- 配置kubelet和kube-proxy启动参数,将master url指定为当前k8s集群master的地址,最后启动服务
- 通过kubelet默认自动注册机制,新的master将会自动加入现有的k8s集群中
- K8s master在接受新的worker的注册之后,会自动将其纳入当前集群的调度范围
5、三种探针:
- startupProbe:判断容器内进程是否已经启动,会先禁用其他探测,直到成功为止,将不在检测
- livenessProbe: 探测容器是否存活(running状态),若探测失败,kubelet杀掉该容器,kubelet对应重启策略相应处理
- readinessProbe:探测容器是否启动完成(ready状态),若探测失败,pod状态被修改,endpoint controller 将从service的endpoint中删除包含该容器的pod的endpoint(pod从endpoint中剔除)
6、探测方式:
- exec:相当于echo $? ,再容器内执行命令返回值为0,则容器健康
- TCPSocket:相当于Telnet ip port ,tcp连接检查端口是否通
- HTTPSocket:相当于curl ,通过应用程序暴露api接口地址检查程序是否正常,返回状态码(200-400)之间,容器健康
7、镜像拉取策略 (imagePullPolicy):
- ifnotpresent:默认值,镜像在宿主机上不存在时才拉取
- Always:每次创建pod都会重新拉取一次镜像,标签为latest
- never:pod永远不会主动拉取这个镜像
- 注意:latest 标签的镜像默认为 Always ,生产环境中应该尽量避免使用 :latest 标签,而开发环境中可以借助 :latest 标签自动拉取最新的镜像。
8、重启策略 (restartPolicy):
- Always:终止退出,总是重启容器(RC和ds)
- onFailure:容器异常退出(退出状态码非0)时,才重启容器(job)
- never:容器终止退出,从不重启容器(job)