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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 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代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
2月前
|
Kubernetes Ubuntu Windows
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
【Azure K8S | AKS】分享从AKS集群的Node中查看日志的方法(/var/log)
|
2月前
|
存储 Kubernetes Go
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
【Azure K8S | AKS】在AKS集群中创建 PVC(PersistentVolumeClaim)和 PV(PersistentVolume) 示例
|
3天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
|
1月前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
180 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
1月前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
52 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
1月前
|
存储 Kubernetes 测试技术
k8s使用pvc,pv,sc关联ceph集群
文章介绍了如何在Kubernetes中使用PersistentVolumeClaim (PVC)、PersistentVolume (PV) 和StorageClass (SC) 来关联Ceph集群,包括创建Ceph镜像、配置访问密钥、删除默认存储类、编写和应用资源清单、创建资源以及进行访问测试的步骤。同时,还提供了如何使用RBD动态存储类来关联Ceph集群的指南。
48 7
|
1月前
|
存储 Kubernetes 数据安全/隐私保护
k8s对接ceph集群的分布式文件系统CephFS
文章介绍了如何在Kubernetes集群中使用CephFS作为持久化存储,包括通过secretFile和secretRef两种方式进行认证和配置。
32 5
|
1月前
|
Kubernetes 负载均衡 应用服务中间件
kubeadm快速构建K8S1.28.1高可用集群
关于如何使用kubeadm快速构建Kubernetes 1.28.1高可用集群的详细教程。
49 2
|
2月前
|
运维 Kubernetes Cloud Native
云原生之旅:Kubernetes 集群的搭建与实践Python 编程入门:从零基础到编写实用脚本
【8月更文挑战第30天】在数字化转型的大潮中,云原生技术以其弹性、可扩展性及高效运维能力成为企业IT架构升级的关键。本文将通过实际操作演示如何在本地环境搭建一个简易的Kubernetes集群,带你领略云原生的魅力所在。从集群规划到服务部署,每一步都是对云原生理念的深刻理解和应用。让我们共同探索,如何通过Kubernetes集群的搭建和运维,提升业务灵活性和创新能力。
|
1月前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
62 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇

相关产品

  • 容器服务Kubernetes版
  • 下一篇
    无影云桌面