基于k8s云原生技术栈学习
进程可见 可相互通信 共享同一份文件资源视图隔离:namespace控制资源使用率:cgroup(可以限制资源使用率)独立的文件系统:chroot进程可以运行在独立的环境,进程之间不会相互影响什么是容器:视图隔离(可以看到其他的进程),资源可限制,独立文件系统的进程集合。独立主机名。优点类似于微内核,容器,华为的鸿蒙运行所需要的所有文件集合—镜像用dockerfile–描...
进程可见 可相互通信 共享同一份文件
资源视图隔离:namespace
控制资源使用率:cgroup(可以限制资源使用率)
独立的文件系统:chroot
进程可以运行在独立的环境,进程之间不会相互影响
什么是容器:视图隔离(可以看到其他的进程),资源可限制,独立文件系统的进程集合。独立主机名。
优点类似于微内核,容器,华为的鸿蒙
运行所需要的所有文件集合—镜像
用dockerfile–描述镜像的构建步骤(有便利的语法糖)
构建步骤所产生文件系统的变化–changeset
- 类似于disk snapshot
- 提高分发效率,减少磁盘压力
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 容器的退出不会导致数据的丢失
- 通过-v 的参数挂载(这种方式比较简单,依赖宿主机的目录,提高运维成本,需要对所有分宿主机统一管理)
- 目录的管理交给容器运行的引擎
docker create volume demo(交给docker来管理)
区别:挂载时候容器的名字变成volume的名字
数据卷独立容器运行存在,帮助数据的持久化
moby容器引擎架构
shim:管理容器,插件化进行管理,动态接管,不会影响到现有的容器运行
容器和VM 的区别
容器基于进程 不需要guest os 只需要一个文件系统就可以
所以启动快,进程之间的隔离,但是进程之间的隔离并不好,比VM是要差很多的,消耗的资源少,提供的隔离的效果的差很多
容器也在强隔离方向发展。
预告
- 容器镜像的本质
- 深入了解容器隔离namespace和资源隔离
- 容器数据卷的实现方式
- containerd架构分析和工作原理解析
kubernetes - 工业级的容器编排平台
源于希腊语,舵手,飞行员
为什么叫舵手呢,来自于集装箱
寓意:管理运送集装箱的平台
服务发现,负载均衡,容器自动装箱(调度),储存编排,自动容器恢复,自动发布与回滚,配置密文管理,批量执行,水平伸缩
kubernetes-调度
kubernetes-自动恢复
健康检查机制(心跳包)
kubernetes-水平伸缩
当k8s检测到某docker cpu负载过高等问题,会将某任务自动伸缩发放到其他容器,通过负载均衡,一个负载打到3个,提高响应时间
kubernetes架构
典型的C/S架构 server是中央管控节点
k8s master架构
api server:处理api操作,所有的组件都链接api server 组件和组件不进行独立的链接,都通过api server进行消息的传送
controller:控制器,对集群状态进行管理(自动容器修复,水平扩张)
scheduler:调度器,根据cpu内存的大小,找一个合适的节点进行放置
etcd:分布式的存储系统,实现高可用
controller和scheduler可以进行热备
k8s-node
node真正的业务负载,node里面以pod的形式运行
pod中运行一个或多个容器
kubelet:真正运行pod的组件,通过
api server接收到pod需要运行的状态,提交到container runtime组件中,在os上真正创建容器运行的环境,最终把容器运行起来
storage plugin network plugin:一个网络和存储的插件,对网络的管理(云厂商自己去写plugin插件)
kube-proxy:真正实现组网的能力通过iptables
user通过master节点下发信息
kubernetes的架构例子
client申请要创建一个pod,请求交给api server ,然后再etcd登记一下,交给scheduler(调度器),调度器看看给他分配到哪,确定好了,到etcd确认在记录下,然后交给相应节点的kubelet,然后会调用container runtime真正的启动配置容器的运行环境。然后配合插件进行存储和组网。
核心概念pod
- 最小的额调度单元,原因是docker之间可能有依赖
- 一组容器的抽象(可以指定容器需要资源的大小)多少核多少g
- 还可以volume卷的硬盘存储
- 可以定义容器运行的command 环境变量等
- pod抽象可以共享网络环境(进程之间的隔离)
核心概念-volume
- 声明在pod中的容器可访问的文件目录
- volume也可以支持很多后端的存储插件(本地,分布式,云存储)
核心概念-Deployment
- 可以定义一组pod的副本数目,版本等
- 通过controller维持pod数目,也会帮助deployment
- 通过控制器以指定策略的控制版本(滚动升级,版本回滚)
核心概念 - service
- 类似于vip LB里面的东西
核心概念-namespace
- namespace提供隔离的机制
api基础知识
spec下面还有个status来表示运行的状态
api-lable
- 进行选择
Pod
深入理解pod
为什么要用pod?
容器的本质:进程被隔离 资源受限制的进程
容器里PID= 1的进程就是应用本身
管理虚拟机就是管理基础设施,管理容器就是直接管理应用本身
这也是不可变基础设施的本质
因为硬资源的过剩引出的虚拟化的技术
k8s里的进程相当于linux里面的线程
操作系统的进程组,线程组的概念
pod类比于进程组,线程组
共享一些资源和文件
容器是单进程模型,不能创建复杂的程序
深入理解pod:
- 比如docker之间需要文件的交换,读写日志
- 使用socketjin行本地通信
- 会发生rpc调用
- 共享namespace
通过pod解决
共享网络
pod有一个ip地址,被pod里的所有容器共享
pod共享存储
容器设计模式
war包+tomcat的容器化
-
镜像只打包tomcat。使用数据卷从宿主机挂载到tomcat,但是有问题,需要维护一个分布式的容器,因为容器是无状态的,当容器挂了之后新的容器的id又变了
-
有没有更好的方法?
initcontaine
- 只做了一件事将war包copy到容器里,干完一件事就退出了
- 比用户容器先启动,严格按照定义顺序执行
经典容器设计模式
pod里面通过localhost通信,不会降低性能
sidecar:适配器容器
业务暴露出的api,一个转发的机制代理模式(代理容器)
总结:
- pod是核心机制
- 容器设计模式,进程组
- 容器设计模式本质都是解耦和重用(istio)
kubernetes资源对象
labels
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
控制器模式
核心:控制循环的概念
sensor(逻辑的传感器)
由三个组件构成:
- reflector
- informer
- indexer
采用声明式api
deployment
管理部署发布的控制器
定义一组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
job的执行单元还是pod
并行job
定时任务cronjob
应用配置管理
pod的配置管理
更多推荐
所有评论(0)