OpenShift架构了解与实践

=======================

OpenShift Origin 与OPENSHIFT CONTAINER PLATFORM对比

参考链接:http://t.cn/RlPRzS5
./media/image1.png

启动OpenShift Origin

准备工作

  • 虚拟机配置如下:
CPU 内存 磁盘 系统 安装模式
1核 2GB 20GB Centos7.2 Minimal
  • 操作系统配置:
#配置固定IP
#试验环境关闭防火墙
#配置主机名
hostnamectl set-hostname master.example.com
#修改hosts
Vi /etc/hosts
#添加主机名记录
172.16.142.132 master.example.com

安装docker

#Yum安装
yum install docker -y
#配置启动服务
systemctl enable docker && systemctl start docker
#修改docker镜像站
vim /etc/sysconfig/docker
OPTIONS=’–selinux-enabled –log-driver=journald –signature-verification=false –registry-mirror=https://docker.mirrors.ustc.edu.cn’
systemctl restart docker

下载OpenShift Origin安装包

#书中使用版本为1.3.0,目前最新为3.6,可在github release中下载,URL: https://github.com/OpenShift/origin/releases
cd /opt
wget https://github.com/OpenShift/origin/releases/download/v1.3.0/OpenShift-origin-server-v1.3.0-3ab7af3d097b57f933eccef684a714f2368804e7-linux-64bit.tar.gz
#解压
tar zxvf https://github.com/OpenShift/origin/releases/download/v1.3.0/OpenShift-origin-server-v1.3.0-3ab7af3d097b57f933eccef684a714f2368804e7-linux-64bit.tar.gz
#建软连接
ln -s OpenShift-origin-server-v1.3.0-3ab7af3d097b57f933eccef684a714f2368804e7-linux-64bit /opt/OpenShift
./media/image2.png
#添加环境变量
vim /etc/profile PATH=\$PATH:/opt/OpenShift/
source /etc/profile

验证启动

#查看版本
openshift version
./media/image3.png
#启动
cd /opt/openshift
openshift start &
#注: #“OpenShift start”命令启动是为了可以在控制台看到日志输出; #正式环境官方推荐使用“oc cluster up”方式启动。
#当日志停止输出表示启动完成
#浏览器访问https://master.example.com:8443
./media/image4.png
默认账号密码dev:dev

简单使用OpenShift

运行容器应用

  • 创建项目
#登陆后的初始页,点击“New Project”
./media/image5.png
#填入相应信息
./media/image6.png
  • 部署Docker镜像
#通过“Deploy Image”部署
./media/image7.png
./media/image8.png
./media/image9.png
#启动成功
./media/image10.png
  • 访问容器应用
#确认应用IP
./media/image11.png
#终端访问测试
curl 172.30.248.254:8080
./media/image12.png

使用命令行工具

#命令行登陆
oc login -u dev https://172.16.142.132:8443
./media/image13.png
#创建project
oc new-project hello-world-oc
./media/image14.png
#部署应用
oc new-app OpenShift/hello-world
#查看状态
oc get pod

集群管理员登陆

  • 配置证书
默认集群管理员是system:admin,没有密码,只能通过证书登陆
mkdir -p ~/.kube
cp /opt/OpenShift/OpenShift.local.config/master/admin.kubeconfig ~/.kube/config
#重复覆盖
./media/image15.png
  • 命令登陆
oc login -u system:admin
./media/image16.png oc whoami
./media/image17.png
oc get node
./media/image18.png

添加Router

#Router是OpenShift集群中的一个重要组件,它是外部访问集群内容器应用的入口。 #集群外部的请求都会到达Router,由Router分发到具体的容器中。
# Router组件需要读取集群的信息,所以它需要关联一个系统账号Service Account,并为这个账号授权。
oc login –u system:admin
oc project default
./media/image19.png
#配置权限策略
oadm policy add-scc-to-user privileged system:serviceaccount:default:router
#创建Router #在实际生产时,为了达到高可用的效果,可以通过设置–replicas创建多个Router实例防止单点失效。
oadm router router –replicas=1 –service-account=router
./media/image20.png
#查看Router状态
oc get pod –n default
ss -ltn\ egrep -w ‘80\ 443’
./media/image21.png
#Router就是一个运行在容器里的Haproxy #用户可以创建route对象,称为route规则,一个route规则会与一个service相关联,并且绑定一个域名。 #route规则会被Router加载。当用户通过指定的域名访问应用时,域名会被解析并指向Router所在的计算节点上。Router获取这个请求后,会根据route规则定义转发给与这个域名对应的service后端相关联的Pod容器实例。
#Router负责将集群外的请求转发到集群的容器。
#Service负责将集群内的请求转发到指定的容器。
#一个对外,一个对内。

添加Registry

  • 这里的Registry是部署集群内部的Docker镜像仓库。从功能上来说,它与其他诸如DockerHub没有本质上的区别,只是这个内部镜像仓库会存储由Source
    to
    Image(S2I)创建的镜像。S2I的工作是辅助将应用的源代码转换成可以部署的Docker镜像。
一个典型的S2I流程包括如下:
用户输入源代码仓库的地址。
  1. 用户选择S2I构建的基础镜像(Builder镜像)。OpenShift提供了多种编程语言的Builder镜像,用户也可以定制自己的Builder镜像,并发布到服务目录中。

  2. 系统或用户触发S2I构建。OpenShift将实例化S2I构建执行器。

  3. S2I构建执行器将从用户指定的代码仓库下载源代码。

  4. S2I构建执行器实例化Builder镜像,并将代码注入Builder镜像中。

  5. Builder镜像将根据预定义的逻辑执行源代码的编译、构建并完成部署。

  6. S2I构建执行器将完成操作的Builder镜像并生成新的Docker镜像。

  7. S2I构建执行器将新的镜像推送到OpenShift内部的镜像仓库中。

  8. S2I构建执行器更新该次构建相关的Image Stream信息。

S2I还可以接受Dockerfile以及二进制文件作为构建的输入。用户甚至可以完全自定义构建逻辑。

  • 开始添加
#以管理员登陆,并切换到default Project
oc login -u system:admin
oc project default
#部署Registry
oadm registry –config=/opt/OpenShift/OpenShift.local.config/master/admin.kubeconfig –service-account=registry
./media/image22.png
#查看状态
oc get pod -n default
./media/image23.png
  • 添加非HTTPS验证
#这里部署的Registry没有启用Https,所以需要修改主机上Docker的配置,让Docker能以非Https的方式连接到Registry。
vi /etc/sysconfig/docker
OPTIONS变量追加” –insecure-registry=172.30.0.0/16”
#172.30.0.0/16是在master-config.yaml里定义的服务网络的默认值,如果需要修改,则master-config.yaml和/etc/sysconfig/docker需要一致修改。
./media/image24.png
#重启Docker
systemctl restart docker

添加Image Stream

#Image Stream是一组镜像的集合,可以在一个Image Stream中定义一些名称及标签(tag),并定义这些名字及标签指向的具体镜像。 #使用Image Stream的目的是方便地将一组相关联的镜像进行整合管理和使用。 #OpenShift默认为用户定义了一系列开箱即用的Image Stream。
#以管理员登陆,并切换到OpenShift Project #OpenShift是一个特殊的项目,在这个项目下创建的所有Image Stream及Template对集群内所有的用户和项目可见。
oc login -u system:admin
oc project openshift
#导入Image Stream
curl -k https://raw.githubusercontent.com/OpenShift/origin/v1.3.0/examples/image-streams/image-streams-centos7.json\ oc create -f - -n OpenShift
./media/image25.png
#查看Image Stream对象
oc get is -n openshift
./media/image26.png
#web console验证
#登录web console,重新建立工程,可以在界面上看到导入Image Stream之后的可用镜像列表
./media/image27.png

添加Template

#为了满足用户对复杂应用部署的需求,提供应用部署的效率,OpenShift引入了应用部署模板(Template)的概念。 #通过Template,可以定义一个或多个需要部署的镜像,定义依赖的对象,定义可供用户输入的配置参数项。
#以管理员登录,并切换到OpenShift工程。
oc login -u system:admin
oc project openshift
#以cakephp-mysql模版为例
oc create -f https://raw.githubusercontent.com/OpenShift/origin/v1.3.0/examples/quickstarts/cakephp-mysql.json -n openshift
#https://github.com/OpenShift/origin/tree/release-1.3/examples/quickstarts下有官方提供的一系列模版可用 #最新3.6版本:https://github.com/OpenShift/origin/tree/release-3.6/examples/quickstarts
./media/image28.png
#查看模版信息
oc get template -n openshift
./media/image29.png
#查看模版json信息
oc get template cakephp-mysql-example -o json -n openshift
#web console验证
./media/image30.png

模版部署应用

#新建Project
./media/image31.png
#过滤cake,选中cakephp-mysql-example模版
./media/image32.png
#指定主机名
#本地修改hosts #172.16.142.132 php.apps.example.com
./media/image33.png
#创建
./media/image34.png
#部署完成页面
./media/image35.png
#单机”Continue to overview”
#跳转到项目的概览页面。Openshif会在后台创建相应的对象,并下载相关的镜像。 #由于CakePHP应用涉及一个镜像构建的过程,即Source to Image,所以构建速度较慢。
./media/image36.png
#由于网络原因,这里从github拉代码失败了
./media/image37.png
./media/image38.png

应用的构建与部署

JAVA应用容器化

#安装git和maven
yum install git maven -y
#下载源码
cd /opt/
git clone https://github.com/nichochen/mybank-demo-maven.git
#编译及构建应用
cd mybank-demo-maven/
mvn package
./media/image39.png
#构建完毕。会在target目录下生成一个WAR包ROOT.war
./media/image40.png
#选择Tomcat7官方镜像pull到本地
docker pull tomcat:7.0.70-jre7-alpine
#编写Dockerfile,把构建好的应用部署包拷贝到发布目录
cat Docekrfile FROM tomcat:7.0.70-jre7-alpine ADD ./target/ROOT.war /usr/local/tomcat/webapps/mybank.war
./media/image41.png
#执行Docker Build构建镜像
docker build -t mybank-tomcat .
./media/image42.png
#查看生成的新镜像
docker images \ grep mybank-tomcat
./media/image43.png
#测试run镜像
docker run -it –rm -p 8080:8080 mybank-tomcat
#访问IP:8080即可看到访问页面
#推送镜像到私有仓库
#打tag
docker tag mybank-tomcat:latest registry.your-registry.com/mybank-tomcat:latest
#推送
docker push registry.your-registry.com/mybank-tomcat:latest

OpenShift的构建与部署

2.1. 快速构建部署一个应用

#web console创建一个应用
./media/image44.png
#选择“wildfly:10”的Builder镜像
./media/image45.png
#输入示例项目代码地址:https://github.com/nichochen/mybank-demo-maven
./media/image46.png
./media/image47.png
#如果构建日志报错,尝试手动先pull需要的镜像 #docker pull OpenShift/wildfly-100-centos7
#日中可以看到构建的过程
./media/image48.png
#构建到最后可以看到是将生成的镜像推送到内部的镜像仓库中(Registry)
./media/image49.png
#完成状态
./media/image50.png
#查看本地Docker镜像列表,可以看到mybank镜像
docker images \ grep mybank
./media/image51.png
#查看应用状态
oc get pod -n mybank
./media/image52.png

2.2. 镜像构建介绍

  • Build Config
#在上一个实例中,单击create后,OpenShift会创建名为“Build Config”的对象。
#查询创建的Build Config
oc get bc
./media/image53.png
#查询bc中的具体配置信息
oc get bc mybank -o yaml
./media/image54.png
#红框中标示出bc的重要内容 #定义构建输出到了一个mybank:latest的Image Stream #源代码仓库地址 #前面制定的Builder镜像信息,没有指向某个实际的镜像,而是指向了一个Image Stream(用Image Stream的概念来管理一组镜像的集合,定义多个镜像名称和Tag,再指向实际的Docker镜像),
#查看定义的刚生成名为mybank的Image Stream
oc get is mybank
./media/image55.png
#查看详细信息 #该Image Stream实际指向了OpenShift/wildfly-100-centos7\@sha256:968b2cb9f11c347fbaa6830d33386e5d31b283bdf0060b4cff865e14f5064848
oc describe is mybank
  • Build
#Build Config只是静态的配置信息,OpenShift根据这个配置信息可以触发多次实际构建实例,构建的实例称为Build。 #一个Build Config可以被多次触发,生成多个Build
#查看mybank的build构建记录
oc get build
./media/image56.png
#查看build构建详细信息,这里的信息与web console下看到的日志信息相同
oc log build/mybank-1
#可以通过之前的Build Config再执行一个新的Build构建
oc start-build mybank
oc get build
./media/image57.png
#查看新的构建状态
oc logs build/mybank-2

2.3. 镜像部署介绍

  • Deployment Config
#当前文的Build构建完成,就是S2I流程完成后,生成的应用镜像被推送到内部的镜像仓库,同时更新相关的Image Stream,之后OpenShift就会触发一次部署,部署也有配置定义对象:Deployment Config。DC描述了镜像部署的参数和要求
#查看Deployment Config列表
oc get dc
./media/image58.png
#查看dc详细定义
oc get dc mybank -o yaml
#在Deployment Config中,可以定义容器运行的细节配置 ,如容器的启动命令,容器可用的CPU和内存配置等等。
  • Deploy
#每个DC可以被多次触发,每一次触发称为一个Deploy #每一次Deploy都会生成一个Replication Controller,用以监控容器的状态,RC实际是kubernetes中的一个组件,其负责监控容器的实际数量
#查看Replication Controller
oc get rc
./media/image59.png

2.4. 服务的连通性介绍(Service & Route)

  • Service
#在部署应用时,OpenShift会自动生成DC对应的Service
oc get svc
oc describe svc mybank
./media/image60.png
  • Route
#基于Service,OpenShift同时也自动创建了对应的Route
oc get route
oc describe route mybank
./media/image61.png
#修改指定域名
oc edit route

弹性伸缩

  • Replication Controller
#正常情况下,每一个部署的应用的容器实例数量在其Deployment Config中定义,OpenShift会为每次的部署实例化一个RC(可以不定义RC)
#查看当前mybank应用活动实例数为1
oc get pod
./media/image62.png
  • 扩展容器实例
#通过RC,可以调整实例存着的数量
oc scale dc mybank –replicas=2
./media/image63.png
#可以看到pod变为2个,rc中的数量也已经被更新为2
  • 状态自服务
#删除运行中的pod,测试rc恢复pod
oc delete pod mybank-1-5ek1w
oc get pod
./media/image64.png
#可以看到其中一个pod被删除的瞬间,一个新的pod同时被创建了
#RC的作用就是监控容器状态,并始终保持正常运行的pod数量

应用更新发布

  • 触发更新构建
#Build Config信息中可以看到定义了两个WebHook触发器 #Generic WebHook #GitHub WebHook
oc get bc mybank -o yaml
./media/image65.png
#在web console中可以看到实际的调用地址
./media/image66.png
# Generic WebHook使用,只需向调用地址发送POST请求即可触发
curl -k -X POST https://172.16.142.132:8443/oapi/v1/namespaces/mybank/buildconfigs/mybank/webhooks/a62289d1f901ea32/generic
./media/image67.png
./media/image68.png
#post请求发送到OpenShift之后,一个新的build就产生并开始执行
#GitHub WebHook需要用户登陆到GitHub
  • 更新部署
#构建结束后,更新部署被触发,OpenShift有Rolling(滚动更新)和Recreate(重新创建)两种,默认是Rolling
#更新策略在Deployment Config中定义
oc get dc mybank -o yaml
./media/image69.png

持续集成与部署

部署Jenkins服务

  • OpenShift提供了集成OpenShift插件的Jenkins容器镜像和部署模版

  • 默认提供两个Jenkins部署模版:Jenkins-ephemeral(测试验证用)和jenkins-persistent(持久化支持)

#以dev用户登陆
oc login -u dev
#创建名为ci的新项目用来部署jenkins
oc new-project ci
./media/image70.png
#下载并导入Jenkins模版Jenkins-ephemeral
oc create -f https://raw.githubusercontent.com/openshift/origin/v1.3.0/examples/jenkins/jenkins-ephemeral-template.json
./media/image71.png
oc get template
./media/image72.png
#为默认的Service Account用户添加权限,使Jenkins容器有足够的权限操作项目的配置及执行部署
oc policy add-role-to-user edit -z default
#通过Jenkins模版部署Jenkins服务,指定默认管理员密码为123\@abcd
oc new-app –template=jenkins-ephemeral –param=JENKINS_PASSWORD=123\@abcd
./media/image73.png
#时间稍长,应为需要联网下载jenkins镜像 #查看服务状态
oc get pod
./media/image74.png
#Jenkins模版中定义了Route,通过指定的主机名(配好hosts,手动添加解析将jenkins-ci.router.default.svc.cluster.local指向Router服务所在的IP地址),便可以访问Jenkins服务
oc get route
./media/image75.png
#访问Jenkins服务 #https://jenkins-ci.router.default.svc.cluster.local/ #admin:123\@abcd
./media/image76.png
./media/image77.png

触发项目构建

  • Jenkins部署好了之后,就可以在jenkins上出发mybank的S2I构建
#为jenkins授权,可以在mybank项目中执行操作
oc policy add-role-to-user edit system:serviceaccount:ci:jenkins -n mybank
#创建Jenkins项目,Jenkins界面操作
./media/image78.png
./media/image79.png
./media/image80.png
./media/image81.png
  • 手动触发构建
#Jenkins控制台首页
./media/image82.png
#查看构建输出
./media/image83.png

应用数据持久化

持久化镜像仓库

  • 检查挂载点
oc login -u system:admin
oc project default
oc get pod
./media/image84.png
#通过oc volume查看Registry组件的DC关于Volume的定义,创建了一个Volume Mounts对象registry-storage,这个挂载点指向了/registry目录 #我们要做的就是给registry-storage这个挂载点挂上一个持久化后端
oc get dc
oc volumes dc/docker-registry –all
./media/image85.png
  • 备份数据
#当前Registry容器内的/registry目录下已有很多镜像相关的文件
oc get po
oc rsh docker-registry-1-akri7 ‘du’ ‘-sh’ /registry
./media/image86.png
#需要先备份这些文件,通过ocrsync命令同步到宿主机上
mkdir /root/backup cd /root/backup
oc rsync docker-registry-1-akri7:/registry .
./media/image87.png
  • 创建存储
#选用NFS作为后端存储,生产环境可使用GlusterFS,Ceph
#创建一个NFS共享目录
mkdir -p /exports/pv0001 yum -y install nfs-utils rpcbind chown nfsnobody:nfsnobody /exports/ -R echo “/exports/pv0001 *(rw,sync,all_squash)” >> /etc/exports systemctl start rpcbind exportfs -r systemctl start nfs-server showmount -e 127.0.0.1
setenforce 0
getenforce
#测试挂载
[root\@master ~]# mount 172.16.142.132:exports/pv0001 /mnt/ [root\@master ~]# [root\@master ~]# [root\@master ~]# touch /mnt/test [root\@master ~]# ls /mnt/ test [root\@master ~]# rm -rf /mnt/test [root\@master ~]# umount /mnt/
  • 创建持久化卷
#创建pv.json文件
[root\@master ~]# more pv.json { “apiVersion”: “v1”, “kind”: “PersistentVolume”, “metadata”: { “name”: “pv0001” }, “spec”: { “capacity”: { “storage”: “5Gi” }, “accessModes”: [ “ReadWriteOnce” ], “nfs”: { “path”: “/exports/pv0001”, “server”: “172.16.142.132” }, “persistentVolumeReclaimPolicy”: “Retain” } }
oc create -f pv.json
oc get pv
./media/image88.png
  • 创建持久化卷请求
#创建pvc.json文件
[root\@master ~]# more pvc.json { “apiVersion”: “v1”, “kind”: “PersistentVolumeClaim”, “metadata”: { “name”: “docker-registry-claim” }, “spec”: { “accessModes”: [ “ReadWriteOnce” ], “resources”: { “requests”: { “storage”: “3Gi” } } } }
oc create -f pvc.json
oc get pvc
oc get pv
./media/image89.png
  • 关联持久化卷请求
#将备份的文件恢复到创建的nfs目录中
mv /root/backup/registry/* /exports/pv0001/
chown nfsnobody:nfsnobody /exports/ -R
#测试删除Registry容器,RC将会重新创建它
oc get pod
oc delete pod docker-registry-1-akri7
./media/image90.png
#容器启动后,再次检查/registry目录,发现数据消失,应为之前并没有做持久化
oc rsh docker-registry-1-fqtfp ‘du’ ‘-sh’ /registry
./media/image91.png
#为Registry的容器添加持久化卷请求,docker-registry-claim,并与挂载点registry-storage关联
oc volume dc/docker-registry –add –name=registry-storage -t pvc –claim-name=docker-registry-claim –overwrite
#DC被修改后,Openshift会创建新的容器实例
#再次检查容器的/registry目录,发现目录数据恢复了
oc volume dc/docker-registry –add –name=registry-storage -t pvc –claim-name=docker-registry-claim –overwrite
oc get pod
oc rsh docker-registry-2-f36ot ‘du’ ‘-sh’ /registry
./media/image92.png

监控与日志管理

容器集群数据采集

容器集群日志管理

  • 使用开源方案EFK:Elasticsearch,Fluentd,Kibana

    • Fluentd:将以容器方式运行在集群的各个节点上。读取宿主机上的/var/log/message及/var/lib/docker目录下的系统及容器日志信息,并对信息进行格式化成JSON格式,最好发送给Elasticsearch

    • Elasticsearch:收到日志信息后,存储信息并建立索引

    • Kibana:提供图形界面用用户检索分析Elasticsearch中的日志

    • AuthProxy:为Kibana实现身份验证,与Openshift Web实现单点登陆

    • Curator:管理和优化Elasticsearch索引

  • 创建部署模版

#管理员身份登陆
oc login –u system:admin
#下载部署模版并解压
wget https://github.com/openshift/origin-aggregated-logging/archive/v1.3.0.tar.gz
tar zxvf v1.3.0.tar.gz
#导入日志部署模版
oc create -n openshift -f origin-aggregated-logging-1.3.0/deployer/deployer.yaml
  • 配置Service Account
#新建项目
oadm new-project logging –node-selector=””
oc project logging
#创建应用部署的Service Account账号
oc new-app logging-deployer-account-template
#配置服务授权
oadm policy add-cluster-role-to-user oauth-editor \ system:serviceaccount:logging:logging-deployer
oadm policy add-scc-to-user privileged \ system:serviceaccount:logging:aggregated-logging-fluentd
oadm policy add-cluster-role-to-user cluster-reader \ system:serviceaccount:logging:aggregated-logging-fluentd
  • 配置证书
#创建应用组件使用的证书,并创建Secret对象loging-deployer存储对应的证书。改Secret对象会被部署引用
oadm ca create-server-cert \ –signer-cert=/opt/openshift/openshift.local.config/master/ca.crt \ –signer-key=/opt/openshift/openshift.local.config/master/ca.key \ –signer-serial=/opt/openshift/openshift.local.config/master/ca.serial.txt \ –hostnames=’kibana.apps.example.com’ \ –cert=/etc/opt/openshift/openshift.local.config/master/kibana.crt \ –key=/etc//opt/openshift/openshift.local.config/master/kibana.key
oc create secret generic logging-deployer \ –from-file kibana.crt=/etc/opt/openshift/openshift.local.config/master/kibana.crt \ –from-file kibana.key=/etc/opt/openshift/openshift.local.config/master/kibana.key
./media/image93.png
./media/image94.png
  • 部署日志组件模版
#设置集群部署参数,创建一个Config Map对象logging-deployer为日志组件的部署设定参数 #参数指定Kinbana域名,Openshift集群Master地址,Elasticsearch的实例数及使用的内存大小
oc create configmap logging-deployer \ –from-literal kibana-hostname=kibana.apps.example.com \ –from-literal public-master-url=https://master.example.com:8443 \ –from-literal es-cluster-size=1 \ –from-literal es-instance-ram=1G
./media/image95.png
#通过模版部署日志组件
#网络原因,提前下好所需镜像
for i in openshift/origin-logging-curator:v1.3.0 \ openshift/origin-logging-fluentd:v1.3.0 \ openshift/origin-logging-auth-proxy:v1.3.0 \ openshift/origin-logging-deployment:v1.3.0 \ openshift/origin-logging-elasticsearch:v1.3.0 \ openshift/origin-logging-kibana:v1.3.0 ; do docker pull \$i; done
oc new-app logging-deployer-template \ –param IMAGE_VERSION=v1.3.0 \ –param IMAGE_PREFIX=openshift/origin- \ –param MODE=install