1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

在当今快速发展的技术环境中,高效、可靠的软件部署流程对于企业来说至关重要。为了满足业务需求,我们决定采用OpenShift平台来实现应用的自动化构建、部署和管理。通过结合GitLab代码仓库和OpenShift的S2I(Source-to-Image)功能,我们能够实现从代码提交到应用上线的无缝衔接,同时确保开发和运维团队能够高效协作。

本文将详细介绍如何在内部环境中搭建代码仓库和镜像仓库,如何利用OpenShift的S2I功能构建应用镜像,以及如何将应用部署到业务服务器并提供HTTPS服务。此外,我们还将探讨如何进行业务版本更新,确保应用能够快速响应业务需求的变化。

通过本文的步骤,你将能够:

  1. 搭建一个完整的内部开发和部署环境,包括代码仓库和镜像仓库。

  2. 利用OpenShift的S2I功能,实现代码到镜像的自动化构建。

  3. 将应用部署到业务服务器,并通过HTTPS提供安全的访问服务。

  4. 快速进行业务版本更新,确保应用始终处于最新状态。

本次我们要完成的是:

  1. 从内部的GitLab代码仓库拉取代码

  2. 通过OpenShift 的S2I功能,构建镜像

  3. 推送至我们的内部镜像仓库

  4. 从内部镜像仓库拉取到业务服务器

  5. 生成我们的业务

准备代码仓库

先根据代码仓库构建的方法,创建一个公开的php的代码仓库,然后把仓库克隆到本地

安装Git客户端

1
yum install git -y

克隆仓库到本地

1
2
git clone http://content.cluster1.xiaohui.cn:5000/root/php.git
cd php

表明自己的身份

1
2
git config --global user.name "Xiaohui Li"
git config --global user.email "cnlxh@xiaohui.cn"

创建index.php

此处我们模拟的是php业务,我们就用一个index.php来代码业务本身,这个页面如果上线,会生成一个只有hello lixiaohui的文字页面

1
2
3
4
5
6
7
cat > index.php <<EOF
<?php

echo "Hello lixiaohui\n";

?>
EOF

提交代码到仓库

在push时,请输入自己的账号密码

1
2
3
git add .
git commit -m 'push code'
git push

部署PHP应用

1
oc new-app http://content.cluster1.xiaohui.cn:5000/root/php.git --name=phptest

查询部署过程中创建的资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@content php]# oc get buildconfigs
NAME TYPE FROM LATEST
phptest Source Git 1
[root@content php]# oc get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
phptest 1/1 1 1 9m19s
[root@content php]# oc get pod
NAME READY STATUS RESTARTS AGE
phptest-1-build 0/1 Completed 0 9m21s
phptest-765ccc6ddf-gcxrd 1/1 Running 0 7m15s
[root@content php]# oc get imagestream
NAME IMAGE REPOSITORY TAGS UPDATED
phptest registry.apps.cluster1.xiaohui.cn/default/phptest latest 7 minutes ago
[root@content php]# oc get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 192.168.0.1 <none> 443/TCP 19h
openshift ExternalName <none> kubernetes.default.svc.cluster.local <none> 19h
phptest ClusterIP 192.168.197.192 <none> 8080/TCP,8443/TCP 9m28s

查询自动化构建过程

执行这一步,可以详细看到发生了这么几件事:

  1. 从代码仓库clone代码

  2. 检测到我们的代码类型为php,并pull了php的镜像

  3. 生成了dockerfile并构建了容器镜像

  4. 将容器镜像推送到内部仓库

  5. 通过buildconfig部署了应用

1
oc logs -f buildconfig/phptest

对外界开放PHP应用

1
oc expose service phptest --hostname=lixiaohui.apps.cluster1.xiaohui.cn --name phptest
1
2
3
[root@content php]# oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
phptest lixiaohui.apps.cluster1.xiaohui.cn phptest 8080-tcp None

测试PHP应用的访问

发现我们通过自定义的域名已经成功访问到了我们的应用

1
2
[root@content php]# curl lixiaohui.apps.cluster1.xiaohui.cn
Hello lixiaohui

提供HTTPS服务

请参阅根证书生成

生成业务证书

1
2
3
4
5
openssl genrsa -out /etc/pki/tls/private/phptest.key 4096
openssl req -sha512 -new \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Company/OU=SH/CN=xiaohui.cn" \
-key /etc/pki/tls/private/phptest.key \
-out phptest.csr

生成openssl cnf扩展文件

1
2
3
4
5
6
7
8
9
10
11
12
cat > certs.cnf << EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = phptesthttps.apps.cluster1.xiaohui.cn
EOF

签发证书

1
2
3
4
5
openssl x509 -req -in phptest.csr \
-CA /etc/pki/ca-trust/source/anchors/xiaohuiroot.crt \
-CAkey /etc/pki/tls/private/xiaohuiroot.key -CAcreateserial \
-out /etc/pki/tls/certs/phptest.crt \
-days 3650 -extensions v3_req -extfile certs.cnf

提供HTTPS服务

1
2
3
4
5
6
7
8
9
[root@content ~]# oc create route edge --service=phptest --cert=/etc/pki/tls/certs/phptest.crt --key=/etc/pki/tls/private/phptest.key --hostname=phptesthttps.apps.cluster1.xiaohui.cn phptesthttps
route.route.openshift.io/phptesthttps created
[root@content ~]# oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
phptest lixiaohui.apps.cluster1.xiaohui.cn phptest 8080-tcp None
phptesthttps phptesthttps.apps.cluster1.xiaohui.cn phptest 8080-tcp edge None
[root@content ~]# curl -k https://phptesthttps.apps.cluster1.xiaohui.cn
Hello lixiaohui version 2

业务版本更新

这里测试的是程序员又更新了代码,看看OpenShift重新构建业务的流程

更新业务代码

注意切换到你仓库中,我们是针对原有的index.php更新了它的内容

1
2
3
4
5
6
7
cat > index.php <<EOF
<?php

echo "Hello lixiaohui version 2\n";

?>
EOF

将新代码推送到仓库

1
2
3
git add .
git commit -m 'push code version 2'
git push

触发应用重新构建

1
oc start-build phptest

查询重新构建过程

我们发现以下几件事:

  1. buildconfig版本变成了2

  2. deployment 有一个短暂的2/1

  3. pod 出现了一个phptest-2-build,并保留了第一个版本,以备回退

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@content php]# oc get pod
NAME READY STATUS RESTARTS AGE
phptest-1-build 0/1 Completed 0 16m
phptest-2-build 1/1 Running 0 60s
phptest-765ccc6ddf-gcxrd 1/1 Running 0 14m
[root@content php]# oc get buildconfigs
NAME TYPE FROM LATEST
phptest Source Git 2
[root@content php]# oc get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
phptest 2/1 1 2 17m
[root@content php]# oc get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
phptest 1/1 1 1 19m

[root@content php]# oc get pod
NAME READY STATUS RESTARTS AGE
phptest-1-build 0/1 Completed 0 17m
phptest-2-build 0/1 Completed 0 94s
phptest-6b6c774b5b-g4g7w 1/1 Running 0 13s

访问重新构建后的应用

1
2
[root@content php]# curl lixiaohui.apps.cluster1.xiaohui.cn
Hello lixiaohui version 2