《开源容器云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在其他项目创建,则只能在创建这些对象的项目内可见。

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
阿里云与企业共筑容器供应链安全
172141 127
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
随着云计算和DevOps的兴起,容器技术和自动化在软件开发中扮演着愈发重要的角色,但也带来了新的安全挑战。阿里云针对这些挑战,组织了一场关于云上安全的深度访谈,邀请了内部专家穆寰、匡大虎和黄竹刚,深入探讨了容器安全与软件供应链安全的关系,分析了当前的安全隐患及应对策略,并介绍了阿里云提供的安全解决方案,包括容器镜像服务ACR、容器服务ACK、网格服务ASM等,旨在帮助企业构建涵盖整个软件开发生命周期的安全防护体系。通过加强基础设施安全性、技术创新以及倡导协同安全理念,阿里云致力于与客户共同建设更加安全可靠的软件供应链环境。
150728 32
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
对话|企业如何构建更完善的容器供应链安全防护体系
对话|企业如何构建更完善的容器供应链安全防护体系
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
1204 16
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
数据采集 人工智能 算法
建筑矿山设备工厂如何应用MyEMS开源能源云平台
建筑矿山设备工厂是一家全球领先的采矿和基础设施技术公司,1993年在南京设立首家中国工厂,专注于研发与生产露天凿岩设备、地下采矿设备等。2014年将中国区总部迁至南京,进一步深化本土化战略。MyEMS开源能源管理系统基于ISO 50001标准,提供电、水、气等多能源介质的采集、分析与优化功能,助力工厂实现能耗透明化、碳排放管理及能效提升。项目成果显著,通过AI驱动的能效模型和预测性维护,实现年度电费节省超50万元,碳排放强度下降12%。未来计划进一步整合微电网与智能化技术,推动绿色智能制造转型。
279 0
|
供应链 监控 安全
对话|企业如何构建更完善的容器供应链安全防护体系
本期节目围绕软件供应链安全、容器安全的主要挑战以及阿里云如何帮助用户等维度展开了深入的讨论。
|
Kubernetes jenkins Devops
基于Jenkins和k8s构建企业级DevOps容器云平台
基于Jenkins和k8s构建企业级DevOps容器云平台
|
Kubernetes jenkins Linux
两大容器管理平台,Kubernetes与OpenShift有什么区别?
两大容器管理平台,Kubernetes与OpenShift有什么区别?
|
Ubuntu 网络安全 容器
KubeSphere 是一个开源的容器平台,提供丰富的功能和便捷的操作界面,适用于企业容器化部署和管理
KubeSphere 是一个开源的容器平台,提供丰富的功能和便捷的操作界面,适用于企业容器化部署和管理。本文详细介绍了如何在 Ubuntu 22.04 上安装 KubeSphere,包括系统要求、安装依赖项、设置防火墙、下载安装脚本、选择安装选项、验证安装结果等步骤,并提供了常见问题的解决方法。希望本文能为读者提供实用的参考和帮助。
523 3
|
Linux pouch 容器
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
关于如何在CentOS 7.6操作系统上安装和使用阿里巴巴开源的Pouch容器管理工具的实战教程。
487 2
CentOS7部署阿里巴巴开源的pouch容器管理工具实战

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多