《开源容器云OpenShift:构建基于Kubernetes的企业应用云平台》一2.3 完善OpenShift集群...

本节书摘来自华章出版社《开源容器云OpenShift:构建基于Kubernetes的企业应用云平台》一书中的第2章,第2.3节,作者 陈耿 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.3 完善OpenShift集群

在部署更复杂的应用之前,有一项重要的任务需要完成,那就是完善OpenShift集群。在上一章中,通过二进制的安装包,我们快速完成了OpenShift集群的安装,但是这个集群还只是一个“空”的集群。面对复杂的应用,OpenShift需要更多组件的支持。而这些组件并没有在上一章的安装中完成。同时,OpenShift作为一个容器云平台,默认提供了一系列用户开箱即用、一键部署的应用和服务,这些应用和服务的信息也需要在系统中注册,以便用户在类似软件市场(App Store)的服务目录中选用。现在让我们一起完善这个OpenShift实例。

2.3.1 命令行工具

在上一章中,我们使用OpenShf?it的Web控制台部署了第一个容器应用。OpenShift的Web控制台的用户体验非常好,通过图形界面,用户可以高效快速地完成操作。除了Web控制台外,OpenShift还提供了一系列命令行工具。
oc是OpenShift中一个重要的命令行客户端。OpenShift Web控制台能完成的事情,通过oc命令也能完成。在进行自动化及重复性的操作时,命令行工具比图形界面更加高效。为了方便读者进行实验操作,本书后续的示例将以命令行进行操作。
可以尝试执行oc version命令查看OpenShift的集群版本信息,测试oc命令是否正常工作。

[root@masteropenshift]# oc version
oc v1.3.0
kubernetes v1.3.0+52492b4
features: Basic-Auth GSSAPI Kerberos SPNEGO

可以看到命令输出了OpenShift及其使用的Kubernetes的版本信息。
因为oc命令是带有权限管控的,所以在使用oc命令进行实际的操作前,需要先通过oc login命令登录。如下例所示,通过oc login命令,以dev用户的身份登录。

[root@master ~]# oc login -u dev https://192.168.172.167:8443
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): y

Authentication required for https://192.168.172.167:8443 (openshift)
Username: dev
Password: 
Login successful.

You have access to the following projects and can switch between them with 'oc project <projectname>':

    * hello-world

Using project "hello-world".
Welcome! See 'oc help' to get started.
[root@master ~]#

通过oc new-project命令创建一个新项目hello-world-oc。

[root@master ~]# oc new-project hello-world-oc
Now using project "hello-world-oc" on server "https://192.168.172.167:8443".

You can add applications to this project with the 'new-app' command. For example, try:

oc new-app centos/ruby-22-centos7~https://github.com/openshift/ruby-ex.git

to build a new example application in Ruby.

前文我们通过Web控制台部署了hello-openshift镜像。在命令行可以通过oc new-app命令方便地部署DockerHub等Docker镜像仓库的镜像。

[root@master ~]# oc new-app openshift/hello-openshift
warning: Cannot find git. Ensure that it is installed and in your path. Git is required to work with git repositories.
--> Found Docker image 17b78a4 (28 hours old) from Docker Hub for "openshift/hello-openshift"

    * An image stream will be created as "hello-openshift:latest" that will track this image
    * This image will be deployed in deployment config "hello-openshift"
    * Ports 8080/tcp, 8888/tcp will be load balanced by service "hello-openshift"
        * Other containers can access this service through the hostname "hello-openshift"
    * WARNING: Image "openshift/hello-openshift" runs as the 'root' user which may not 
    be permitted by your cluster administrator

--> Creating resources with label app=hello-openshift ...
imagestream "hello-openshift" created
deploymentconfig "hello-openshift" created
service "hello-openshift" created
--> Success
    Run 'oc status' to view your app.

执行oc get pod命令可以查看当前项目的容器的列表。和在Kubernetes一样,在Open-
Shift中,所有的Docker容器都是被“包裹”在一种称为Pod的容器内部。用户可以近似地认为Pod就是我们要运行的Docker容器本身。

[root@master ~]# oc get pod
NAME                      READY     STATUS    RESTARTS   AGE
hello-openshift-1-8gv1i   1/1       Running   0          19s
执行oc describe pod命令可以查看Pod的详细配置和状态信息。下例为Pod hello-

openshift-1-8gv1i的详细信息,包含容器的名称、状态、所处的命名空间(项目)、标签、IP地址等。

[root@master ~]# oc describe pod hello-openshift-1-8gv1i 
Name:           hello-openshift-1-8gv1i
Namespace:      hello-world-oc
Security Policy:    restricted
Node:           master.example.com/192.168.172.167
Start Time:     Sat, 17 Sep 2016 21:33:06 -0400
Labels:         app=hello-openshift
deployment=hello-openshift-1
deploymentconfig=hello-openshift
Status:         Running
IP:         172.17.0.7
Controllers:        ReplicationController/hello-openshift-1
Containers:
hello-openshift:
    Container ID:   docker://15263bbee6053b215b5dade08c839d5b07530b4cdf3b87776
……

在后续的介绍中,我们会使用oc命令进行大量的操作,相信你很快就会熟悉它的使用方法。

2.3.2 以集群管理员登录

在安装组件之前,我们需要以集群管理员的角色登录。在OpenShift中,默认的集群管理员是system:admin。system:admin这个用户拥有最高的权限。有意思的是,和其他用户不同,system:admin用户并没有密码!system:admin的登录依赖于证书密钥。以下是登录的方法。
1)拷贝登录配置文件。如果提示文件已存在,请选择覆盖。

[root@master ~]# mkdir -p ~/.kube
[root@master ~]# cp /opt/openshift/openshift.local.config/master/admin.kubeconfig 
~/.kube/config
[root@master ~]# cp: overwrite '/root/.kube/config'? y

2)通过oc login命令登录。

[root@masteropenshift]#  oc login -u system:admin
Logged into "https://192.168.172.167:8443" as "system:admin" using existing credentials.

You have access to the following projects and can switch between them with 'oc project <projectname>':

    * default
hello-world
hello-world-oc
kube-system
openshift
openshift-infra

Using project "default".

3)执行ocwhoami命令,即可见当前登录用户为system:admin。

[root@master ~]# ocwhoami
system:admin

可以尝试执行oc get node命令查看集群节点信息。只有集群管理员才有权限查看集群的节点信息。

[root@master ~]# oc get node
NAME                 STATUS    AGE
master.example.com   Ready     2h

可以看到我们的机器中有且只有一个节点master.example.com,它的状态是就绪(Ready)的。在实际的生产环境中,集群中将会有许多节点,这会是一个庞大的列表。

2.3.3 添加Router

首先,为集群添加一个Router组件。Router是OpenShift集群中一个重要的组件,它是外界访问集群内容器应用的入口。集群外部的请求都会到达Router,并由Router分发到具体的容器中。关于Router的详细信息我们会在后续的章节详细探讨。
切换到default项目。

[root@master ~]# oc project default

Router组件需要读取集群的信息,因此它关联一个系统账号Service Account,并为这个账号赋权。Service Account是OpenShift中专门供程序和组件使用的账号。OpenShift中有严格的权限和安全保障机制。不同的用户会关联到不同的安全上下文(Security Context Constraint,SCC)。同时,用户或组也会关联到不同的系统角色(Role)。

[root@master ~]# oadm policy add-scc-to-user privileged system:serviceaccount:default:router

执行oadm router命令创建Router实例。

[root@master ~]# oadm router router --replicas=1 --service-account=router
info: password for stats user admin has been set to EhEVZXbjAn
--> Creating router router ...
serviceaccount "router" created
clusterrolebinding "router-router-role" created
deploymentconfig "router" created
service "router" created
--> Success

oadm命令是oc命令的好搭档。oc命令更多地是面向一般用户,而oadm命令是面向集群管理员,可以进行集群的管理和配置。在上面的命令中,我们指定创建一个名为router的Router。
参数--replicas=1表明,我们只想创建一个实例。在实际的生产中,为了达到高可用的效果,可以创建多个Router实例实现负载均衡并防止单点失效。
执行片刻之后,通过oc get pod -n default命令可以查看Router容器的状态。

[root@master ~]# oc get pod -n default
NAME             READY     STATUS    RESTARTS   AGE
router-1-e95qa   1/1       Running   0          3m

上面的输出显示Router容器的状态是Running。如果此时检查实验主机上的端口监听状态,可以发现主机的端口80、443正在被Haproxy监听。

[root@master ~]# ss -ltn|egrep -w "80|443"
LISTEN     0      128          *:80                       *:*                  
LISTEN     0      128          *:443                      *:*

其实,从技术上来说,Router就是一个运行在容器中的Haproxy,当然这个Haproxy经过了特别的配置来实现特殊的功能。这些我们在后面再详细讨论。
至此,Router组件部署就已经完成了。

2.3.4 添加Registry

接下来部署集群内部的Docker Registry,即内部的Docker镜像仓库。从功能上说,Open-
Shift内部的镜像仓库和外部的企业镜像仓库或者DockerHub没有本质的区别。只是这个内部的镜像仓库会用来存放一些“特殊的”镜像,这些镜像是由一个叫Source to Image(S2I)的流程产生的。简单地说,S2I的工作是辅助将应用的源代码转换成可以部署的Docker镜像。关于S2I,后续再详细介绍。
1)切换到default项目。

[root@master ~]# oc project default

2)执行如下命令部署Registry。

[root@master ~]# oadm registry --config=/opt/openshift/openshift.local.config/master/
admin.kubeconfig --service-account=registry
--> Creating registry registry ...
serviceaccount "registry" created
clusterrolebinding "registry-registry-role" created
deploymentconfig "docker-registry" created
service "docker-registry" created
--> Success

3)稍候片刻,执行oc get pod便可见Registry容器处于运行状态了。

[root@master ~]# oc get pod
NAME                      READY     STATUS    RESTARTS   AGE
docker-registry-1-xm3un   1/1       Running   0          1m
router-1-e95qa            1/1       Running   0          9m

在本例中,因为我们部署的Registry没有启用HTTPS,所以需要修改Docker的配置让Docker以非HTTPS的方式连接到Registry。修改/etc/sysconfig/docker文件,为OPTIONS变量值追加--insecure-registry=https://172.30.0.0/16。修改后的变量值如下:

OPTIONS='--selinux-enabled --log-driver=journald --registry-mirror=https://docker.
mirrors.ustc.edu.cn --insecure-registry=172.30.0.0/16'

4)重启Docker服务,使修改的配置生效。

[root@master opt]# systemctl restart docker

至此,Registry组件部署完成。

2.3.5 添加Image Stream

Image Stream是一组镜像的集合。可以在一个Image Stream中定义一些名称及标签(tag),并定义这些名字及标签指向的具体镜像。值得指出的是,在OpenShift上部署容器应用,并不一定要用到Image Stream,直接指定镜像的地址也可以完成部署。使用Image Stream为的是方便地将一组相关联的镜像进行整合管理和使用。OpenShift Origin默认为用户定义了一系列开箱即用的Image Stream。
1)切换到openshift项目。

[root@master ~]# oc project openshift
Now using project "openshift" on server "https://192.168.172.167:8443".

2)通过以下命令可以导入Image Stream。

[root@master ~]# curl https://raw.githubusercontent.com/openshift/origin/v1.3.0/examples/
image-streams/image-streams-centos7.json|oc create -f - -n openshift
    % Total    % Received % Xferd  Average Speed   Time    TimeTime  Current
Dload  Upload   Total   Spent    Left  Speed
100 18953  100 18953    0     0   9354      0  0:00:02  0:00:02 --:--:--  9359
imagestream "ruby" created
imagestream "nodejs" created
imagestream "perl" created
imagestream "php" created
imagestream "python" created
imagestream "wildfly" created
imagestream "mysql" created
imagestream "mariadb" created
imagestream "postgresql" created
imagestream "mongodb" created
imagestream "jenkins" created

3)通过oc get is -n openshift命令,可以列出刚才导入的Image Stream对象。

[root@master ~]# oc get is -n openshift
NAME        DOCKER REPO                            TAGS                        UPDATED
jenkins     172.30.73.49:5000/openshift/jenkins    latest,1                    44 seconds ago
mariadb     172.30.73.49:5000/openshift/mariadb    latest,10.1                 About a minute ago
mongodb     172.30.73.49:5000/openshift/mongodb    latest,3.2,2.6 + 1 more...  53 seconds ago
mysql       172.30.73.49:5000/openshift/mysql      latest,5.6,5.5              About a minute ago
nodejs      172.30.73.49:5000/openshift/nodejs     0.10,latest,4               2 minutes ago
perl        172.30.73.49:5000/openshift/perl       latest,5.20,5.16            2 minutes ago
php         172.30.73.49:5000/openshift/php        5.5,latest,5.6              2 minutes ago
postgresql  172.30.73.49:5000/openshift/postgresql  9.4,9.2,latest + 1 more...  About a minute ago
python      172.30.73.49:5000/openshift/python     latest,3.5,3.4 + 2 more...  About a minute ago
ruby        172.30.73.49:5000/openshift/ruby       latest,2.3,2.2 + 1 more...  2 minutes ago
wildfly     172.30.73.49:5000/openshift/wildfly    10.0,9.0,8.1 + 1 more...    About a minute ago

此时,如果访问OpenShift的Web控制台,进入Hello World项目,单击项目Overview页面顶部的Add to project按钮,则会看见一系列可用的镜像被罗列在页面上,如图2-11所示。

2.3.6 添加Template

部署容器应用,可以很简单:直接通过docker run或oc new-app命令即可完成。但是有时候它也可以是一项很复杂的任务。在现实中,企业的应用往往不是孤立存在的,应用往往有多个模块;部署需要满足外部的依赖;用户需要根据实际的需求,结合环境的配置给部署传递不同的参数。为了满足用户对复杂应用部署的需求,提高应用部署的效率,OpenShift引入了应用部署模板(Template)的概念。通过Template,用户可以定义一个或多个需要部署的镜像,定义部署依赖的对象,定义可供用户输入配置的参数项。OpenShift默认提供了一些示例的Template供用户使用。后续用户可以根据实际的需求,定义满足企业需求的应用部署模板,构建企业内部的软件市场。

image

1)切换到openshift项目。

[root@master ~]# oc project openshift
Now using project "openshift" on server "https://192.168.172.167:8443".

2)下载并创建一个CakePHP示例应用的Template。通过这个Template,用户可以在服务目录单击相关的条目一键部署一个CakePHP应用和一个MySQL数据库。

[root@master ~]# oc create -f https://raw.githubusercontent.com/openshift/origin/
v1.3.0/examples/quickstarts/cakephp-mysql.json -n openshift
template "cakephp-mysql-example" created

3)创建完毕后,可以通过oc get template -n openshift命令查看导入的模板信息。

[root@master ~]# oc get template -n openshift
NAME                   DESCRIPTION                                           PARAMETERS   OBJECTS
cakephp-mysql-example  An example CakePHP application with a MySQL database  19 (4 blank) 7

如果要查看模板的详细内容,可以通过oc get template cakephp-mysql-example
-o json -n openshift命令查看。-o参数指定了命令以json格式输出返回值。

oc get template cakephp-mysql-example -o json -n openshift

刷新OpenShift Web控制台的服务目录界面,在过滤器中输入cake,即可看到刚导入的应用模板,如图2-12所示。

image

在OpenShift Origin的GitHub仓库中还有许多预定义好的Template示例。你可以按需下载,并通过oc create -f命令导入系统中。
OpenShift Origin示例:https://github.com/openshift/origin/tree/v1.3.0/examples
请执行下面的命令导入wildfly-basic-s2i模板,这在后面的章节会使用到。

oc create -f https://raw.githubusercontent.com/nichochen/openshift-book-source/master/template/wildfly-basic-s2i.template.json  -n openshift

细心的读者也许会发现之前创建Router和Registry是在default项目中,而创建Image Stream是在openshift项目中。openshift项目是一个特殊的项目,在这个项目下创建的所有Image Stream及Template对集群内所有的用户和项目可见。如果Image Stream及Template在其他项目创建,则只能在创建这些对象的项目内可见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值