进程可见 可相互通信 共享同一份文件
资源视图隔离:namespace
控制资源使用率:cgroup(可以限制资源使用率)
独立的文件系统:chroot
进程可以运行在独立的环境,进程之间不会相互影响
什么是容器:视图隔离(可以看到其他的进程),资源可限制,独立文件系统的进程集合。独立主机名。
优点类似于微内核,容器,华为的鸿蒙
运行所需要的所有文件集合—镜像
用dockerfile–描述镜像的构建步骤(有便利的语法糖)
构建步骤所产生文件系统的变化–changeset
changeset分层,复用的特点提高分发效率,数据共享,减少磁盘压力
例如golang的镜像基于alpien
https://blog.csdn.net/CSDN_duomaomao/article/details/76152416
一个轻量级操作系统
具备复用能力很关键(changeset)
如何编写dockerfile
from:来自哪个镜像(镜像可以复用)
workdir(cd):接下来的步骤在哪进行
copy:将主机拷贝到镜像内
run:动作
cmd:镜像默认的名字
docker registry:本公司额镜像仓库
从镜像仓库下载下来pull
docker images
docker run 参数https://odcn.top/2019/02/13/2529/docker-run%E5%91%BD%E4%BB%A4%E5%8F%82%E6%95%B0%E4%B8%AD%E6%96%87%E4%BB%8B%E7%BB%8D/
build once run anywhere
init进程和容器的生命周期一致
init进程生命周期=容器生命周期
运行期间可运行exec执行运维操作
独立于容器的生命周期
数据卷–docker volume vs bind 容器的退出不会导致数据的丢失
shim:管理容器,插件化进行管理,动态接管,不会影响到现有的容器运行
容器基于进程 不需要guest os 只需要一个文件系统就可以
所以启动快,进程之间的隔离,但是进程之间的隔离并不好,比VM是要差很多的,消耗的资源少,提供的隔离的效果的差很多
容器也在强隔离方向发展。
源于希腊语,舵手,飞行员
为什么叫舵手呢,来自于集装箱
服务发现,负载均衡,容器自动装箱(调度),储存编排,自动容器恢复,自动发布与回滚,配置密文管理,批量执行,水平伸缩
健康检查机制(心跳包)
当k8s检测到某docker cpu负载过高等问题,会将某任务自动伸缩发放到其他容器,通过负载均衡,一个负载打到3个,提高响应时间
典型的C/S架构 server是中央管控节点
api server:处理api操作,所有的组件都链接api server 组件和组件不进行独立的链接,都通过api server进行消息的传送
controller:控制器,对集群状态进行管理(自动容器修复,水平扩张)
scheduler:调度器,根据cpu内存的大小,找一个合适的节点进行放置
etcd:分布式的存储系统,实现高可用
controller和scheduler可以进行热备
node真正的业务负载,node里面以pod的形式运行
pod中运行一个或多个容器
kubelet:真正运行pod的组件,通过
api server接收到pod需要运行的状态,提交到container runtime组件中,在os上真正创建容器运行的环境,最终把容器运行起来
storage plugin network plugin:一个网络和存储的插件,对网络的管理(云厂商自己去写plugin插件)
kube-proxy:真正实现组网的能力通过iptables
user通过master节点下发信息
client申请要创建一个pod,请求交给api server ,然后再etcd登记一下,交给scheduler(调度器),调度器看看给他分配到哪,确定好了,到etcd确认在记录下,然后交给相应节点的kubelet,然后会调用container runtime真正的启动配置容器的运行环境。然后配合插件进行存储和组网。
深入理解pod
为什么要用pod?
容器的本质:进程被隔离 资源受限制的进程
容器里PID= 1的进程就是应用本身
管理虚拟机就是管理基础设施,管理容器就是直接管理应用本身
这也是不可变基础设施的本质
因为硬资源的过剩引出的虚拟化的技术
k8s里的进程相当于linux里面的线程
操作系统的进程组,线程组的概念
pod类比于进程组,线程组
共享一些资源和文件
容器是单进程模型,不能创建复杂的程序
深入理解pod:
通过pod解决
pod有一个ip地址,被pod里的所有容器共享
war包+tomcat的容器化
镜像只打包tomcat。使用数据卷从宿主机挂载到tomcat,但是有问题,需要维护一个分布式的容器,因为容器是无状态的,当容器挂了之后新的容器的id又变了
有没有更好的方法?
pod里面通过localhost通信,不会降低性能
总结:
kubectl get pods --show-lables -l(查询) env=test(选择器pod,修改标签什么的)
kubectl get nginx1 -o yaml | less
kubectl apply -f yaml
kubectl get replicasets xxxxxxx - o yaml | less(创建出来)
kubectl get pods(查看集群中的pod情况)
kubectl get pods xxxxxxx -o yaml | less
replicasets创建出来的有个特点,有个references指向replicaset类型,名字叫nginx-replicaset
由三个组件构成:
采用声明式api
管理部署发布的控制器
定义一组pod的期望数量,controller会维持与期望一致
kubectl get pod
pod owner是replication而非deployment
更新镜像
kubectl set image deployment.vi.apps/nginx-deployment nginx=nginx:1.9.1
快速回滚
deployment只负责管理不同版本的replicaset,由replicaset管理pod副本数
每个replicaset对应了deployment template的一个版本,一个replicaset下的pod都是相同的
JOB:管理任务的控制器
创建一个或多个pod确保指定数量pod运行成功
kubectl create -f job.yaml
kubectl get jobs