22、OpenShift 应用部署与模板使用指南

OpenShift 应用部署与模板使用指南

1. OpenShift 简单应用部署

1.1 验证镜像使用

首先,要确保使用了正确的镜像。可以使用以下命令来验证:

$ oc describe pod httpd-1-n7st4 | grep Image:
    Image: centos/httpd-24-centos7@sha256:6da9085c5e7963efaae3929895b9730d7e76e937a7a0109a23015622f3e7156b

1.2 暴露服务

为了使应用程序可以从外部访问,需要暴露服务:

$ oc expose svc httpd
route "httpd" exposed
$ curl -s http://httpd-simpleappication.127.0.0.1.nip.io | head -n 4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
  <head>

1.3 高级部署

oc new-app 命令带有许多参数,允许根据需求修改部署过程。可以使用 oc new-app --help 查看高级选项:

$ oc new-app --help
Create a new application by specifying source code, templates, and/or
images

使用示例:
- 列出所有可用于创建应用的本地模板和镜像流:

oc new-app --list
  • 根据当前 Git 仓库中的源代码(具有公共远程仓库)和 Docker 镜像创建应用:
oc new-app . --docker-image=repo/langimage

1.4 部署 MariaDB

1.4.1 删除先前创建的对象
$ oc delete all --all
1.4.2 创建 MariaDB 容器

创建一个数据库容器,允许名为 openshift 的数据库用户连接到名为 openshift 的数据库,使用 openshift 作为数据库密码:

$ oc new-app -e MYSQL_USER=openshift -e MYSQL_PASSWORD=openshift \
-e MYSQL_DATABASE=openshift mariadb
1.4.3 验证 MariaDB 是否运行
$ oc get all
NAME REVISION DESIRED CURRENT TRIGGERED BY
deploymentconfigs/mariadb 1 1 1 config,image(mariadb:10.1)
NAME READY STATUS RESTARTS AGE
po/mariadb-1-54h6x 1/1 Running 0 2m
NAME DESIRED CURRENT READY AGE
rc/mariadb-1 1 1 1 2m
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/mariadb 172.30.233.119 <none> 3306/TCP 2m
1.4.4 登录容器并验证数据库
$ oc exec -it mariadb-1-54h6x /bin/bash
bash-4.2$
$ mysql -uopenshift -popenshift -h127.0.0.1 openshift
MariaDB [openshift]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| openshift |
| test |
+--------------------+
3 rows in set (0.00 sec)
1.4.5 清理实验环境
$ oc delete all --all
deploymentconfig "mariadb" deleted
imagestream "mariadb" deleted
pod "mariadb-1-9qcsp" deleted
service "mariadb" deleted
$ oc delete project simpleappication
project "simpleappication" deleted
$ oc project myproject
Now using project "myproject" on server "https://localhost:8443".

1.5 相关问题解答

问题 答案
以下哪个 OpenShift 实体不会由 oc new-app 自动创建? Route
为了在最小配置下使应用程序可从外部访问,应创建以下哪些实体(选择三个)? Pod、Service、Route
哪个命令可以创建具有自定义 URL myservice.example.com 的路由? oc expose svc httpd --hostname myservice.example.com
哪些命令可以显示所有 OpenShift 路由(选择两个)? oc get all oc get route

2. OpenShift 模板使用

2.1 技术要求

本章对环境没有严格限制,支持任何 OpenShift 安装和开发环境,如 MinitShift、 oc cluster up 或基于 Ansible 的标准生产就绪部署。以下是使用 Vagrantfile 部署实验环境的示例:

$ cat Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define "openshift" do |conf|
    conf.vm.box = "centos/7"
    conf.vm.network "private_network", ip: "172.24.0.11"
    conf.vm.hostname = 'openshift.example.com'
    conf.vm.network "forwarded_port", guest: 80, host: 1080
    conf.vm.network "forwarded_port", guest: 443, host: 9443
    conf.vm.network "forwarded_port", guest: 8080, host: 8080
    conf.vm.network "forwarded_port", guest: 8443, host: 8443
    conf.vm.provider "virtualbox" do |v|
      v.memory = 4096
      v.cpus = 2
    end
    conf.vm.provision "shell", inline: $lab_main
  end
end
$lab_main = <<SCRIPT
cat <<EOF >> /etc/hosts
172.24.0.11 openshift.example.com openshift
172.24.0.12 storage.example.com storage nfs
EOF
systemctl disable firewalld
systemctl stop firewalld
yum update -y
yum install -y epel-release
yum install -y docker
cat << EOF >/etc/docker/daemon.json
{
   "insecure-registries": [
     "172.30.0.0/16"
   ]
}
EOF
systemctl restart docker
systemctl enable docker
yum -y install centos-release-openshift-origin39
yum -y install origin-clients
oc cluster up
SCRIPT

部署环境:

$ vagrant up

连接到虚拟机:

$ vagrant ssh
$ sudo -i

以开发者用户登录:

# oc login -u developer
Server [https://localhost: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://localhost:8443 (openshift)
Username: developer
Password: <ANY PASSWORD>
Login successful.
You have one project on this server: "myproject"
Using project "myproject".
Welcome! See 'oc help' to get started.

2.2 OpenShift 模板概述

OpenShift 模板是一组可以参数化的 API 资源,经过处理后可以生成一系列供 OpenShift 创建的对象。模板可以用于创建任何所需的 OpenShift 对象,还可以定义一组标签应用到模板中定义的每个对象。可以使用 CLI 或 Web 控制台应用模板。例如,一个模板可能包含两个 Pod(一个应用程序和一个数据库)、一个服务和一个路由。模板开发完成后可以重复使用。

2.3 模板语法

模板可以从原始的 YAML 或 JSON 定义创建。示例如下:

# cat mytemplate.yaml
apiVersion: v1
kind: Template
metadata:
  name: template1
objects:
- apiVersion: v1
  kind: Pod
  metadata:
    name: app1
  spec:
    containers:
    - env:
      - name: SHOW_DATA
        value: ${SHOW_DATA}
      image: example/appimage
      name: app1
      ports:
      - containerPort: 8080
        protocol: TCP
parameters:
- description: Myapp configuration data
  name: SHOW_DATA
  required: true
labels:
  mylabel: app1

参数可以有默认值,也可以根据特定模式生成值:

parameters:
- description: Myapp configuration data
  name: SHOW_DATA
  required: true
  value: Example value

parameters:
  - description: Password used for Redis authentication
    from: '[A-Z0-9]{8}'
    generate: expression
    name: REDIS_PASSWORD

2.4 添加模板

使用 oc create 命令将模板添加到 OpenShift:

# oc create -f mytemplate.yaml
template "template1" created
# oc get template
NAME        DESCRIPTION    PARAMETERS    OBJECTS
template1                  1 (1 blank)   1

若要在 openshift 租户中创建模板,需要以 system:admin 用户登录:

# oc login -u system:admin
# oc create -f mytemplate.json -n openshift
template "template1" created
# oc get template -n openshift|grep temp
template1

2.5 显示模板参数

有两种方法列出模板的所有参数:
- 使用 oc process --parameters 命令:

# oc process --parameters -n openshift mariadb-persistent
NAME DESCRIPTION GENERATOR VALUE
...
VOLUME_CAPACITY Volume space available for data, e.g. 512Mi, 2Gi. 1Gi
  • 查看模板定义中的 parameters 部分:
# oc describe template template1
Name:        template1
Namespace:    myproject
...
Parameters:
    Name:        SHOW_DATA
    Description:    Myapp configuration data
    Required:        true
    Value:        <none>
...

2.6 处理模板

使用 oc new-app 命令从预定义模板部署应用程序的示例:

# oc new-app jenkins-persistent -p JENKINS_SERVICE_NAME=myjenkins
--> Deploying template "openshift/jenkins-persistent" to project myproject
...
--> Creating resources ...
    route "myjenkins" created
    deploymentconfig "myjenkins" created
    serviceaccount "myjenkins" created
    rolebinding "myjenkins_edit" created
    service "jenkins-jnlp" created
    service "myjenkins" created
--> Success
...
    Access your application via route 'myjenkins-myproject.127.0.0.1.nip.io'
    Run 'oc status' to view your app

查看创建的对象:

# oc get all
NAME                         REVISION  DESIRED  CURRENT  TRIGGERED BY
deploymentconfigs/myjenkins  1         1         1
config,image(jenkins:latest)
NAME             HOST/PORT               PATH      SERVICES PORT
TERMINATION
WILDCARD
routes/myjenkins myjenkins-templates.example.com myjenkins <all>
edge/Redirect
None
NAME                      READY     STATUS    RESTARTS  AGE
po/myjenkins-1-h2mxx      1/1       Running   0         1m
NAME                      DESIRED   CURRENT   READY     AGE
rc/myjenkins-1            1         1         1         1m
NAME                      CLUSTER-IP     EXTERNAL-IP  PORT(S)    AGE
svc/jenkins-jnlp          172.30.33.180  <none>       50000/TCP  1m
svc/myjenkins             172.30.107.99  <none>       80/TCP     1m

清理项目:

# oc delete all --all
deploymentconfig "myjenkins" deleted
route "myjenkins" deleted
pod "myjenkins-1-zg4km" deleted
service "jenkins-jnlp" deleted
service "myjenkins" deleted

2.7 创建自定义模板

2.7.1 开发 YAML/JSON 模板定义

如果熟悉模板布局,可以使用标准的 YAML 或 JSON 文件从头开始开发模板。 oc explain 命令可以帮助探索所有 OpenShift API 对象的语法:

# oc explain
You must specify the type of resource to explain. Valid resource types
include:
    * all
    * buildconfigs (aka 'bc')
    * builds
    * certificatesigningrequests (aka 'csr')
    * clusterrolebindings
    * clusterroles
...
    error: Required resource not specified.
See 'oc explain -h' for help and examples.

# oc explain svc
...
FIELDS:
   metadata    <Object>
     Standard object's metadata. More info:
https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
...

# oc explain svc.metadata
RESOURCE: metadata <Object>
 ...
FIELDS:
 ...
   uid    <string>
     UID is the unique in time and space value for this object. It is
typically generated by the server on successful creation of a resource and
is not allowed to change on PUT operations. Populated by the system. Read-
only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids

$ oc explain svc.metadata.uid
FIELD: uid <string>
DESCRIPTION:
     UID is the unique in time and space value for this object. It is
typically generated by the server on successful creation of a resource and
is not allowed to change on PUT operations. Populated by the system. Read-
only. More info: http://kubernetes.io/docs/user-guide/identifiers#uids
2.7.2 导出现有资源为模板

使用 oc export 命令将现有 OpenShift 资源导出为模板。首先使用 oc new-app 命令创建一个运行中的应用程序:

$ oc new-app httpd
--> Found image 9fd201d (10 days old) in image stream "openshift/httpd"
under tag "2.4" for "httpd"
...
--> Success
    Application is not exposed. You can expose services to the outside
world by executing one or more of the commands below:
     'oc expose svc/httpd'
    Run 'oc status' to view your app.
$ oc get all
NAME             READY     STATUS    RESTARTS   AGE
httpd-1-dcm2d    1/1       Running   0          2s
httpd-1-deploy   1/1       Running   0          3s

通过以上步骤,我们可以在 OpenShift 中完成简单应用的部署,以及使用模板来部署更复杂的多组件应用程序。掌握这些技能可以帮助我们更高效地管理和部署应用。

3. 模板使用流程总结

为了更清晰地展示使用 OpenShift 模板部署应用的流程,我们可以用 mermaid 流程图来表示:

graph LR
    A[准备环境] --> B[创建或获取模板]
    B --> C{模板是否在本地}
    C -- 是 --> D[添加模板到 OpenShift]
    C -- 否 --> E[使用已有模板]
    D --> F[显示模板参数]
    E --> F
    F --> G[处理模板并部署应用]
    G --> H[验证应用部署]
    H --> I[清理环境(可选)]

3.1 流程详细说明

  • 准备环境 :根据前面提到的技术要求,使用 Vagrantfile 部署实验环境,包括安装必要的软件和启动 OpenShift 集群。
  • 创建或获取模板 :可以自己开发 YAML/JSON 模板定义,也可以使用 OpenShift 自带的模板或从社区获取。
  • 添加模板到 OpenShift :如果模板是本地的,使用 oc create 命令将其添加到 OpenShift。
  • 显示模板参数 :使用 oc process --parameters 命令或查看模板定义中的 parameters 部分,了解模板需要的参数。
  • 处理模板并部署应用 :使用 oc new-app 命令,传入模板名称和必要的参数,部署应用。
  • 验证应用部署 :使用 oc get all 等命令查看创建的对象,确保应用正常运行。
  • 清理环境 :如果实验结束,可以使用 oc delete all --all 等命令清理项目。

3.2 不同场景下的模板使用

3.2.1 简单应用部署场景

在简单应用部署场景中,我们可以直接使用 oc new-app 命令结合 Docker 镜像来部署应用。例如部署一个 httpd 应用:

$ oc new-app httpd

然后根据需要暴露服务:

$ oc expose svc/httpd
3.2.2 复杂多组件应用部署场景

对于复杂的多组件应用,如包含数据库和应用服务器的应用,我们可以使用模板来一次性部署所有组件。例如部署一个带有持久化存储的 MariaDB 数据库:

# oc new-app mariadb-persistent -p VOLUME_CAPACITY=2Gi

4. 常见问题及解决方法

4.1 模板参数问题

  • 问题描述 :在处理模板时,可能会遇到参数缺失或参数值不符合要求的问题。
  • 解决方法 :使用 oc process --parameters 命令查看模板需要的参数,确保传入正确的参数值。例如,如果模板需要 MYSQL_USER 参数,我们可以这样部署:
# oc new-app mariadb -p MYSQL_USER=myuser

4.2 网络访问问题

  • 问题描述 :应用部署后,可能无法从外部访问。
  • 解决方法 :确保创建了服务和路由。例如,对于一个 httpd 应用,使用以下命令暴露服务和创建路由:
$ oc expose svc/httpd
$ oc expose svc/httpd --hostname myservice.example.com

4.3 资源创建失败问题

  • 问题描述 :在使用 oc new-app 命令部署应用时,可能会出现资源创建失败的情况。
  • 解决方法 :查看命令输出的错误信息,通常错误信息会提示具体的问题。例如,如果是权限问题,可以检查当前用户是否有足够的权限来创建资源。

5. 总结

通过本文,我们详细介绍了在 OpenShift 中部署简单应用和使用模板部署多组件应用的方法。主要内容包括:
- 简单应用部署 :验证镜像使用、暴露服务、使用 oc new-app 命令部署应用,以及部署和验证 MariaDB 数据库。
- 模板使用 :模板概述、语法、添加模板、显示模板参数、处理模板和创建自定义模板。
- 流程总结 :用流程图展示了使用模板部署应用的流程,并详细说明了每个步骤。
- 常见问题解决 :针对模板参数、网络访问和资源创建失败等常见问题,提供了解决方法。

掌握这些知识和技能,可以帮助我们更高效地在 OpenShift 平台上部署和管理应用,满足不同场景下的应用部署需求。希望本文能对大家在 OpenShift 应用部署方面有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值