PAAS

首先IaaS就是I层,而PaaS就是在I层上方。
PaaS 到 IaaS 。PaaS为客户提供一个环境,保证开发,测试,运维人员都可以处理相同的程序,即使自己的计算机环境不同。在里面会有一个容器的概念,其运用的是docker服务。Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

GO语言

简单了解下GO语言,Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

DOCKER

docker把应用以及应用所依赖的环境打包成一个包,这个包也就是镜像可以再任何地方原生运行,保证开发测试运维的一致性。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。既能使环境相对安全,同时也能让操作更加方便不会受不同系统影响。docker上有镜像,容器和仓库。
build once ,run everywhere

docker 与虚机的不同

VM是在一个系统里运行多个臃肿的操作系统,再在不同系统运行不同的应用,是先将资源分配各不同的系统;而docker是采用容器,在不同容器创建不同的系统镜像文件,集成到docker中,运行多个相互隔离的应用,是动态分配资源。我从虚拟化层面,架构以及应用场景
从虚拟化层面来看,传统虚拟化技术是对硬件资源的虚拟,容器技术则是对进程的虚拟,从而可提供更轻量级的虚拟化,实现进程和资源的隔离。
从架构来看,Docker 比虚拟化少了两层,取消了 hypervisor 层和 GuestOS 层,使用 Docker Engine 进行调度和隔离,所有应用共用主机操作系统,因此在体量上,Docker 较虚拟机更轻量级,在性能上优于虚拟化,接近裸机性能。
从应用场景来看,Docker 和虚拟化则有各自擅长的领域,在软件开发、测试场景和生产运维场景中各有优劣,具体看需求,Docker更快,更轻量,虚机更安全,在系统上也更泛用。
虚机能为应用提供一个更加隔离的环境,不会因为应用程序的漏洞给宿主机造成任何威胁。同时还支持跨操作系统的虚拟化
docker容器本质上是宿主机的进程,Docker通过namespace实现了资源隔离。namespace 是linux的一种隔离技术。

image.png
PAAS进行对容器的编排

dcoker组成

docker分有daemon engine和docker machine。Docker Machine 是一个用于配置和管理你的宿主机(上面具有 Docker Engine 的主机)的工具。docker daemon 是一个客户端 - 服务器应用程序,由 Docker 守护进程、一个REST API指定与守护进程交互的接口、和一个命令行接口(CLI)与守护进程通信(通过封装REST API)。Docker Engine 从 CLI 中接受docker 命令。
image.png
image.png

接口:

REST 用来规范应用如何在 HTTP 层与 API 提供方进行数据交互 。REST 描述了 HTTP 层里客户端和服务器端的数据交互规则;客户端通过向服务器端发送 HTTP(s)请求,接收服务器的响应,完成一次 HTTP 交互。这个交互过程中,REST 架构约定两个重要方面就是 HTTP 请求所采用的方法,以及请求的链接。

CLI:是计算机操作系统或应用程序为用户提供的可视提示接口,使用CLI,可以在特定的行中输入命令,从操作系统接收回应等。

K8S

K8S 全程是kubernetes 基于容器的集群管理平台。用于对docker的编排,管理和调度。华为的OPENSTAGE就是基于K8S的v1.14进行开发。然后K8S最小单位是POD。一个pod中会有一个pause容器,这个容器与其他的业务容器都没有关系,以这个pause容器的状态来代表这个pod的状态。pod能方便根据业务定义一组容器。
先有应用进程产生后有service
kubectl 客户端命令行工具:
      将接收的命令,发送给kube-apiserver,作为对整个平台操作的入口。
    kube-apiserver REST API服务:
      作为整个系统的控制入口,以REST API的形式公开,可以横向扩展在高可用的架构中。
    kube-controller-manager 多个控制器的合体,用来执行整个系统中的后台任务,多个控制进程的合体:
Node Controller 负责整个系统中node up 或down的状态的响应和通知
Replication Controller 负责维持Pods中的正常运行的Pod的个数
Endpoints Controller 负责维持Pods和Service的关联关系
Service Account & Token Controllers负责为新的命名空间创建默认的账号和API访问的Token    
    kube-scheduler 任务调度、命令下发
      负责监视新创建的Pods任务,下发至未分配的节点运行该任务
    kube-proxy 网络代理转发:
    kube-proxy运行在每个节点上,负责整个网络规则的连接与转发,使k8s中的service更加抽象化
    kubelet 容器的管理
      kubelet运行在每个节点上,作为整个系统的agent,监视着分配到该节点的Pods任务,负责挂载Pods所依赖的卷组,下载Pods的秘钥,运行Pods中的容器(通常是docker),周期获取所有容器的状态,通过导出Pod和节点的状态反馈给REST系统;
    **etcd **信息存储
    flannel 不会详细到每个Ip,而是分配网段。Ip由docker分配。其作用就是让集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

image.png
(1)replication controller组件是用来管理POD,简称RC。RC由一个或多个POD组成,可以对POD进行增删改。
(2)label用来区分 RC,service.pod 的key/value键值对,可以对应多个value,但一个value只能对应一个label的键。K8S中都是通过label进行关联然后找到相关组件进行操作。
(3)service是k8s的最小操作单元,对外表现单一接口,能通过这个service寻找到容器中的浮动资源。

TOSCA

TOSCA(Topology and Orchestration Specification for Cloud Application)是开放标准联盟OASIS管理的独立技术委员会之一。类似于O+中的C6协议,在这里面是YAMI文件,根据这个分层部署相应应用,规范云应用生命周期产品流程。

容器内三类Ip

三类IP node ip,pod ip,cluster ip

Pod ip 由flannel发放分配网段,让不同节点上的容器能够通过内网ip通信。每个Pod启动会有专门一个容器作为网络通信代理。其ip就是Pod ip.

Cluster ip Service Cluster IP就不一样了,没有网络设备为这个地址负责。它是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。我认为它代表着一个服务网络,但是它不对外。并且不同pod能通过cluster ip进行通信。
servicec创建->proxy发现这个service->本地节点任意打开一个端口->建立相应的iptables规则->重定向服务的端口和ip到这个新建的端口

Public ip 是代理节点的物理IP地址。和先前的Cluster IP range上分配到的虚拟的IP一样,kube-proxy同样会为这些publicIP提供Iptables 重定向规则,把流量转发到后端的Pod上。

tips

flannel分配容器ip 管内部网络,而Proxy会管外部网络和cluster ip。

kubeadm 部署master节点 node节点

master节点上查出哈希值然后转化

portal创建node资源

pv持久化存储 Pvc 申明

Q.E.D.