基于k8s云原生技术栈学习

基于k8s云原生技术栈学习_第1张图片

基于k8s云原生技术栈学习_第2张图片
基于k8s云原生技术栈学习_第3张图片
基于k8s云原生技术栈学习_第4张图片
基于k8s云原生技术栈学习_第5张图片

进程可见 可相互通信 共享同一份文件
资源视图隔离:namespace
控制资源使用率:cgroup(可以限制资源使用率)
独立的文件系统:chroot
进程可以运行在独立的环境,进程之间不会相互影响

什么是容器:视图隔离(可以看到其他的进程),资源可限制,独立文件系统的进程集合。独立主机名。

优点类似于微内核,容器,华为的鸿蒙

运行所需要的所有文件集合—镜像

用dockerfile–描述镜像的构建步骤(有便利的语法糖)

构建步骤所产生文件系统的变化–changeset

  • 类似于disk snapshot
  • 提高分发效率,减少磁盘压力

changeset分层,复用的特点提高分发效率,数据共享,减少磁盘压力

例如golang的镜像基于alpien
https://blog.csdn.net/CSDN_duomaomao/article/details/76152416
一个轻量级操作系统

具备复用能力很关键(changeset)

如何编写dockerfile
基于k8s云原生技术栈学习_第6张图片
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的名字

基于k8s云原生技术栈学习_第7张图片
数据卷独立容器运行存在,帮助数据的持久化

moby容器引擎架构

基于k8s云原生技术栈学习_第8张图片

shim:管理容器,插件化进行管理,动态接管,不会影响到现有的容器运行

容器和VM 的区别

基于k8s云原生技术栈学习_第9张图片
容器基于进程 不需要guest os 只需要一个文件系统就可以

所以启动快,进程之间的隔离,但是进程之间的隔离并不好,比VM是要差很多的,消耗的资源少,提供的隔离的效果的差很多

容器也在强隔离方向发展。

预告

  • 容器镜像的本质
  • 深入了解容器隔离namespace和资源隔离
  • 容器数据卷的实现方式
  • containerd架构分析和工作原理解析

kubernetes - 工业级的容器编排平台

源于希腊语,舵手,飞行员

为什么叫舵手呢,来自于集装箱

基于k8s云原生技术栈学习_第10张图片
寓意:管理运送集装箱的平台

基于k8s云原生技术栈学习_第11张图片
服务发现,负载均衡,容器自动装箱(调度),储存编排,自动容器恢复,自动发布与回滚,配置密文管理,批量执行,水平伸缩

kubernetes-调度

基于k8s云原生技术栈学习_第12张图片

kubernetes-自动恢复

基于k8s云原生技术栈学习_第13张图片

健康检查机制(心跳包)

kubernetes-水平伸缩

基于k8s云原生技术栈学习_第14张图片

当k8s检测到某docker cpu负载过高等问题,会将某任务自动伸缩发放到其他容器,通过负载均衡,一个负载打到3个,提高响应时间

kubernetes架构

基于k8s云原生技术栈学习_第15张图片

典型的C/S架构 server是中央管控节点

k8s master架构

基于k8s云原生技术栈学习_第16张图片

api server:处理api操作,所有的组件都链接api server 组件和组件不进行独立的链接,都通过api server进行消息的传送
controller:控制器,对集群状态进行管理(自动容器修复,水平扩张)
scheduler:调度器,根据cpu内存的大小,找一个合适的节点进行放置
etcd:分布式的存储系统,实现高可用

controller和scheduler可以进行热备

k8s-node

基于k8s云原生技术栈学习_第17张图片

node真正的业务负载,node里面以pod的形式运行

pod中运行一个或多个容器

kubelet:真正运行pod的组件,通过
api server接收到pod需要运行的状态,提交到container runtime组件中,在os上真正创建容器运行的环境,最终把容器运行起来

storage plugin network plugin:一个网络和存储的插件,对网络的管理(云厂商自己去写plugin插件)

kube-proxy:真正实现组网的能力通过iptables

user通过master节点下发信息

kubernetes的架构例子

基于k8s云原生技术栈学习_第18张图片

client申请要创建一个pod,请求交给api server ,然后再etcd登记一下,交给scheduler(调度器),调度器看看给他分配到哪,确定好了,到etcd确认在记录下,然后交给相应节点的kubelet,然后会调用container runtime真正的启动配置容器的运行环境。然后配合插件进行存储和组网。

核心概念pod

基于k8s云原生技术栈学习_第19张图片

  • 最小的额调度单元,原因是docker之间可能有依赖
  • 一组容器的抽象(可以指定容器需要资源的大小)多少核多少g
  • 还可以volume卷的硬盘存储
  • 可以定义容器运行的command 环境变量等
  • pod抽象可以共享网络环境(进程之间的隔离)

核心概念-volume

基于k8s云原生技术栈学习_第20张图片

  • 声明在pod中的容器可访问的文件目录
  • volume也可以支持很多后端的存储插件(本地,分布式,云存储)

核心概念-Deployment

基于k8s云原生技术栈学习_第21张图片

  • 可以定义一组pod的副本数目,版本等
  • 通过controller维持pod数目,也会帮助deployment
  • 通过控制器以指定策略的控制版本(滚动升级,版本回滚)

核心概念 - service

基于k8s云原生技术栈学习_第22张图片

  • 类似于vip LB里面的东西

核心概念-namespace

基于k8s云原生技术栈学习_第23张图片

  • namespace提供隔离的机制

api基础知识

基于k8s云原生技术栈学习_第24张图片
spec下面还有个status来表示运行的状态

api-lable

基于k8s云原生技术栈学习_第25张图片

  • 进行选择

Pod

深入理解pod
为什么要用pod?

容器的本质:进程被隔离 资源受限制的进程

容器里PID= 1的进程就是应用本身

管理虚拟机就是管理基础设施,管理容器就是直接管理应用本身
这也是不可变基础设施的本质

因为硬资源的过剩引出的虚拟化的技术

  • 那么kubernetes呢?
  • 说kubernetes就是云时代的操作系统
  • 容器镜像就是操作系统的软件安装包

k8s里的进程相当于linux里面的线程
操作系统的进程组,线程组的概念

pod类比于进程组,线程组

共享一些资源和文件

容器是单进程模型,不能创建复杂的程序

深入理解pod:

  • 比如docker之间需要文件的交换,读写日志
  • 使用socketjin行本地通信
  • 会发生rpc调用
  • 共享namespace

通过pod解决

共享网络

基于k8s云原生技术栈学习_第26张图片

pod有一个ip地址,被pod里的所有容器共享

pod共享存储

基于k8s云原生技术栈学习_第27张图片

容器设计模式

war包+tomcat的容器化

  • 镜像只打包tomcat。使用数据卷从宿主机挂载到tomcat,但是有问题,需要维护一个分布式的容器,因为容器是无状态的,当容器挂了之后新的容器的id又变了

  • 有没有更好的方法?

initcontaine

基于k8s云原生技术栈学习_第28张图片

  • 只做了一件事将war包copy到容器里,干完一件事就退出了
  • 比用户容器先启动,严格按照定义顺序执行

经典容器设计模式

基于k8s云原生技术栈学习_第29张图片

pod里面通过localhost通信,不会降低性能

sidecar:适配器容器

基于k8s云原生技术栈学习_第30张图片
业务暴露出的api,一个转发的机制代理模式(代理容器)

总结:

  • pod是核心机制
  • 容器设计模式,进程组
  • 容器设计模式本质都是解耦和重用(istio)

kubernetes资源对象

基于k8s云原生技术栈学习_第31张图片

labels

基于k8s云原生技术栈学习_第32张图片

基于k8s云原生技术栈学习_第33张图片

基于k8s云原生技术栈学习_第34张图片

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

控制器模式

核心:控制循环的概念

基于k8s云原生技术栈学习_第35张图片

sensor(逻辑的传感器)

基于k8s云原生技术栈学习_第36张图片

由三个组件构成:

  • reflector
  • informer
  • indexer

采用声明式api

基于k8s云原生技术栈学习_第37张图片

deployment

管理部署发布的控制器

定义一组pod的期望数量,controller会维持与期望一致

基于k8s云原生技术栈学习_第38张图片

kubectl get pod

pod owner是replication而非deployment

更新镜像

kubectl set image deployment.vi.apps/nginx-deployment nginx=nginx:1.9.1

快速回滚

基于k8s云原生技术栈学习_第39张图片

deployment只负责管理不同版本的replicaset,由replicaset管理pod副本数
基于k8s云原生技术栈学习_第40张图片

每个replicaset对应了deployment template的一个版本,一个replicaset下的pod都是相同的

JOB:管理任务的控制器

创建一个或多个pod确保指定数量pod运行成功

kubectl create -f job.yaml

kubectl get jobs

job的执行单元还是pod
基于k8s云原生技术栈学习_第41张图片

并行job
基于k8s云原生技术栈学习_第42张图片
定时任务cronjob
基于k8s云原生技术栈学习_第43张图片
基于k8s云原生技术栈学习_第44张图片

基于k8s云原生技术栈学习_第45张图片

基于k8s云原生技术栈学习_第46张图片

基于k8s云原生技术栈学习_第47张图片

基于k8s云原生技术栈学习_第48张图片

应用配置管理

pod的配置管理

基于k8s云原生技术栈学习_第49张图片

你可能感兴趣的:(基于k8s云原生技术栈学习)