云原生学习笔记
容器基本概念
容器 & 镜像
容器:是一个视图隔离,资源可限制,独立文件系统的进程集合
视图隔离:能看见部分进程,独立主机名
控制资源使用率:如2G内存大小;CPU使用个数等
镜像:运行容器所需要的所有文件集合 - 容器镜像
容器运行时的生命周期
单进程模型
1.Init进程生命周期=容器生命周期
2.运行期间可运行exec执行运维操作
数据持久化
对于一些重要的数据,例如mysql数据,我们希望将其持久化到指定的目录,这个目录即为数据卷
1.数据卷的生命周期独立于容器的生命周期
2.数据卷 - Docker volume vs bind
通过bind方式:
docker run -v /tmp:/tmp busybox:1.25 sh -c "data > /tmp/demo.log"
-v左边参数表示宿主机的目录,右边的参数表示容器内的目录
通过volume方式:
docker run -v demo:/tmp busybox:1.25 sh -c "data > /tmp/demo.log"
Kubernetes核心概念
Kubernetes三大核心功能
1.调度
K8s可以把一个容器放到一个集群的某一个机器上,k8s的调度器会观察这个容器的大小,规格,比如CPU Memory,然后调度器会在集群中找一台比较空闲的机器来进行一次placement
2.自动修复
K8S具有节点健康检查的功能,它会监测这个集群中所有的宿主机,当一个宿主机出现故障时,K8S会将该节点上的容器自动转移到健康节点上
3.水平伸缩
k8s有业务负载检查的能力,它会检测业务上所承担的负载,对业务进行水平扩容,减少负载
Kubernetes的架构
所有 UI 、clients、这些 user 侧的组件,只会和 Master 进行连接,把希望的状态或者想执行的命令下发给 Master,Master 会把这些命令或者状态下发给相应的节点
Master的架构:
Master分为API Server
,Scheduler
,Controller
,etcd
API Server
:处理API操作,K8s中的所有组件都依赖于API Server进行消息传递,组件间一般不进行独立连接
Scheduler
:即调度器,完成调度操作
Controller
:即控制器,用来完成对集群状态的一些管理,如自动对容器进行修复或自动进行水平扩张
etcd
:是一个分布式的一个存储系统,API Server中所需要的这些原信息都被放置在 etcd 中
Node的架构:
Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行
Container Runtime
:负责真正去启动配置容器和容器的运行环境
Storage Plugin/Network Plugin
:K8s在OS上创建容器运行的环境并将Pod启动起来的过程中不会直接对存储和网络进行操作,而是通过Storage/Network Plugin对其管理
Kube-proxy
:真正完成 service 组网的组件的是Kube-proxy,它是利用了 iptable 的能力来进行组建 Kubernetes 的 Network,就是 cluster network
Kubernetes部署流程
1.用户通过UI或者CLI提交一个Pod给Kubernetes进行部署,这个 Pod 请求首先会通过 CLI 或者 UI 提交给 Kubernetes API Server
2.API Server 会把这个信息写入到它的存储系统 etcdK
3.Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度
4.Scheduler会根据它的内存状态进行一次调度决策,在完成这次调度之后,它会向 API Server report 说:"OK!这个 Pod 需要被调度到某一个节点上。"
5.API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中
6.API Server 会通知相应的节点进行这次 Pod 真正的执行启动
7.相应节点的 kubelet 会得到这个通知,kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,Network Plugin 去配置网络
Kubernetes核心概念
1.Pod:
是Kubernetes的一个最小调度及资源单位,是一组容器的抽象,里面包含一个或多个容器
在 Pod 里面,我们也可以去定义容器所需要运行的方式。比如说运行容器的 Command,以及运行容器的环境变量等等。
Pod 给内部容器提供了一个共享的运行环境,容器们会共享同一个网络环境,这些容器可以用 localhost 来进行直接的连接。但是Pod 与 Pod 之间,是互相隔离的
2.Volume
即卷的概念,用来管理Kubernetes存储,声明在Pod中的容器可以访问到的文件目录,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面
3.Deployment
Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。
Deployment通过Controller维护Deployment中Pod的数目,它也会帮助Deployment自动恢复失败的Pod,当一个 Pod 失败的时候,Controller就会监测到,它重新把 Deployment 中的 Pod 数目从一个恢复到两个,通过再去新生成一个 Pod。通过控制器,我们也会帮助完成发布的策略。比如说进行滚动升级,进行重新生成的升级,或者进行版本的回滚。
4.Service
Service 提供了一个或者多个 Pod 实例的稳定访问地址。
对一个外部用户来讲,提供了多个具体的 Pod 地址,这个用户要不停地去更新 Pod 地址,当这个 Pod 再失败重启之后,我们希望有一个抽象,把所有 Pod 的访问能力抽象成一个第三方的一个 IP 地址,实现这个的 Kubernetes 的抽象就叫 Service,他把所有 Pod 的访问能力抽象成一个第三方的一个 IP 地址。
简单来说就是做负载均衡
5.Namespace
Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes 的每个资源,比如Pod、Deployment、Service 都属于一个 Namespace,同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名