ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

容器弹性云底层原理揭秘

2021-02-26 22:33:10  阅读:161  来源: 互联网

标签:容器 ip 揭秘 网卡 pod k8s docker 底层


Docker

容器概念

容器特性

1、不标准物品标准化(比如杂物、液体、应用)

2、上层工具提供标准化的操作方式 屏蔽细节

容器定义

构建、管理、保护应用程序

容器举例

  • 包装、运输
  • Add/Delete/Iterator
  • 应用管理和调度

容器技术演进

OS虚拟化->内核轻量级虚拟化->资源隔离机制(内存、CPU、网络、IO独占)

docker共享host内核;通过namespace和cgroup来做资源隔离的

Docker本质不是一个操作系统 其实就是一个进程 利用操作系统机制做隔离

现状与Docker方案对比

Docker核心组件

1、服务端负责构建、分发、运行容器
2、Client和Server可以运行在同一个Host上
  客户端也可以通过Socket或Rest API与远程的服务端通信
3、如果docker damond挂掉了即父进程挂了 对子进程不影响 
  但是不能启动新的进程了即不能在创建镜像和运行镜像等了
4、网络是共享的 文件句柄是单独的 可以让它共享也可以不让它共享

Docker命令

commit含义:新运行的docker进程上面重新生成一个新的镜像

Docker 镜像

1、dokcer镜像是一个静态只读模版
通过它创建docker容器 是一个进程、动态的
2、dokcerfile是从无到有 创建镜像
3、docker启动命令:ENTRYPOINT/CMD
4、设置环境变量:ENV key value
5、挂载路径 VOLUME ["dir1"]
6、docker容器是镜像的运行实例

Docker运行环境

Docker解决应用标准化的案例

差异化不要打包在镜像中

K8S简介

1、K8S 容器管理和编排
2、k8s治理功能 就是一个管理工具
3、k8s虚拟化是docker做的
4、机器平均利率用不超过20% 用k8s 弹性调度 提高资源利用率

Docker运行数量

40核CPU 192G内存的服务器配置 
一个docker 分配2个cpu 最多20个docker

云发展阶段

Iaas云

sdn(软件定义网络)

网络一旦进入机房交换机即二层网络
很难跨机房通讯 直接通讯很难
sdn网络层面虚拟化
在机房之间直接通讯
即二层网络变三层网络进行通讯

sds(软件定义存储)

共享存储 不用关注机器和存储
对应用无侵入 是面向资源的

用户不想关注硬件资源而是想只关注应用本身

需要面向应用系统降低服务开发部署和运维成本

1、安装包标准化即image镜像
2、应用进程标准化即container容器

容器化

一个dokcer应用运行即单进程
多个docker应用即多进程如何管理 使用k8s

FAAS

容器都不需要关注 只需要关注函数
无服务化架构 serverless

K8S架构(系统架构)

1、cAdvise:监控
2、kubelet:本地的agent
3、启动pod 通过cAdvise获取pod信量信息 进行通讯
4、每一个宿主机上有一个kubelet 负责pod启动终止扩容收集信量信息

谁来控制kubelet呢?

1、是k8s master 即上图的k8s架构本身(中心控制节点)
2、api server和kubelet通讯 告诉kubelet 去启动一个pod
3、kubelet心跳连接api server 也会告诉api server pod启动结果
4、api server一般部署3个 这三个都是无状态的 kebelet连接任何一个都是可以的
5、心跳信息存储在etcd中(k8s的所有存储都是放在etcd中)

k8s启动pod的流程

k8s如何保证pod副本维持在一定数量

通过console manager

核心组件概括

1、console manager保证pod达到一定数量即到底启动多少个副本
2、由schedule决定具体在哪个节点上启动
3、由api server告诉kebelet具体去在哪个节点上执行

组件数量

1、api server是无状态的 一般3个副本
2、shedule是主从结构 一般是1主2从 如果主挂掉了通过raft算法选择主
3、console manager是主从结构 一般3个副本 

应用程序申请入口

  • kubectl
通过命令行的方式提交 一般不用这种方式
这种方式需要经过rbac授权
  • api server rest 接口

网关访问应用程序实现方式

  • 默认通过dns实现
  • 也可以通过服务管理平台实现

服务管理平台

服务管理平台 包括数据采集、注册、监控、汇报信息
每个服务启动之后都会向服务注册中心注册

K8S(逻辑架构)

声明式:设置为3 绝对值 不存在幂等性问题
命令式:副本+1 相对值 存在幂等性问题

支持的控制器

支持的类型

1)无状态服务
1、long-running
比如网关、业务逻辑层、数据访问层
2、批处理型
比如job调度
3、log-pilot组件
阿里开源的日志收集组件
2)有状态服务
k8s对有状态服务的需求没有那么强烈 支持的也不太好

创建pod时序图

设计目标

有状态会存在共享存储中ceph(必须同机房)

不做共享存储 跨地区同服务商、跨可用区同地区都可以

无状态服务要求降低 跨地区同服务商、跨可用区同地区都可以

有状态跨地区如何设计?

1、任何cluster成员更改
都会在集群中每一个成员上同步

2、每一个子的cluster都是全量数据

通过DNS路由解析

数据都是共通的 按距离访问即可

4层负载 比如LVS
7层负载 比如Nginx

核心概念

pod 模版

k8s就一个大厨 pod模版是厨具
label:单进程一样就好了

控制器是最重要的

Deployment是长期服伺型

该类型代表 程序是一直运行在后台的 不会被杀死的

线上用的最多

Nginx Deployment

要求:Metadata 一定要全局唯一

K8S网络

1、Node独立IP段 1-254之间
2、node中pod的独立ip为10.1.1.0/24 24表示前面的24个字节(bytes)是子网掩码
3、pod中有dokcer容器,容器共享独立ip

四种模式

  • 单机
单机所有应用程序只能访问127.0.0.1即无网模式
  • host

Host模式 pod共享宿主机网络 导致的问题

要求pod1必须开公网权限
只能把node1这台机器的公网全部都打开
没有办法对每一个pod或对pod中的容器做操作
安全风险很高

host模式和宿主机直接共享网卡
eth0 安全性非常不好
  • bridge
1、bridge docker原生模式其实就是一个net

2、宿主机本身有一个网卡 eth0
Docker demon 开一个网桥 docker0网桥
一方面连接物理网卡
另一方面连接pod
pod里面有虚拟网卡
这个虚拟网卡会和docker0连接起来
有很多pod 都会共享docker这个网桥

3、有了docker网桥 每个pod都会有自己独立的ip
不需要共享宿主机的ip

4、bridge模式 网桥 dokcer0
(名字可以随便指定 docker1…)

5、Docker container中的eth0和veth通讯

6、网桥就是一个配置命令 不需要安装任何软件
无非就是套一个dokcer网桥就可以了

这是一个二层网络 没有办法做三层通信

所谓三层通信就是没有办法做网络虚拟化的

sdn是VXLAN技术
是一个三层网络
在多个机房之间就可以直接通信了

虚拟化模式

Web APP Frontend1如何访问Backend Service2的?

1、flannel是软件虚拟网络
就需要安装一个程序flannelid
虚拟化软件用来虚拟化网络的
在每台node上都需要安装

2、flannel将ip封装
之前都是二层网络
Flannel这块是三层网络

3、首先无缝经过网桥转换

包一层ip和port(源ip和目的ip)

传给物理链路的网卡
又包一层ip和port

传给另外一个物理链路网卡解掉一层
传给flannel 又解掉一层然后docker网卡

经过2层包装 传输效率很低

容器间怎么通信

容器间通讯

Ip1 不需要知道pod ip2的ip 在路由器(交换机)上都有配置

同一个node的pod间通信

不同node中pod之间通信

pod1首先和网桥docker0通信
然后和本地网卡通信
另外一个机器的网卡通信
这是bridge模式

CNI

1、cni是网络规范 具体是通过bridge模式走
还是overlay模式做还是dhcp

2、执行add方法目的无非就是拿到一个ip
删除执行del把ip还回原来的地方


3、K8S-CNI默认提供了dhcp cni网络插件
集成dhcp服务器

比如分配了100个ip到dhcp中

每个pod重启的时候通过cni从dhcp中取一个ip
一旦不用则会还回去

后记

后续会继续介绍容器云的实践

标签:容器,ip,揭秘,网卡,pod,k8s,docker,底层
来源: https://blog.csdn.net/qq_16485855/article/details/114155786

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有