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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

本节书摘来自华章出版社《开源容器云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在其他项目创建,则只能在创建这些对象的项目内可见。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
12天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
27天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
77 7
|
26天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
59 6
|
6月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
6月前
|
Kubernetes Cloud Native 开发者
构建高效的云原生应用:Docker与Kubernetes的完美搭档
【5月更文挑战第29天】 在现代软件开发领域,"云原生"这一术语已经成为高效、可扩展和弹性的代名词。本文将深入探讨如何通过Docker容器化技术和Kubernetes集群管理工具实现云原生应用的构建和管理。我们将剖析Docker的核心原理,揭示其轻量级和易于部署的特点,并进一步探索Kubernetes如何为这些容器提供编排,保证应用的高可用性与自动扩缩容。文章不仅讨论了二者的技术细节,还提供了实践案例,帮助开发者理解并运用这些技术构建和维护自己的云原生应用。
|
2月前
|
Kubernetes Docker 微服务
构建高效的微服务架构:基于Docker和Kubernetes的最佳实践
在现代软件开发中,微服务架构因其灵活性和可扩展性而受到广泛青睐。本文探讨了如何利用Docker和Kubernetes来构建高效的微服务架构。我们将深入分析Docker容器的优势、Kubernetes的编排能力,以及它们如何结合实现高可用性、自动扩展和持续部署。通过具体的最佳实践和实际案例,读者将能够理解如何优化微服务的管理和部署过程,从而提高开发效率和系统稳定性。
|
2月前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
138 2
|
3月前
|
存储 Kubernetes 调度
通过重新构建Kubernetes来实现更具弹性的容器编排系统
通过重新构建Kubernetes来实现更具弹性的容器编排系统
62 8
|
3月前
|
Kubernetes Cloud Native 应用服务中间件
云原生之旅:构建你的首个Kubernetes集群
【8月更文挑战第31天】在这个数字化迅速演进的时代,云原生技术如同星辰般璀璨。它不仅是企业数字化转型的引擎,更是开发者们探索创新的乐园。本文将带你开启一场云原生的奇妙旅程,从零开始,一步步构建属于你自己的Kubernetes集群。想象一下,当你的应用在云端自如地伸缩、滚动更新时,那份成就感和掌控感,是不是已经让你跃跃欲试了呢?那就让我们开始吧!
|
3月前
|
敏捷开发 Kubernetes 测试技术
阿里云云效产品使用合集之如何在K8s集群上进行构建
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。

相关产品

  • 容器服务Kubernetes版