zl程序教程

您现在的位置是:首页 >  系统

当前栏目

openshift介绍及centos7安装单节点openshift、Redhat安装openshift集群完全教程

centos7安装节点教程集群 介绍 完全 Redhat
2023-09-14 09:15:19 时间

Centos7中openshift_3.11单节点安装及配置开机自启详解

本次openshift安装使用最简单便捷的单节点安装,适用于本地开发及测试

openshift简介

OpenShift是红帽公司2015年开始推出的一个开源容器应用平台,是一款Paas(平台即服务)平台的产品,底层以docker为容器引擎,kubernetes来做编排,部署快捷,功能丰富。

本文包含了openshift的安装及openshift如何开机自启和openshift常用命令等内容!下面就直接开始一系列的安装操作!

安装注意事项

需保证服务器没有安装k8s集群

openshift内置了k8s的安装过程,在oc cluster up启动的过程中会安装k8s

一、环境准备

基础环境:
系统:Centos7.6.1810
内存:8G(勉强够用)

[root@cpe-172-250-210-30 opt]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
12

关闭防火墙和selinux

$ sed -i  "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
$ systemctl stop firewalld
$ systemctl disable firewalld
123

安装docker

$ yum install -y yum-utils 
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum -y install docker-ce
123

docker的安装过程就不详细说了,如果有需要,看之前写的笔记吧,这个就不单独写博客了
文档:docker-yum安装详解
配置docker私有仓库地址
因为openshift安装成功后,会自行启动一个registry的私有仓库镜像以便使用,为了之后不用重新配置后还要重启docker,所以在此先行配置
集群自动启动的registry仓库地址就是172.30.x.x,所以如下配置

$ cat /etc/docker/daemon.json
{
  "insecure-registries": ["172.30.0.0/16"]
}
$ systemctl daemon-reload
$ systemctl start docker
$ systemctl enable docker
1234567

二、开始安装

下载openshift
命令下载即可,如果要下载其他版本,可以去openshift的GitHub项目中下载:https://github.com/openshift/origin/releases
img

$ cd /opt/
$ wget https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz
12

解压及修改目录名称

$ tar -zxvf openshift-origin-server-v3.11.0-0cbc58b-linux-64bit.tar.gz
$ mv openshift-origin-server-v3.11.0-0cbc58b-linux-64bit /opt/openshift-server-v3.11.0
12

修改/etc/profile,加入环境变量

PATH=$PATH:/opt/openshift-server-v3.11.0/
$ source /etc/profile
12

三、启动集群

这里有一点需要注意:启动集群会在当前目录下创建集群配置文件等信息,所以要确保执行启动命令时,所在目录是你想要的目录(相当于安装目录了)

$ cd /opt/
$ oc cluster up --skip-registry-check=true --public-hostname="172.250.210.30" --no-proxy="172.250.210.30"

参数介绍:

  • –skip-registry-check 代表是否跳过Docker守护进程注册表什么的检查
  • –public-hostname 代表暴露在外部供访问的地址
  • –no-proxy 代表哪些地址不需要转发(如果不加这个,有可能部署成功后访问地址会转发到 localhost 127.0.0.1)
    启动成功的最后会有这个输出
    img
Login to server ...
Creating initial project "myproject" ...
Server Information ...
OpenShift server started.
The server is accessible via web console at:
    https://192.168.116.101:8443
You are logged in as:
    User:     developer
    Password: <any value>
To login as administrator:
    oc login -u system:admin
[root@master1 ~]# oc status
In project My Project (myproject) on server https://192.168.116.101:8443
You have no services, deployment configs, or build configs.
Run 'oc new-app' to create an application.

在这里插入图片描述

访问测试
http://主机IP:8443
img

openshift默认用户:

  • system:admin 使用密钥,无密码
  • developer/developer
  • admin/admin
    到这里一个简单的openshift集群已经完成了!

四、扩展内容

(一)集群docker-registry测试

命令行登录集群:

$ oc login -u system:admin		  系统管理员用户,可以查询到所有信息
$ oc login -u admin -p admin	  普通用户登录方式
12

查看环境services等信息

[root@cpe-172-250-210-30 ~]# oc get all
NAME                                READY     STATUS      RESTARTS   AGE
pod/docker-registry-1-q74b8         1/1       Running     1          1d
pod/persistent-volume-setup-mzc8n   0/1       Completed   0          1d
pod/router-1-hnrpc                  1/1       Running     1          1d
NAME                                      DESIRED   CURRENT   READY     AGE
replicationcontroller/docker-registry-1   1         1         1         1d
replicationcontroller/router-1            1         1         1         1d
NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                   AGE
service/docker-registry   ClusterIP   172.30.1.1       <none>        5000/TCP                  1d
service/kubernetes        ClusterIP   172.30.0.1       <none>        443/TCP                   1d
service/router            ClusterIP   172.30.119.137   <none>        80/TCP,443/TCP,1936/TCP   1d
NAME                                DESIRED   SUCCESSFUL   AGE
job.batch/persistent-volume-setup   1         1            1d
NAME                                                 REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfig.apps.openshift.io/docker-registry   1          1         1         config
deploymentconfig.apps.openshift.io/router            1          1         1         config
123456789101112131415161718192021

从输出的信息中可以查看到配置的有私有仓库replicationcontroller/docker-registry-1
查看镜像

-n 代表命名空间
看起来这些镜像应该也都是现从openshift的仓库中拉下来的,本地的这个相当于转发仓库

$ oc get all -n openshift
1

img
获取镜像测试

[root@cpe-172-250-210-30 ~]# docker pull 172.30.1.1:5000/openshift/nginx
Using default tag: latest
Error response from daemon: unauthorized: authentication required
123

这样直接去获取镜像,输出Error response from daemon: unauthorized: authentication required,由此可见,获取镜像还需要用户验证,故:
获取用户token(任一用户均可)

[root@cpe-172-250-210-30 ~]# oc login -u system -p admin
Login successful.
You don't have any projects. You can try to create a new project, by running
    oc new-project <projectname>
[root@cpe-172-250-210-30 ~]# oc whoami -t
8zDcvQGrS-zy0A9Q-ugXGZ6kIr8zkuKNsLWf5l73iQk

登录docker-registry仓库

[root@cpe-172-250-210-30 ~]# docker login 172.30.1.1:5000
Username: system
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

重新获取测试

[root@cpe-172-250-210-30 ~]# docker pull 172.30.1.1:5000/openshift/nginx
Using default tag: latest
latest: Pulling from openshift/nginx
ab5ef0e58194: Extracting [>                                                  ]  557.1kB/75.78MB
b04f3cd8f5dc: Download complete
………………

获取成功

(二)配置openshift开机自启

如果需要开机自启,则可以在/etc/rc.d/rc.local中添加上面集群启动时的命令,就可以实现了
(注意不同环境下需要修改oc命令所在路径和服务器IP)

/opt/openshift-server-v3.11.0/oc cluster up --skip-registry-check=true --public-hostname="172.250.210.30" --no-proxy="172.250.210.30"

img

(三)集群常用命令

用户相关命令

oc login -u 用户-p 密码		登陆集群
oc logout					登出集群
oc login -u system:admin	系统管理员登录
oc create user admin		创建用户
oc adm policy add-cluster-role-to-user cluster-admin admin		赋予普通用户系统管理员权限
oc whoami 					查看当前用户(-t 查看token)
oc get users				查看集群用户

集群状态相关命令

oc cluster up		启动集群
oc cluster down		停止集群
oc status			查看集群状态
oc get all			获取环境所有信息
oc get pod			列出集群pod
oc get images		列出集群docker镜像
oc logs -f podname 	查看pod日志
oc get project 		查询项目列表
oc project <project_name> 	切换到项目
oc rsh <project_name> 		到容器中执行命令(相当于docker exec -ti)

openshift简介

1、Docker

优势:构建一个隔离的、稳定的、安全的、高性能的容器运行环境

2、Kubernetes

容器编排
1)容器调度:按业务的需求快速部署容器到指定的目标
2)弹性伸缩:按业务的需求快速扩展或收缩容器的运行实例数量
3)异常自愈:当容器实例运行异常,集群能自动感知、处理并恢复服务状态
4)持久化卷:为散布在集群不同机器上的容器提供持久化的智能对接
5)服务发现:为业务为服务化提供服务发现及负载均衡等功能
6)配置管理:为业务应用提供灵活的配置管理及分发规则

3、Openshift

容器云,在Docker和Kubernetes的基础上提供了各种功能,以满足业务应用、研发用户及运维用户在生产效率上的诉求

1)应用开发框架及中间件

​ OpenShift提供了丰富的开箱即用的编程开发框架及中间件,如Java、PHP、Ruby、Python、JBossEAP、Tomcat、MySQL、MongoDB及JBoss系列中间件等

2)应用及服务目录

​ OpenShift提供了如软件市场式的服务及应用目录,可以实现用户一键部署各类应用及服务,比如一键部署Hadoop集群和Spark集群

3)自动化流程及工具

​ OpenShift内置了自动化流程工具S2I(SourcetoImage),帮助用户自动化完成代码的编译、构建及镜像发布

4)软件自定义网络

​ 通过OpenVSwitch,OpenShift为用户提供了灵活强健的软件定义网络。实现跨主机共享网络及多租户隔离网络模式

5)性能监控及日志管理

​ OpenShift提供了开箱可用的性能监控及日志管理的组件。通过平台,业务能快速获取运行状态指标,对业务日志进行收集及分析

6)多用户接口

​ OpenShift提供了友好的Web用户界面、命令行工具及RESTfulAPI

7)自动化集群部署及管理

​ OpenShift通过Ansible实现了集群的自动化部署,为集群的自动化扩容提供了接口

什么是openshift

Openshift是一个开源的容器云平台,底层基于当前容器的事实标准编排系统Kubernetes和docker引擎,企业可以基于此平台搭建内部Paas平台,贯穿CI/CD流程,提高企业IT效率,拥抱DevOps和敏捷开发。

什么是Paas

PaaS(Platform as a Service,平台即服务)最早是在云计算领域被提出。如下图所示,将企业IT服务分为九层,传统自建数据中心九层设施都需要企业自己维护,成本极高。而云计算架构就相当于把九层架构中的底层一部分外包给云计算服务提供商,根据外包的层次不同,分为IaaS(Infrastructure as a Service,基础设施即服务),PaaS,SaaS(Software as a Service)三层。

  • IaaS 层为基础设施运维人员服务、提供计算、存储、网络以及其他硬件资源,云平台使用者可以在上面部署和运行包括操作系统和应用程序在内的任意软件,无需再为基础设施的管理而分心。
  • PaaS 层为应用开发人员服务,提供支撑应用运行所需的软件运行时环境,相关的工具与服务,如数据库服务、日志服务、监控服务等,让应用开发者可以专注于交付业务价值的代码而无需关心应用所需的基础环境与工具。
  • SaaS 层为一般用户(最终用户)服务,提供了一套完整可用的软件系统,让一般用户无需关心技术细节,只需通过浏览器、应用客户端的方式就能使用部署在云上的应用服务。SaaS 产品比如客户关系管理系统、邮件、虚拟桌面、通信、游戏等。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VnqlvwN8-1611045161385)(https://raw.githubusercontent.com/zdzh/photo/master/img1/20190812151837.png)]

什么是Kubernetes

Kubernetes是一个开源容器编排引擎,用于自动化容器化应用程序的部署,扩展和管理。 Kubernetes的基本概念包括:

  • 一个或多个工作节点(worker node)负责工作负载
  • 一个或多个管理节点(master node)负责管理工作负载
  • 将容器封装在名为Pod的部署单元,使用Pod为容器提供额外的元数据并且提供在单个部署实体中对多个容器进行分组的功能
  • 创建特殊的资源。例如,服务表示一组Pod和访问策略,该访问策略允许容器没有特定的ip地址也能连接服务。复制控制器(Replication controllers)是另一种用于控制同一时间的Pod副本数量的特殊资源,可以使用此功能自动扩展应用程序以适应其当前需求。

什么是OKD

OKD是Kubernetes的发行版,针对持续应用程序开发和多租户部署进行了优化。OKD在Kubernetes之上添加了开发人员和运营工具,以便为小型和大型团队实现快速的应用程序开发,轻松部署和扩展以及长期生命周期维护。
OKD是嵌入了Red Hat OpenShift中的上游Kubernetes发行版,并通过安全性和其他集成概念进行扩展。 OKD在github和文档中也称为Origin。

openshift层次结构

OpenShift v3是一个分层系统,旨在尽可能准确地公开底层Docker格式的容器镜像和Kubernetes概念,重点是帮助开发人员轻松组合应用程序。例如,安装Ruby,推送代码和添加MySQL。
其中,docker提供了打包和创建基于linux的轻量容器镜像的抽象;Kubernetes提供了集群管理以及在多台主机上编排容器的功能。OKD提供了以下功能 :

  • 帮助开发人员管理、构建和部署源代码
  • 管理和推广大规模的流进系统的镜像
  • 大规模的应用管理
  • 组织大型开发人员组织的团队和用户跟踪
  • 支持群集的网络基础结构
    Openshift 实际上由三部分组成,核心部分实现容器的调度是封装的 Kubernetes, 除此之外还有一个内置的镜像仓库(Image Registry),这个仓库是可选的,Openshift 也可以配置使用 Dockerhub 或者企业自己的镜像仓库,最外层部分是一个友好的 Web 界面,用于展示和操作 Openshift 的资源。
    如下图所示,Openshift 要成为一个完整的数字化平台需要依赖于两个外部系统,一个代码库,一个是持续集成服务,事实上这两个外部服务也是可以跑在 Openshift 里面的。右边的灰色矩形就是 Openshift 的主要架构了,它的上层是一个路由(Router),用于 DNS 解析和转发,确保用户能够调用到 Openshift 集群中的服务。中间部分是跑在 RHEL 操作系统上的 Kubernetes 集群,侧面是外部存储服务,因为集群里的计算单元是漂浮的,所以通常 Kubernetes 集群只提供计算能力,数据持久外需要依赖外部的比如说 S3,EBS 等云服务商提供的存储服务。最下层同样也是由云服务商提供的基础设施服务。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J0V4l5cs-1611045161391)(https://raw.githubusercontent.com/zdzh/photo/master/img1/20190812112313.png)]

Pods

okd引用了kubernetes的pods概念。pods是指在同一台主机上运行的一个或多个容器,它是定义、开发和部署的最小单位。 每个pod都分配有自己的内部IP地址,因此拥有其整个端口空间,pod中的容器可以共享其本地存储和网络。
pod的生命周期可以在容器退出时结束,也可以在容器退出后保留pods以方便访问容器日志。
pod在运行过程中无法被修改,当需要修改时,需要先停止pod再根据修改后的配置文件和镜像重新创建pod。pod退出时不会保留状态,因此一般通过更高级的控制器管理pods而不是用户直接管理。

Redhat OpenShift安装与部署

一 前置条件说明

1.1 安装准备概述

Red Hat OpenShift容器平台是由Red Hat作为RPM包和容器映像两种类型存在。RPM包使用订阅管理器从标准Red Hat存储库(即Yum存储库)下载,容器映像来自Red Hat私有仓库。
OpenShift容器平台安装需要多个服务器,支持服务器或虚拟机的多种形式。同时为了简化OpenShift集群的部署,Red Hat提供了一个基于Ansible的安装程序,它可以通过交互运行,也可以使用包含环境配置细节的应答文件以自动的非交互方式运行。
在运行安装程序之前,需要执行一些预安装任务,以及安装后的安装任务,以获得功能齐全的OpenShift容器平台集群。RedHat为安装OpenShift容器平台提供了两种不同的方法。

  • 第一种方法使用快速安装程序,可用于简单的集群设置。
  • 第二种方法是较为精细的安装方式,并使用Ansible playbook来自动化该过程。
    本实验使用Ansible来自动配置OpenShift集群。同时,Ansible可以为OpenShift安装准备主机,例如包安装、禁用服务和客户化配置。
    提示:更多Ansible内容参考https://www.cnblogs.com/itzgr/category/1333622.html

1.2 节点准备

需要相应的master和node节点互通,并且配置master至所有节点的免秘钥登录。同时能解析所有FQDN,及注册相应repo库。
提示:以上准备工作也可通过Ansible直接跑相应的yml完成。

二 实验一:前置条件操作

2.1 环境准备

[student@workstation ~]$ lab install-prepare setup		#运行准备脚本

提示:本环境基于RedHat RH280环境,所有lab命令为环境自动化准备命令,后续不再赘述。

2.2 安装Ansible

[student@workstation ~]$ rpm -qa | grep ansible
[student@workstation ~]$ sudo yum -y install ansible

2.3 验证Ansible

[student@workstation ~]$ cd /home/student/DO280/labs/install-prepare/
[student@workstation ~]$ ansible --version
[student@workstation install-prepare]$ cat ansible.cfg

clipboard

[student@workstation install-prepare]$ cat inventory

clipboard
Inventory文件解释:
Inventory定义了六个主机组:

  • workstations:为developer节点,即运行playbook的节点;
  • nfs:为集群存储提供nfs服务的环境中的vm;
  • masters:OpenShift集群中用作master角色的节点;
  • etcd:用于OpenShift集群的etcd服务的节点,本环境中使用master节点;
  • node:OpenShift集群中的node节点;
  • OSEv3:组成OpenShift集群的所有接待,包括master、etcd、node或nfs组中的节点。
    注意:默认情况下,docker使用在线仓库下载容器映像。本环境内部无网络,因此将docker仓库配置为内部私有仓库。在yml中使用变量引入仓库配置。
    此外,安装会在每个主机上配置docker守护进程,以使用overlay2 image驱动程序存储容器映像。Docker支持许多不同的image驱动。如AUFS、Btrfs、Device mapper、OverlayFS。

2.4 检查节点连通性

[student@workstation install-prepare]$ cat ping.yml 
  1 ---
  2 - name: Verify Connectivity
  3   hosts: all
  4   gather_facts: no
  5   tasks:
  6     - name: "Test connectivity to machines."
  7       shell: "whoami"
  8       changed_when: false
[student@workstation install-prepare]$ ansible-playbook -v ping.yml

2.5 确认yml

[student@workstation install-prepare]$ cat prepare_install.yml 

clipboard
解释:如上yml引入了三个role。
docker-storage内容如下,该role定义相关docker的后端存储驱动以及创建docker所需的image存储路径,并最终启动docker。
[student@workstation install-prepare]$ cat roles/docker-storage/tasks/main.yml

  1 ---
  2 - block:
  3   - name: Customize default /etc/sysconfig/docker-storage-setup
  4     template:
  5       src: docker-storage-setup
  6       dest: /etc/sysconfig/docker-storage-setup
  7       owner: root
  8       group: root
  9       mode: 0644
 10     when: not use_overlay2_driver
 11   - name: Customize /etc/sysconfig/docker-storage-setup using overlay2 storage driver
 12     template:
 13       src: docker-storage-setup-overlay2
 14       dest: /etc/sysconfig/docker-storage-setup
 15       owner: root
 16       group: root
 17       mode: 0644
 18     when: use_overlay2_driver
 19   - name: Verify existence of /dev/docker-vg/docker-pool
 20     stat:
 21       path: /dev/docker-vg/docker-pool
 22     register: p
 23   - name: Stop docker
 24     service:
 25       name: docker
 26       state: stopped
 27     when: p.stat.exists == False
 28   - name: Remove loopback docker files
 29     file:
 30       dest: /var/lib/docker
 31       state: absent
 32     when: p.stat.exists == False
 33   - name: Run docker-storage-setup
 34     command: /usr/bin/docker-storage-setup
 35     when: p.stat.exists == False
 36   - name: Start and enable docker
 37     service:
 38       name: docker
 39       state: started
 40     when: p.stat.exists == False
 41   when: docker_storage_device is defined
 42 

[student@workstation install-prepare]$ cat roles/docker-storage/templates/docker-storage-setup

  1 DEVS={{ docker_storage_device }}
  2 VG=docker-vg
  3 SETUP_LVM_THIN_POOL=yes

docker-registry-cert内容如下,该role定义相关docker的使用私有仓库,并且导入了相关crt证书。
[student@workstation install-prepare]$ cat roles/docker-registry-cert/tasks/main.yml

  1 ---
  2 - name: Enable the Trust
  3   shell: update-ca-trust enable
  4 - name:  Retrieve the certificate
  5   fetch:
  6     src: "{{ cacert }}"
  7     dest: "{{ local_destination }}"
  8   delegate_to: "{{ registry_host }}"
  9 - name:  Copy the certificate
 10   copy:
 11     src: "{{ source }}"
 12     dest: "{{ destination }}"
 13     owner: root
 14     group: root
 15     mode: 0755
 16 - name: Update the Trust
 17   shell: update-ca-trust extract
 18 - name: Restart Docker
 19   service:
 20     name: docker
 21     state: restarted
 22 

[student@workstation install-prepare]$ cat roles/docker-registry-cert/vars/main.yml

  1 registry_host: services.lab.example.com
  2 cacert: /etc/pki/tls/certs/example.com.crt
  3 local_destination: /tmp/
  4 source: "/tmp/{{ ansible_fqdn }}/etc/pki/tls/certs/example.com.crt"
  5 destination: /etc/pki/ca-trust/source/anchors/example.com.crt

openshift-node内容如下,该role定义相关安装OpenShift所需的所有依赖包任务。
[student@workstation install-prepare]$ ll roles/openshift-node/files/
total 4
-rw-r–r--. 1 student student 389 Jul 19 2018 id_rsa.pub
[student@workstation install-prepare]$ cat roles/openshift-node/meta/main.yml

  1 ---
  2 dependencies:
  3   - { role: docker }

[student@workstation install-prepare]$ cat roles/openshift-node/tasks/main.yml

  1 ---
  2 - name: Deploy ssh key to root at all nodes
  3   authorized_key:
  4     user: root
  5     key: "{{ item }}"
  6   with_file:
  7     - id_rsa.pub
  8 - name: Install required packages
  9   yum:
 10     name: "{{ item }}"
 11     state: latest
 12   with_items:
 13     - wget
 14     - git
 15     - net-tools
 16     - bind-utils
 17     - iptables-services
 18     - bridge-utils
 19     - bash-completion
 20     - kexec-tools
 21     - sos
 22     - psacct
 23     - atomic-openshift-clients
 24     - atomic-openshift-utils
 25     - atomic-openshift
 26 

2.6 运行playbook

[student@workstation ~]$ cd /home/student/DO280/labs/install-prepare/
[student@workstation install-prepare]$ ansible-playbook prepare_install.yml
clipboard
提示:该准备工作将完成如下操作:

  • 在每个节点上安装并运行Docker;
  • 在每个节点上Docker使用一个逻辑卷存储;
  • 每个节点使用自签名证书信任私有Docker仓库;
  • 在每个节点上都会安装基本包。

2.7 确认验证

[student@workstation install-prepare]$ for vm in master node1 node2;
do echo -e “\n$vm”
ssh KaTeX parse error: Expected 'EOF', got '#' at position 54: … -n3 done #̲验证docker服务 [![c… for vm in master node1 node2;
do echo -e “\n$vm : lvs”
ssh KaTeX parse error: Undefined control sequence: \n at position 22: …o lvs echo -e "\̲n̲vm : df -h"
ssh KaTeX parse error: Expected 'EOF', got '#' at position 42: …cker done #̲查看docker使用的lvm … for vm in master node1 node2;
do echo -e “\n$vm”
ssh KaTeX parse error: Expected 'EOF', got '#' at position 38: …atest done #̲测试pull image [!… for vm in master node1 node2;
do echo -e “\n$vm”
ssh $vm rpm -qa wget git net-tools bind-utils
yum-utils iptables-services bridge-utils bash-completion
kexec-tools sos psacct atomic-openshift-utils
done #检查相关依赖包是否安装成功

三 正式安装说明

3.1 安装步骤

安装准备完成后正式安装包括四个步骤:

  • 编写一个目录文件来描述所需的集群特性和体系结构;
  • 执行prerequisites.yml的playbook;
  • 执行deploy_cluster,yml的playbook;
  • 验证安装。

3.2 安装和配置节点

OpenShift Inventory定义了以下主机组。
master:对于OpenShift,这是必须的组,定义了OpenShift集群中哪些主机充当master节点;
node:对于OpenShift,这是必须的组,它定义了OpenShift集群中哪些主机充当node节点;
etcd:[master]部分中列出的所有主机也应属于etcd;
nfs:这个组是可选的,应该只包含一个主机。如果Inventory文件中存在特定的变量,OpenShift playbook将在这台机器上安装并配置NFS;
OSEv3:这个组包含任何属于OpenShift集群的机器。安装剧本引用这个组来运行在集群全范围内的任务。
[student@workstation install-prepare]$ cat inventory
clipboard
说明:

  • 安装所需版本的OpenShift容器平台;
  • 用户使用htpasswd身份验证对集群进行身份验证;
  • DNS条目apps.lab.example.com用作OpenShift应用程序的子域;
  • NFS存储用于OpenShift etcd服务和OpenShift 内部仓库;
  • classroom container registry用作仓库。
    变量说明:
    OpenShift安装变量记录在Inventory的[OSEv3:vars]部分。安装变量用于配置多个OpenShift组件,例如:
  • 一个内部容器仓库;
  • Gluster、Ceph等以便于提供持久性存储;
  • 集群日志;
  • 自定义集群证书。

3.3 配置OpenShift版本

可通过在[OSEv3:vars]中指定如下配置确定OpenShift所安装的版本:
openshift_deployment_type=openshift-enterprise
openshift_release=v3.9
指定OpenShift部署类型,可选值为openshift-enterprise和origin。
openshift_image_tag=v3.9.14
openshift_disable_check=disk_availability,docker_storage,memory_availability
容器化的OpenShift服务使用带有“v3.9.14”标记的图像。这将阻止集群自动升级到更新的容器映像;
对于非生产集群,可以禁用对系统需求的检查。

3.4 配置验证

OpenShift容器平台身份验证基于OAuth, OAuth提供了一个基于HTTP的APl,用于对交互式和非交互式客户端进行身份验证。
OpenShift master运行一个OAuth服务器,OpenShift可以支持多种Provider,这些Provider可以与特定于组织的身份管理产品集成。支持的OpenShift身份验证的Provider:

  • HTTP Basic,外部单点登录(SSO)系统;
  • 使用GitHub和GitLab帐号;
  • OpenID连接,使用OpenID-compatible SSO和谷歌帐户;
  • OpenStack Keystone v3;
  • LDAP v3服务器。
    OpenShift安装程序使用默认的安全方法,DenyAllPasswordIdentityProvider是缺省提供程序。使用此Provider,表示只有master主机上的root用户才能使用OpenShift客户端命令和API。

3.5 配置htpasswd验证

OpenShift HTPasswdPasswordIdentityProvider根据Apache HTTPD htpasswd程序生成的文件验证用户和密码。
htpasswd程序将用户名和密码保存在纯文本文件中,每行一条记录,字段用冒号分隔。密码使用MD5散列。如果将此文件添加或删除用户,或更改用户密码,OpenShift OAuth服务器将自动重新读取该文件。
要将OpenShift master配置使用HTPasswdPasswordIdentityProvider,需要配置openshift_master_identity_providers。

  1 openshift_master_identity_providers。
  2 openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true',
  3 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider',	#配置后端驱动
  4 'filename': '/etc/origin/master/htpasswd'}]				#制定master主机上

也支持在配置文件中直接指定初始的用户名和密码。
openshift_master_htpasswd_users="{‘user1’:’ a p r 1 apr1 apr1.NHMsZYc M d m f W N 5 D M 3 q 280 / W 7 c 51 c / ′ , ′ u s e r 2 ′ : ′ MdmfWN5DM3q280/W7c51c/', 'user2':' MdmfWN5DM3q280/W7c51c/,user2:apr1 . N H M s Z Y c .NHMsZYc .NHMsZYcMdmfWN5DM3q280/W7c51c/’}"
生产hash密码可参考如下:

  1 [student@workstation ~]$ htpasswd -nb admin redhat
  2 [student@workstation ~]$ openssl passwd -apr1 redhat

3.6 网络要求

集群节点的通配符DNS条目允许任何新创建的路由自动路由到subdomain的集群。通配符DNS条目必须存在于唯一的子域中,例如apps.mycluster.com,并解析为主机名或集群节点的IP地址。inventory文件中通配符DNS条目是通过变量openshift_master_default_subdomain进行设置 。
openshift_master_default_subdomain=apps.mycluster.com

3.7 master服务端口

主服务端口openshift_master_api_port变量定义主API的监听端口。缺省端口8443,当master使用SSL时,也可以使用443端口。从而在连接的时候省略端口号。
master console端口由openshift_master_console_port变量的值设置,默认端口是8443。master console端口也可以设置为443,从而在连接的时候省略端口号。
3.8 防火墙
OpenShift节点上的默认防火墙服务是iptables。若要在所有节点上使用firewalld作为防火墙服务,需要将操作系统防火墙使用firewalld变量设置为true,即os_firewall_use_firewalld=true。

四 配置持久化存储

4.1 持久存储配置

默认情况下,容器数据是临时的,并且在容器被销毁时丢失。Kubernetes持久卷框架为容器请求和使用持久存储提供了一种机制。为了避免数据丢失,这些服务被配置为使用持久卷。
OpenShift支持多个插件,使用各种存储技术创建持久卷。可以使用NFS、iSCSI、GlusterFS、Ceph或其他商业云存储。
本环境中,OpenShift容器registry和OpenShift Ansible Broker服务被配置为使用NFS持久性存储。
提示:生产环境默认OpenShift不支持NFS持久存储集群,要允许NFS在非生产集群上持久存储,需要配置openshift_enable_unsupported_configurations=true。

4.2 container仓库

要为OpenShift容器registry配置NFS持久性存储,请将以下内容添加到Inventory文件中:

  1 openshift_hosted_registry_storage_kind=nfs
  2 openshift_hosted_registry_storage_nfs_directory=/exports
  3 openshift_hosted_registry_storage_volume_name=registry
  4 openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)'
  5 openshift_hosted_registry_storage_volume_size=40G
  6 openshift_hosted_registry_storage_access_modes=['ReadWriteMany']

4.3 OpenShift Ansible Broker

OpenShift Ansible Broker(OAB)是一个容器化的OpenShift服务,部署自己的etcd服务。持久Etcd存储所需的配置与registry所需的配置类似。

  1 openshift_hosted_etcd_storage_kind=nfs
  2 openshift_hosted_etcd_storage_nfs_directory=/exports
  3 openshift_hosted_etcd_storage_volume_name=etcd-vol2
  4 openshift_hosted_etcd_storage_nfs_options="*(rw,root_squash,sync,no_wdelay)"
  5 openshift_hosted_etcd_storage_volume_size=1G
  6 openshift_hosted_etcd_storage_access_modes=["ReadWriteOnce"]
  7 openshift_hosted_etcd_storage_labels={'storage': 'etcd'}

五 OpenShift其他配置

5.1 配置离线本地registry

本环境OpenShift使用容器仓库为registry.lab.example.com,要将集群配置为从内部仓库pull image,需要在Inventory中进行如下配置:

  1 #Modifications Needed for a Disconnected Install
  2 oreg_url=registry.lab.example.com/openshift3/ose-${component}:${version}
  3 #可访问image仓库的位置,必须以ose-${component}:${version}结尾。
  4 openshift_examples_modify_imagestreams=true
  5 #OpenShift安装了用于部署示例应用程序的模板。这个变量指示playbook修改所有示例的IS,使其指向私有仓库,而不是registry.access.redhat.com。
  6 openshift_docker_additional_registries=registry.lab.example.com
  7 #此变量用于将本地可访问仓库添加到每个节点上的docker配置中。
  8 openshift_docker_blocked_registries=registry.access.redhat.com,docker.io
  9 #此变量用于在OpenShift节点上配置docker的blocked_registries。
  1 #Image Prefix Modifications
  2 openshift_web_console_prefix=registry.lab.example.com/openshift3/oseopenshift_cockpit_deployer_prefix='registry.lab.example.com/openshift3/'
  3 openshift_service_catalog_image_prefix=registry.lab.example.com/openshift3/osetemplate_service_broker_prefix=registry.lab.example.com/openshift3/oseansible_service_broker_image_prefix=registry.lab.example.com/openshift3/oseansible_service_broker_etcd_image_prefix=registry.lab.example.com/rhel7/

#通过在容器image名称前面加上registry.lab.example.com以确保OpenShift服务的容器image可以从私有内部仓库下载。

5.2 配置NODE labels

节点label是分配给每个节点的任意key/value描述。node label通常用于区分地理数据中心或标识节点上的可用资源的有意义的描述。
应用程序可以在其deployment中根据node lables配置一个选择器。如果匹配到,应用程序的pod必须部署在其符合node labels的节点上。
使用主机变量openshift_node_tags在Inventory文件中设置节点标签。

  1 [nodes]
  2 ...output omitted...
  3 nodeX.example.com openshift_node_labels="{'zone':'west', 'gpu':'true'}"
  4 ...output omitted...

如上所示配置给nodeX.example.com配置两个labels,zone=west和gpu=true。
OpenShift集群的一个常见架构是区分master、infrastructure node和compute node。
在此架构中,infrastructure node承载OpenShift Pod的registry和路由器,而compute node承载来自用户项目的应用程序pod。
master节点不承载应用程序或infrastructure pod。
可使用 node label 来标识特定节点的角色,通常master node label 为 node-role.kubernetes.io/master=true,infrastructure node label 为 region=infra,compute node label 为 noderole.kubernetes.io/compute=true。

  1 [nodes]
  2 master.lab.example.com
  3 node1.lab.example.com openshift_node_labels="{'region':'infra'}"
  4 node2.lab.example.com

提示:如果一个节点设计为同时承载infrastructure 和 application pods,则必须显式定义两个节点标签。
[nodes]

nodeX.example.com openshift_node_labels="{‘region’:‘infra’, ‘noderole.kubernetes.io/compute’:‘true’}"

六 执行剧本

6.1 剧本说明

安装OpenShift需要执行prerequisites.yml 和deploy_cluster.yml,由 atomic-openshift-utils 软件包安装。
首先执行 prequisites.yml playbook 检查所有主机能够满足OpenShift 的部署,同时尝试修改主机以满足部署需求。然后执行 doploy_cluster.yml playbook 开始正式集群部署

6.2 验证OpenShift

部署完成后,可访问:https://master.lab.example.com 进行验证。

七 正式安装OpenShift

7.1 前置准备

[student@workstation ~]$ lab install-prepare setup
[student@workstation ~]$ sudo yum -y install ansible
[student@workstation ~]$ cd /home/student/do280-ansible/
[student@workstation do280-ansible]$ ansible-playbook playbooks/prepare_install.yml #设置相关环境
[student@workstation do280-ansible]$ lab install-run setup
[student@workstation do280-ansible]$ cd /home/student/DO280/labs/install-run/

7.2 安装atomic

[student@workstation install-run]$ sudo yum -y install atomic-openshift-utils
提示:atomic-openshift-utils提供了安装OpenShift所需的Ansible playbook和role。

7.3 创建Inventory

[student@workstation install-run]$ cp inventory.initial inventory
[student@workstation install-run]$ cat inventory
clipboard
[student@workstation install-run]$ echo -e “\n[OSEv3:vars]” >> inventory

7.4 配置相关安装版本

  1 [student@workstation install-run]$ vi general_vars.txt
  2 #General Cluster Variables
  3 openshift_deployment_type=openshift-enterprise			#配置为openshift-enterprise版本
  4 openshift_release=v3.9						#配置版本为v3.9
  5 openshift_image_tag=v3.9.14
  6 openshift_disable_check=disk_availability,docker_storage,memory_availability	#禁用check

7.5 设置htpasswd认证

  1 [student@workstation install-run]$ openssl passwd -apr1 redhat
  2 $apr1$/d1L7fdX$duViLRE.JG012VkZDq8bs0
  3 [student@workstation install-run]$ openssl passwd -apr1 redhat
  4 $apr1$rUMMfQfD$J8CEqQK.YenyNwYwKN1lA1				#创建两个用户密码都为redhat
  5 [student@workstation install-run]$ vi authentication_vars.txt
  6 #Cluster Authentication Variables
  7 openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}]
  8 openshift_master_htpasswd_users={'admin':'$apr1$/d1L7fdX$duViLRE.JG012VkZDq8bs0', 'developer':'$apr1$rUMMfQfD$J8CEqQK.YenyNwYwKN1lA1'}

7.6 配置集群网络

  1 [student@workstation install-run]$ vi networking_vars.txt
  2 #OpenShift Networking Variables
  3 os_firewall_use_firewalld=true					#开启firewall防火墙
  4 openshift_master_api_port=443					#启用端口
  5 openshift_master_console_port=443				        #启用控制端口
  6 openshift_master_default_subdomain=apps.lab.example.com		#指定subdomain

7.7 配置NFS

  1 [student@workstation install-run]$ vi persistence_vars.txt
  2 #NFS is an unsupported configuration
  3 openshift_enable_unsupported_configurations=true
  4 
  5 #OCR configuration variables
  6 openshift_hosted_registry_storage_kind=nfs
  7 openshift_hosted_registry_storage_access_modes=['ReadWriteMany']
  8 openshift_hosted_registry_storage_nfs_directory=/exports
  9 openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)'
 10 openshift_hosted_registry_storage_volume_name=registry
 11 openshift_hosted_registry_storage_volume_size=40Gi
 12 
 13 #OAB's etcd configuration variables
 14 openshift_hosted_etcd_storage_kind=nfs
 15 openshift_hosted_etcd_storage_nfs_options="*(rw,root_squash,sync,no_wdelay)"
 16 openshift_hosted_etcd_storage_nfs_directory=/exports
 17 openshift_hosted_etcd_storage_volume_name=etcd-vol2
 18 openshift_hosted_etcd_storage_access_modes=["ReadWriteOnce"]
 19 openshift_hosted_etcd_storage_volume_size=1G
 20 openshift_hosted_etcd_storage_labels={'storage': 'etcd'}

7.8 配置离线仓库

  1 #Modifications Needed for a Disconnected Install
  2 oreg_url=registry.lab.example.com/openshift3/ose-${component}:${version}	#添加内部仓库
  3 openshift_examples_modify_imagestreams=true					#修改IS
  4 openshift_docker_additional_registries=registry.lab.example.com		#内部仓库至docker配置
  5 openshift_docker_blocked_registries=registry.access.redhat.com,docker.io	#禁止外部官方仓库
  6 #Image Prefixes
  7 openshift_web_console_prefix=registry.lab.example.com/openshift3/ose-
  8 openshift_cockpit_deployer_prefix='registry.lab.example.com/openshift3/'
  9 openshift_service_catalog_image_prefix=registry.lab.example.com/openshift3/ose-
 10 template_service_broker_prefix=registry.lab.example.com/openshift3/ose-
 11 ansible_service_broker_image_prefix=registry.lab.example.com/openshift3/ose-
 12 ansible_service_broker_etcd_image_prefix=registry.lab.example.com/rhel7/

7.9 设置label

[student@workstation install-run]$ vi inventory

  1 ……
  2 [nodes]
  3 master.lab.example.com
  4 node1.lab.example.com openshift_node_labels="{'region':'infra', 'node-role.kubernetes.io/compute':'true'}"
  5 node2.lab.example.com openshift_node_labels="{'region':'infra', 'node-role.kubernetes.io/compute':'true'}"

7.10 合并并校对Inventory

[student@workstation install-run]$ cat general_vars.txt networking_vars.txt authentication_vars.txt persistence_vars.txt disconnected_vars.txt >> inventory
[student@workstation install-run]$ lab install-run grade #本环境提供检查Inventory的脚本
[student@workstation install-run]$ cat inventory
1 [student@workstation install-run]$ cat general_vars.txt networking_vars.txt authentication_vars.txt persistence_vars.txt disconnected_vars.txt >> inventory 2 [student@workstation install-run]$ lab install-run grade #本环境提供检查Inventory的脚本 3 [student@workstation install-run]$ cat inventory 4 [workstations] 5 workstation.lab.example.com 6 7 [nfs] 8 services.lab.example.com 9 10 [masters] 11 master.lab.example.com 12 13 [etcd] 14 master.lab.example.com 15 16 [nodes] 17 master.lab.example.com 18 node1.lab.example.com openshift_node_labels="{'region':'infra', 'node-role.kubernetes.io/compute':'true'}" 19 node2.lab.example.com openshift_node_labels="{'region':'infra', 'node-role.kubernetes.io/compute':'true'}" 20 21 [OSEv3:children] 22 masters 23 etcd 24 nodes 25 nfs 26 27 #Variables needed by classroom host preparation playbooks. 28 [nodes:vars] 29 registry_local=registry.lab.example.com 30 use_overlay2_driver=true 31 insecure_registry=false 32 run_docker_offline=true 33 docker_storage_device=/dev/vdb 34 35 36 [OSEv3:vars] 37 #General Cluster Variables 38 openshift_deployment_type=openshift-enterprise 39 openshift_release=v3.9 40 openshift_image_tag=v3.9.14 41 openshift_disable_check=disk_availability,docker_storage,memory_availability 42 #OpenShift Networking Variables 43 os_firewall_use_firewalld=true 44 openshift_master_api_port=443 45 openshift_master_console_port=443 46 openshift_master_default_subdomain=apps.lab.example.com 47 #Cluster Authentication Variables 48 openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider', 'filename': '/etc/origin/master/htpasswd'}] 49 openshift_master_htpasswd_users={'admin':'$apr1$/d1L7fdX$duViLRE.JG012VkZDq8bs0', 'developer':'$apr1$rUMMfQfD$J8CEqQK.YenyNwYwKN1lA1'} 50 51 #NFS is an unsupported configuration 52 openshift_enable_unsupported_configurations=true 53 54 #OCR configuration variables 55 openshift_hosted_registry_storage_kind=nfs 56 openshift_hosted_registry_storage_access_modes=['ReadWriteMany'] 57 openshift_hosted_registry_storage_nfs_directory=/exports 58 openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)' 59 openshift_hosted_registry_storage_volume_name=registry 60 openshift_hosted_registry_storage_volume_size=40Gi 61 62 #OAB's etcd configuration variables 63 openshift_hosted_etcd_storage_kind=nfs 64 openshift_hosted_etcd_storage_nfs_options="*(rw,root_squash,sync,no_wdelay)" 65 openshift_hosted_etcd_storage_nfs_directory=/exports 66 openshift_hosted_etcd_storage_volume_name=etcd-vol2 67 openshift_hosted_etcd_storage_access_modes=["ReadWriteOnce"] 68 openshift_hosted_etcd_storage_volume_size=1G 69 openshift_hosted_etcd_storage_labels={'storage': 'etcd'} 70 71 #Modifications Needed for a Disconnected Install 72 oreg_url=registry.lab.example.com/openshift3/ose-${component}:${version} 73 openshift_examples_modify_imagestreams=true 74 openshift_docker_additional_registries=registry.lab.example.com 75 openshift_docker_blocked_registries=registry.access.redhat.com,docker.io 76 77 #Image Prefixes 78 openshift_web_console_prefix=registry.lab.example.com/openshift3/ose- 79 openshift_cockpit_deployer_prefix='registry.lab.example.com/openshift3/' 80 openshift_service_catalog_image_prefix=registry.lab.example.com/openshift3/ose- 81 template_service_broker_prefix=registry.lab.example.com/openshift3/ose- 82 ansible_service_broker_image_prefix=registry.lab.example.com/openshift3/ose- 83 ansible_service_broker_etcd_image_prefix=registry.lab.example.com/rhel7/

7.11 执行安装剧本

[student@workstation install-run]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/prerequisites.yml
#执行准备工作playbook
clipboard
[student@workstation install-run]$ ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
clipboard
提示:整个部署log保存至本地目录的ansible.log中。

八 验证测试

8.1 确认验证说明

要验证OpenShift安装,必须测试和验证所有OpenShift组件。仅仅从示例容器映像启动pod是不够的,因为这并不使用OpenShift builders、deployer、router或内部registry。

  • 建议通过以下方式完整验证OpenShift:
  • 检查所有OpenShift节点状态;
  • 检查相应的OpenShift registry和router的pod;
  • 使用OpenShift从源代码构建一个应用程序,OpenShift从构建结果生成容器image,并从该映像启动pod;
  • 创建一个service,以便可以从内部容器网络和OpenShift节点访问应用程序;
  • 创建一个route,以便可以从OpenShift集群外部的计算机访问应用程序。
    安装完成后,OpenShift客户端可以使用oc,master节点可以使用oadm命令。master节点的root用户将被配置为云管理员的身份运行OpenShift客户机和管理员命令。
    一些OpenShift内部服务,如内部仓库和router,默认情况下由安装程序配置。运行oc get nodes和oc get pods命令,以验证安装成功。

8.2 登录测试

浏览器访问:https://master.lab.example.com
clipboard
clipboard

8.3 验证OpenShift功能

[student@workstation ~]$ oc login -uadmin -predhat https://master.lab.example.com
clipboard
提示:账号权限需要单独授予,安装过程中创建的adminn并没有集群的administration特权。

8.4 授予权限

system:admin是唯一一个拥有集群administration权限的账户。master节点的root用户被都为集群的system:admin用户。
[root@master ~]# oc whoami
system:admin
[root@master ~]# oc adm policy add-cluster-role-to-user cluster-admin admin #添加admin为集群管理员
提示:cluster-admin角色权限非常高,允许管理用户销毁和修改集群资源,必须谨慎使用。

8.5 查看节点状态

再次使用命令登录。
[student@workstation ~]$ oc login -uadmin -predhat https://master.lab.example.com
clipboard
[student@workstation ~]$ oc get nodes
NAME STATUS ROLES AGE VERSION
master.lab.example.com Ready master 14h v1.9.1+a0ce1bc657
node1.lab.example.com Ready compute 14h v1.9.1+a0ce1bc657
node2.lab.example.com Ready compute 14h v1.9.1+a0ce1bc657
[student@workstation ~]$ oc get pods
NAME READY STATUS RESTARTS AGE
docker-registry-1-4w5tb 1/1 Running 1 14h
docker-registry-1-j7k59 1/1 Running 1 14h
registry-console-1-mtkxc 1/1 Running 1 14h
router-4-9dfxc 1/1 Running 0 4h
router-4-kh7th 1/1 Running 0 5h

8.6 创建项目

[student@workstation ~]$ oc new-project smoke-test

8.7 创建应用

[student@workstation ~]$ oc new-app --name=hello -i php:7.0 http://registry.lab.example.com/php-helloworld
[student@workstation ~]$ oc get pods -w #监视pod创建

8.8 查看route

[student@workstation ~]$ oc get routes
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
hello hello-smoke-test.apps.lab.example.com hello 8080-tcp None

8.9 公开服务

[student@workstation ~]$ oc expose service hello #向外部网络公开服务

8.10 测试服务

[student@workstation ~]$ curl http://hello-smoke-test.apps.lab.example.com
Hello, World! php version is 7.0.10
[student@workstation ~]$ oc delete project install-post #删除项目

8.11 测试developer

[student@workstation ~]$ oc login -u developer #使用redhat密码登录
[student@workstation ~]$ oc new-project smoke-test
[student@workstation ~]$ oc new-app php:5.6~http://services.lab.example.com/php-helloworld --name hello
[student@workstation ~]$ oc logs -f bc/hello #监视构建过程
提示:输出表明OpenShift能够从仓库clone代码、并且构建image,同时将新image推入内部仓库。
[student@workstation ~]$ oc expose svc hello
route “hello” exposed
[student@workstation ~]$ oc get routes
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
hello hello-smoke-test.apps.lab.example.com hello 8080-tcp None
[student@workstation ~]$ curl hello-smoke-test.apps.lab.example.com
Hello, World! php version is 5.6.25

参考链接

Centos7中openshift_3.11单节点安装及配置开机自启详解
openshift简介
openshift层次结构
OpenShift安装与部署