k8 and openshift 机制概述
OCP(Openshift Container Platform)基于RHEL和docker技术上构建的一些列模块化的组件和服务。OCP增加了PaaS的能力,远端管理, 多用户模式,加固的安全,监控和诊断,应用的生命周期管理,以及提供了开发人员的自服务的接口。
openshift如果,从下到上,从左到右,让我们来看一下基本的容器构造是如何集成和提升的:
1. base os是RHEL
2. Docker提供了基础的容器管理API以及container image文件格式
3. k8管理一个用来运行容器的物理的或者虚拟的集群。它用资源去描述由多资源组成的组成的多容器应用,以及它们是如何内部连接的。如果说Docker是OCP的core, 那么k8就是OCP的核心,用来协调这些core.
4. Etcd是一个分布式 key-value的存储。k8用其去存储和展示容器以及其他资源类型的配置以及信息。
Openshift作为一个产品级的PaaS平台给Docker和K8 容器设施增加了以下能力
1. OCP-K8 extensions是被K8管理的存储在Etc的一种额外资源类型。这些额外的资源组构成OCP内部的状态和配置。
2.容器的服务实现了许多PaaS架构的功能,例如网络,认证的等。OCP为绝大多数的内部功能调整了docker和kubernetes的基本容器架构。也就是说,绝大多是OCP的内部服务都是被K8管理的containers.
3. Runetimes 以及 xPaaS是供开发人员使用的基本的container images,
4. Devops 的工具以及user experience是指OCP提供的Web和CLI管理工具,用来管理用户的应用程序和OCP服务。这些Web和CLI工具都是基于REST APIs。另,REST APIs供外部工具例如IDEs和CI platform调用。
一个K8的集群是一组用来跑containers且被一组master server集中管理的的node servers。
一个server可以即作为server又作为node, 但是出于稳定性的考虑,通常server只做server.
k8的术语:
master: 在一个K8集群中管理workload和communications的server
node: 在一个K8集群中应用的宿主机
Lable: 给配置K8资源的一组key/value。一个selector用label去过滤满足条件的资源并执行相应操作。
一个OpenShift集群其实就是一个k8集群,只是运用的是Openshift提供的管理工具,例如command-line interface或者Web console.
K8资源类型
K8有5种资源类型。这些资源类型都可以通过YAML或者JSON或者Openshift的管理工具来进行创建或者编辑。
Pods
K8的基本单元,一组共享IP和PV的容器。
Services
定义了一个单一的IP/port的combination,用来提供一组pods的入口。
Replication Controllers
一个用来定义pods规模的框架。一个RC包含一个pod的定义以及基于其创建的可部署到不同nodes上的pods
Persistent Volumes (PV)
PV提供可持续的并挂载在容器去存储数据的网络存储
Persistent Volume Claims (PVC)
一个Pod的存储
尽管一个pod可以被单独创建,但他们通常被高级别的资源RC创建。
OpenShift Resource Types
Openshift增加的资源类型有:
Deployment Configurations (dc)
基于同一个container image, managing workflows例如rolling updates去创建一组pods
一个dc通常提供了一个持续发布(continuous delivery)的流程
Build Configurations (bc)
Openshift S2I(Source-to-Image)用bc从Git server中获取source code去构建container image. bc + dc就提供了一个可持续集成和发布(continuous integration & continuous delivery)的流程
Routes
Openshift router将这个DNS host name作为应用程序和小服务的入口
通常RC可以被单独创建,但是通常由高级别资源DC创建
网络
每一个没docker进程部署的container都会从内部网络中被分配一个IP。这个IP仅能被这个运行这个container的host可访问。这是因为container总是短暂存在,所以IP总是不停的被分配和释放。
而K8提供了一个软件定义的网络(SDN)使得K8集群内的container都可以互相访问。但是,pods 内的container不支持去直接连接动态IP,而是建议连接比较稳定的分配给服务的ip.
K8 集群外部如果想访问container, 在没有openshift的情况下,需要重定向router的一个端口给运行container的host. 但是,存在'scale'的问题。
Openshift通过route这种resource给容器提供了外部访问入口,且更简单和很好的规模化(scalable)